P/Invoke之路1--c#调用C++dll组件

 

永远要保持一个积极进取的心态

 

C++dll组件创建及c#的调用

  • c++组件创建
  • c#调用c++组件

 

 

 下载:源代码

 

创建c++ dll组件

 

1.创建一个c++动态连接库

 

 

2.选择A DLL that exports some symbols

3.自动生成文件

 

4.StdAfx.h

它的作用就是把系统性类库先编译,生成一个.pch的文件,下次生成时则跳过stdafx的编译,使用pch编译结果,当stdafx文件修改了,才会重新生成pch文件,为了减小每次生成时间

 

5.mydll.cpp

入口函数
 

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{
    switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
    }
    return TRUE;
}

 

DLL_PROCESS_ATTACH,DLL_PROCESS_DETACH以进程的方式调用的进入和释放

DLL_THREAD_ATTACH,DLL_THREAD_DETACH以线程的方式调用的进入和释放

 

6.mydll.h

 

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
 
// This class is exported from the mydll.dll
class MYDLL_API CMydll {
public:
CMydll(void);
// TODO: add your methods here.
};
 
extern "C" MYDLL_API int nMydll;
 
extern "C" MYDLL_API int fnMydll(int a,int b);

__declspec(dllexport) 导出函数,在需要导出的函数加上这个标识

__declspec(dllimport) 调用函数

extern "C",以c的方式导出函数,不加也可以,将会以c++的特殊规则导出函数名

MYDLL_EXPORTS,在配置里有定义,可以取消,然后自定义控制生成规则,具体位置在

 

 

 

7.查看dll函数导出说明

 

打开depends

导出函数说明

Funtion(函数名):加了 extern "C"的fnMydll函数,和没加extern "C"的构造函数

EntryPoint(入口地址):平台互调用是通过地址来进来的

8.生成的各文件说明

.APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度。资源辅助文件。

.BMP:位图资源文件。

.BSC:浏览信息文件,由浏览信息维护工具(BSCMAKE)从原始浏览信息文件(.SBR)中生成,BSC文件可以用来在源代码编辑窗口中进行快速定位。用于浏览项目信息的,如果用source brower的话就必须有这个文件。可以在project options里去掉Generate Browse Info File,这样可以加快编译进度。

.C:用C语言编写的源代码文件。

.CLW:ClassWizard生成的用来存放类信息的文件。classwizard信息文件,ini文件的格式。

.CNT:用来定义帮助文件中“Contents”的结构。

.CPP或.CXX:用C++语言编写的源代码文件。

.CUR:光标资源文件。

.DEF:模块定义文件,供生成动态链接库时使用。

.DLG:定义对话框资源的独立文件。这种文件对于VC工程来说并非必需,因为VC一般把对话框资源放在.RC资源定义文件中。

.DSP:VC开发环境生成的工程文件,VC4及以前版本使用MAK文件来定义工程。项目文件,文本格式。

.DSW:VC开发环境生成的WorkSpace文件,用来把多个工程组织到一个WorkSpace中。工作区文件,与.dsp差不多。

.EXP:由LIB工具从DEF文件生成的输出文件,其中包含了函数和数据项目的输出信息,LINK工具将使用EXP文件来创建动态链接库。只有在编译DLL时才会生成,记录了DLL文件中的一些信息。

.H、.HPP或.HXX:用C/C++语言编写的头文件,通常用来定义数据类型,声明变量、函数、结构和类。

.HLP:Windows帮助文件。

.HM:在Help工程中,该文件定义了帮助文件与对话框、菜单或其它资源之间ID值的对应关系。

.HPJ:由Help Workshop生成的Help工程文件,用来控制Help文件的生成过程。

.HPG,生成帮助的文件的工程。

.ICO:图标资源文件。

.ILK:连接过程中生成的一种中间文件,只供LINK工具使用。

.INI:配置文件。

.LIB:库文件,LINK工具将使用它来连接各种输入库,以便最终生成EXE文件。

.LIC:用户许可证书文件,使用某些ActiveX控件时需要该文件。

.MAK:即MAKE文件,VC4及以前版本使用的工程文件,用来指定如何建立一个工程,VC6把MAK文件转换成DSP文件来处理。

.MAP:由LINK工具生成的一种文本文件,其中包含有被连接的程序的某些信息,例如程序中的组信息和公共符号信息等。执行文件的映像信息记录文件。

.MDP:旧版本的项目文件,相当于.dsp

.NCB:NCB是“No Compile Browser”的缩写,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成。无编译浏览文件。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。

.OBJ:由编译器或汇编工具生成的目标文件,是模块的二进制中间文件。

.ODL:用对象描述语言编写的源代码文件,VC用它来生成TLB文件。

.OLB:带有类型库资源的一种特殊的动态链接库,也叫对象库文件。

.OPT:VC开发环境自动生成的用来存放WorkSpace中各种选项的文件。工程关于开发环境的参数文件。如工具条位置信息等。

.PBI、.PBO和.PBT:由VC的性能分析工具PROFILE生成并使用的三种文件。

.PCH:预编译头文件,比较大,由编译器在建立工程时自动生成,其中存放有工程中已经编译的部分代码,在以后建立工程时不再重新编译这些代码,以便加快整个编译过程的速度。

.PDB:程序数据库文件,在建立工程时自动生成,其中存放程序的各种信息,用来加快调试过程的速度。记录了程序有关的一些数据和调试信息。

.PLG:编译信息文件,编译时的error和warning信息文件。

.RC:资源定义文件。

.RC2:资源定义文件,供一些特殊情况下使用。

.REG:注册表信息文件。

.RES:二进制资源文件,资源编译器编译资源定义文件后即生成RES文件。

.RTF:Rich Text Format(丰富文本格式)文档,可由Word或写字板来创建,常被用来生成Help文件。

.SBR:VC编译器为每个OBJ文件生成的原始浏览信息文件,浏览信息维护工具(BSCMAKE)将利用SBR文件来生成BSC文件。

.TLB:OLE库文件,其中存放了OLE自动化对象的数据类型、模块和接口定义,自动化服务器通过TLB文件就能了解自动化对象的使用方法。

.WAV:声音资源文件

 

c#调用c++ dll组件

 

1.建一个c#控制台程序

将mydll.dll放在运行目录下

2.编写Program.cs

using System;
using System.Runtime.InteropServices;
 
namespace test
{
    class Program
    {
        [DllImport("mydll.dll", EntryPoint = "fnMydll")]
        public static extern int fnMydll(int a,int b);
        static void Main(string[] args)
        {
            int r = fnMydll(5,2);
            Console.WriteLine(r);
            
            Console.ReadLine();
        }
    }
}

 

using System.Runtime.InteropServices;互操作命名空间

 [DllImport("mydll.dll", EntryPoint = "fnMydll")]

 public static extern int fnMydll(int a,int b);

声明c++函数接口,在c#里,DLLImport编译器会自动加载mydll然后根据EntryPoint调用函数,EntryPoint必须是导出后的函数名,可以与Static的函数名不一致。

 

附:

另外一个哥们整理的c生成dll方式

http://blog.csdn.net/mmllkkjj/article/details/6627186

 

 

posted @ 2013-11-10 13:30  Roader  阅读(441)  评论(0编辑  收藏  举报