推理电视剧

(C++C#类型互转工具)使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明

坚强是说给别人听的谎言 提交于 2019-11-28 07:27:12
在网上看到很多网友在.NET程序中调用Win32 API,或者调用自己的VC DLL里面提供的函数的时候,总是被生成正确的C函数在C#中的正确声明而困扰,而生成C++中结构体在C#中的声明 - 天,没有什么比这个更让人恶心的事情了。因为: 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. 有的结构体的情况是上面说的情形的综合