第一篇编译C 的动态连接库 在实际工作中,我们经常会将C语言中的.lib和.h文件(静态库)编译成动态连接库.dll文件(这里只提供这两种文件,没有完整的工程),以提供给其他语言平台调用。 1,必须有.lib 文件,只有.h 文件是无法编译动态连接库的。 2,我使用的是VS2008,这里打开VS,新建项目—〉win32 控制台应用程序,输入项目名称,点击确定,图示如 fig.1 所示。 Fig.1 3,点击下一步,依次如图 fig.2-3 所示,最后点击完成,就会生成一个带有.cpp 的文件。 Fig.2 Fig.3 4,打开项目—属性—配置属性—链接器—输入,如下图 fig.4 所示,在附加依赖项中加入你要添加的.lib 文件,如果有一些系统.lib 库没有添加或出现错误,可以在忽略特定库中添加该库。 注意:如果编译的 dll 文件调用中出现“xx.dll 中找不到函数 xx 的入口点”,很有可能是一个xx.def 文件没有添加,该文件的内容是EXPORTS 函数名@+序号。如果这个文件中没有你要调用的API 函数,那么你在 C#中是调用不到这个函数的,同时这个文件你可以同坐记事本自己编辑,注意 Fig.4 5,在.cpp 文件中添加.h 文件的引用,不需要把所有的.h 文件都引用进去,只需要.lib文件入口相关的.h 文件。 6,最后把.lib 和.h 文件拷贝到工程 debug 目录里,生成解决方案就 Ok 了,你会发现.dll在 debug 目录中出现。 第二篇C#调用C/C++的动态连接库 1,清楚C++与 C#类型对应关系,即调用关系: C 基本类型对照关系----VS2008: 除此之外, c++:HANDLE(void *) ---- c#:System.IntPtr c++:WORD(unsigned short) ---- c#:System.UInt16 c++:DWORD(unsigned long) ---- c#:System.UInt32 c++:结构体 ---- c#:public struct 结构体{}; c++:结构体 &变量名 ---- c#:ref 结构体 变量名 c++:结构体 **变量名 ---- c#:out c++:GUID ---- c#:Guid c++:UINT8 * ---- c#:ref byte c++:char*/void*(指向一个字符串) ---- c#:string 对于结构体中的指针数组,对应于C#中的IntPtr[]类型,如: int * a[] -------------- IntPtr[]a 2,清楚在C#中调用C/C++.dll 文件的一般格式 using System.Runtime.InteropServices; //必须引用的命名空间 [DllImport("user32.dll")] public static extern ReturnType FunctionName(type arg1,type arg2,...); //必须定义为类的静态外部的方法 3,[DllImport(参数)]设定 ①...