使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明【转】

原文连接:https://blog.csdn.net/Donjuan/article/details/3865026
在网上看到不少网友在.NET程序中调用Win32 API,或者调用本身的VC DLL里面提供的函数的时候,老是被生成正确的C函数在C#中的正确声明而困扰,而生成C++中结构体在C#中的声明 - 天,没有什么比这个更让人恶心的事情了。由于:数组

1.         若是你的结构体里面包含 TCHAR字符串成员的话,须要考虑ANSI和Unicode DLL的情形。ide

2.         若是你的结构体里面包含数组成员,须要考虑定长的数组,而不是对应C#数据类型。函数

3.         若是你的结构体里面包含联合体(UNION),须要使用Explict选项,若是联合体里面又包含结构体。工具

4.         你还要考虑你的结构体能够同时在32位和64位机上运行。布局

5.         你还要考虑C编译器对结构体所做的PADDING的优化。优化

6.         你还要考虑在.NET里面对结构体的优化,例如CLR会将一些.NET struct的成员的次序变换—以便更有效地利用内存。.net

7.         若是你的结构里面还包含了其余的结构体。3d

8.         若是你的结构体里面还包含函数指针……指针

9.         若是你的结构体里面包含函数指针数组。code

10.     若是你的结构体里面包含了指针……

11.     若是你的结构体里面有一些成员是被所调用的C函数所设置的。

12.     CLR提供了几种结构体的布局选项,什么Auto,什么Explicit,什么Sequential

13.     有的结构体的状况是上面说的情形的综合,想一想咱们的VARIANT结构吧。

 

若是结构体定义错误的话,在使用的时候,CLR只是简简单单地抛出一个AccessViolationException,真是叫每天不该,叫地地不灵。

 

另外还有一种情形就是在C中定义.NET的结构体对应的声明,这样C或者C++程序可使用这个结构,调用.NET的类库提供的一些函数,这个转换也是一个痛苦的过程。

 

看起来微软本身也是深受.NET蹩脚的P/Invoke支持的毒害,所以无奈之余发布了P/Invoke Interop Assistant工具,你能够去下面这个连接来下载这个工具:

http://download.microsoft.com/download/f/2/7/f279e71e-efb0-4155-873d-5554a0608523/CLRInsideOut2008_01.exe

 

实际上这个工具已经开源了,你能够从这里

http://www.codeplex.com/clrinterop/

下载到它的源代码。

 

简单介绍一下它的用法

自动生成Native函数或者结构在.NET程序中的声明,切换到“SigImp Translate Snippet”标签,而后将Native函数或者结构的声明拷贝到“Native Code Snippet”文本框里面,而后选中“Auto Generate”对话框,点击“Generate”就能够获取对应的.NET声明,以下图所示:

 

 

查找Win32 API中在.NET中的声明,选择“SigImp Search”,并在“Name”文本框里面输入你要查找的函数或者结构名称就能够了,以下图所示:

 

 

验证或者生成.NET函数(或结构)在C 中的声明,切换到“SigExp”而且打开一个包含P/Invoke函数调用的.NET Assembly就能够了,这个程序会显示对应的C的声明,而且告诉你C#声明编写错误的地方:

————————————————版权声明:本文为CSDN博主「知平软件」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。原文连接:https://blog.csdn.net/Donjuan/article/details/3865026

相关文章
相关标签/搜索