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

原创 2009年02月05日 20:53:00

在网上看到很多网友在.NET程序中调用Win32 API,或者调用自己的VC DLL里面提供的函数的时候,总是被生成正确的C函数在C#中的正确声明而困扰,而生成C++中结构体在C#中的声明 - 天,没有什么比这个更让人恶心的事情了。因为:

1.         如果你的结构体里面包含 TCHAR字符串成员的话,需要考虑ANSIUnicode 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结构吧。

 

如果结构体定义错误的话,在使用的时候,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#声明编写错误的地方:

推荐一个好工具:P/Invoke Interop Assistant

原文地址 :http://write.blog.csdn.net/postedit 在从托管代码里面调用非托管代码的时候,经常会翻阅MSDN找到需要调用的这个程序集里面的关于需要调用方法的签名,还要...
  • ArvinStudy
  • ArvinStudy
  • 2012年09月01日 15:10
  • 1701

C#工具---使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明

PS;这个工具不错啊!  在网上看到很多网友在.NET程序中调用Win32 API,或者调用自己的VC DLL里面提供的函数的时候,总是被生成正确的C函数在C#中的正确声明而困扰,而生成C++中...
  • u011430225
  • u011430225
  • 2017年11月30日 13:35
  • 118

CLRInsideOut2008_01

  • 2014年07月31日 14:56
  • 1.2MB
  • 下载

利用P/Invoke Interop Assistant写一个最简单的CLR程序

来自:http://hi.baidu.com/wingingbob/item/50f395139514ebe55f53b156 利用P/Invoke Interop Assistant写一个最简单的...
  • ArvinStudy
  • ArvinStudy
  • 2013年03月01日 15:35
  • 764

P/Invoke平台调用技术

C#里调用非托管的Dll     今天花了一些精力来调查了一下C#里调用非托管的Dll,C#里调用非托管的Dll要使用P/Invoke平台调用技术, 这里先简单介绍一下P/Invoke平台调用技...
  • u013095889
  • u013095889
  • 2016年10月13日 13:01
  • 445

使用平台调用(P/Invoke)

使用平台调用   P/Invoke,它的全名叫平台调用(platform invoke),用于调用dll 中实现的非托管的单调(flat)编程接口,被称为使用C或C++ 调用约定(calling ...
  • hadstj
  • hadstj
  • 2014年06月24日 15:01
  • 1736

平台调用P-INVOKE(一)--(基础篇)

平台调用技术(P/Invoke): 主要用于处理在托管代码中调用C/C++库函数及Win32 API函数等非托管函数的情形 一、基本要素 一个简单例子: C++声明: ex...
  • sdl2005lyx
  • sdl2005lyx
  • 2011年09月21日 10:24
  • 3864

C#中的平台调用(P/Invoke)

C#中的P/Invoke    在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的。本文将...
  • diligentcat
  • diligentcat
  • 2016年09月27日 11:24
  • 445

不得不说两句,让人欢喜让人忧的P/Invoke (平台调用)

不得不说两句,让人欢喜让人忧的P/Invoke (平台调用) 说到在 C# 中通过 P/Invoke 调用Win32 DLL,的确有很多地方让人值得去好好探索一下,如果你对这个主题尚不熟悉,请参考微软...
  • kiss0kill
  • kiss0kill
  • 2006年10月13日 17:38
  • 5963

平台调用P/Invoke进阶 -- 初阶:认识平台调用P/Invoke

.NET交互操作服务前言.NET是微软最新推出的编程平台,它通过公共语言运行库将基于.NET Framework的托管代码(Managed code)承载运行,以简化Internet 环境中的应用程序...
  • weinasi3252
  • weinasi3252
  • 2006年08月04日 15:34
  • 797
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
举报原因:
原因补充:

(最多只允许输入30个字)