C#调用C/C++ DLL参数传递(3)
C#调用C/C++ DLL参数传递(三)
需要特别注意的是 CopyPointerArray2D与CopyArray2D虽然两个函数的声明完全一样,但在C++中实际处理的方式是完全不同的,产者是看作一维指针数组来处理的,可以允许“二维数组”是不连续的,而后者是将其看作连续的存储空间,即C/C++中的二维数组的数据存储方式处理的,所以在示例代码中使用CopyArray2D处理byte[][]类型的锯齿数组是不可以的,会造成内存的非法访问破坏内存数据。
2。 在C#中创建DLL接口的声明
C#没有全局函数,必须使用静态函数实现全局函数。
1) DllImport类似C++中的__declspec(dllimport),第一个参数为必选参数,为DLL的路径,一般以相对路径即可,只需要将DLL文件放到工作目录中即可
2) EntryPoint表示对应的函数名称,这个与C++ DLL工程中.def文件中导出的函数名同
使用C#调用C++时不支持C++的函数名重载(至少还没有找到办法),如果参数不同必须使用不同的函数名用以区分,但在C#中可以使用相同的函数名
3) C#中的声明的函数名不一定与实际的函数名一样,比如
中的PassString可以使用任何名称,与C++中的对应关系只需要DllImport中的EntryPoint参数保持一致。
一般地只需要给出DLL文件名、EntryPoint两个参数就可以了。
需要注意的是在结构体Persion中的isFemail字段采用的是bool类型,C#与C++中的bool都是通过1个字节来实现的,而且实现机制非常类似,所以将期视作单字节的无符号类型处理。3。 在C#中调用C++的函数,下面的测试代码使用了前面实现的TTest测试框架(http://blog.****.net/nocky/article/details/7687559)。
需要特别注意的是 CopyPointerArray2D与CopyArray2D虽然两个函数的声明完全一样,但在C++中实际处理的方式是完全不同的,产者是看作一维指针数组来处理的,可以允许“二维数组”是不连续的,而后者是将其看作连续的存储空间,即C/C++中的二维数组的数据存储方式处理的,所以在示例代码中使用CopyArray2D处理byte[][]类型的锯齿数组是不可以的,会造成内存的非法访问破坏内存数据。
还没有研究多维数组的传递,其传递方式会比较复杂,应该不会用到吧,如果确实出现的话是该考虑一下设计问题了。
对于C++ class定义的类型以及如何调用对象的方法一下步再研究。(待续)