相信大家在用C#调用C(C++)dll时会被数据封送搞的晕天转地……下面列举一下头大的事,在CSDN另一博客摘引的。
源地址:http://blog.csdn.net/Donjuan/article/details/3865026
1. 如果你的结构体里面包含 TCHAR字符串成员的话,需要考虑ANSI和Unicode DLL的情形。
2. 如果你的结构体里面包含数组成员,需要考虑定长的数组,而不是对应C#数据类型。
3. 如果你的结构体里面包含联合体(UNION),需要使用Explict选项,如果联合体里面又包含结构体。
4. 你还要考虑你的结构体可以同时在32位和64位机上运行。
5. 你还要考虑C编译器对结构体所作的PADDING的优化。
6. 你还要考虑在.NET里面对结构体的优化,例如CLR会将一些.NET struct的成员的次序变换—以便更有效地利用内存。
7. 如果你的结构里面还包含了其他的结构体。
8. 如果你的结构体里面还包含函数指针……
9. 如果你的结构体里面包含函数指针数组。
10.如果你的结构体里面包含了指针……
11.如果你的结构体里面有一些成员是被所调用的C函数所设置的。
12.CLR提供了几种结构体的布局选项,什么Auto,什么Explicit,什么Sequential
13.有的结构体的情况是上面说的情形的综合,想想我们的VARIANT结构吧。
如何头大吗?想杀死B-G吗?想放弃调用dll吗?其实这很正常的,就连微软自己都被自己的数据封送搞的头大,因此他们就出来一个针对数据封送的小工具
P/Invoke Interop Assistant
下载地址:http://download.csdn.net/detail/cumtwys/7699425 0分资源
好这个工具隆重出场了,下面简单介绍一下用法,安装完成之后,运行winsiggen.exe,界面如下,选择【SigImp Translate Snippet】:
在【Native Code Snippet】内输入你的需要转换的代码(如结构体等),然后点击Generate,便生成了C#的封送格式OK!还是蛮好用的!效果如下:
怎么样不错吧……只不过自动生成C#代码自动添加了引用的空间,如果在cs文件的开头使用了using的话完全可以去掉,太碍眼了……
而且通过这个工具也解决了上一篇文章中关于整形数组和字符数组封送格式的疑问……