`
king_c
  • 浏览: 223545 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多

在网上看到很多网友在.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#声明编写错误的地方:

分享到:
评论

相关推荐

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

    标题中的“使用Signature Tool自动生成PInvoke调用Windows API的C#函数声明”是指一种高效的方法,用于在C#中调用Windows API函数。PInvoke(Platform Invoke)是.NET框架提供的一种机制,允许托管代码(如C#)直接...

    P/Invoke Interop Assistant交互助手

    P/Invoke是一种技术,允许.NET应用程序直接调用Windows API或其他本地DLL中的函数,尽管这些函数的定义是在非托管代码中。通过使用P/Invoke,开发者可以利用.NET的高级特性,同时利用已有的C或C++库。 描述中提到的...

    P/Invoke Interop 助手

    P/Invoke Interop Assistant,它支持托管代码和非托管代码之间的方法签名的转换,而且直接生成相关的C#或者是VB的方法调用代码。这个签名的转换,不只是适用于Windows的方法签名,只要给定一个C头文件,就可以转换...

    P/Invoke Interop Assistant

    3. 生成P/Invoke代码:根据解析结果,自动生成相应的C#或VB.NET代码,包括必需的DllImport特性,函数签名,以及可能的Marshaling代码。 4. 复制并粘贴到项目中:开发者将生成的代码复制到.NET项目中,即可直接调用...

    自动生成PInvoke调用Windows API的C#函数声明.rar

    这个压缩包文件“自动生成PInvoke调用Windows API的C#函数声明.rar”提供了一个工具,帮助开发者自动创建必要的PInvoke声明,使得C#能够与Windows API进行交互。PInvoke(Platform Invoke)是.NET框架提供的一种机制...

    p/Invoke.net工具

    P/Invoke.NET工具正是简化这一过程的关键,它能够自动生成这些必要的委托定义和函数调用,避免手动编写繁琐的PInvoke声明。 该工具的核心功能是生成PInvoke签名,它根据用户提供的非托管函数信息,自动创建对应的C#...

    C# API集,全面的WINDOWS API,可以生成C#代码也可以生成VB代码,也可以直接查找所需的API函数,使用非常方便

    C#语言本身并不直接支持Windows API调用,但可以通过P/Invoke(Platform Invoke)技术来实现。P/Invoke允许C#代码引用非托管的DLL(如kernel32.dll, user32.dll等),并调用其中的函数。在P/Invoke中,需要定义对应...

    C#中调用Windows API的要点.rar_API_C#调用C_C# windows_windows

    由于C#本身并不直接支持C风格的函数调用,所以我们需要借助P/Invoke(Platform Invoke)技术来调用这些API。 1. P/Invoke简介: P/Invoke是.NET Framework提供的一种机制,允许C#代码直接调用非托管代码,如C或C++...

    《精通.NET互操作:p/invoke, c++ interop和COM interop》源代码

    P/Invoke是.NET Framework提供的一种机制,允许托管代码(Managed Code)调用非托管代码(Unmanaged Code),通常是Windows API函数。在.NET中,通过定义带有`DllImport`属性的静态方法,我们可以声明并使用这些API...

    C#串口操作小例子,P/Invoke

    P/Invoke的工作原理是定义一个托管的函数声明,该声明对应于非托管库中的函数。在本例中,可能是调用了Windows API中的串口管理函数,如`CreateFile`,`SetCommState`,`ReadFile`和`WriteFile`等。这些函数允许我们...

    C#中调用Windows API的要点,在.Net Framework SDK文档中,关于调用Windows API的指示

    1. **P/Invoke**:P/Invoke是.NET Framework提供的一种机制,允许托管代码(如C#)调用非托管代码(如C或C++编写的Windows API)。这通常是通过在C#类中定义带有`[DllImport]`属性的静态方法来实现的。 2. **...

    使用P/Invoke来开发用于与串行设备通讯的.NET基类

    标题中的“使用P/Invoke来开发用于与串行设备通讯的.NET基类”指的是在.NET环境中,使用C#编程语言,通过平台调用服务(P/Invoke)来直接调用Win32 API,以实现与RS232串行设备的通信。这种方式避免了依赖过时的...

    P/Invoke获取CultureInfo

    在“P/Invoke获取CultureInfo”的场景中,我们需要关注的是如何利用P/Invoke调用Windows API来获取系统当前的CultureInfo信息。Windows API中提供了`GetUserDefaultLCID`函数,这个函数可以获取用户的默认区域设置的...

    用Visual_C#调用Windows_API函数[借鉴].pdf

    总之,Visual C#通过P/Invoke机制调用Windows API函数,使得开发者可以利用操作系统提供的丰富功能,扩展.NET应用的性能和能力。正确声明和使用API函数,理解参数转换和错误处理,是成功调用API的关键。在实际开发中...

    C#调用C++ Api或接口转换工具

    4. **配置P/Invoke**:如果使用P/Invoke,需要在生成的C#代码中添加DllImport特性,指定库的路径和导出函数。 5. **测试和调试**:在C#项目中调用生成的接口,进行测试以确保功能正确无误。 需要注意的是,C++和C#...

    最全的Windows API-C#声明

    该项目提供了一种便利的方式,使得C#开发者无需为每一个需要调用的Windows API手动添加`[DllImport]`属性和相应的函数声明。在C#中,使用P/Invoke(Platform Invoke)技术可以调用非托管代码,比如Windows API。P/...

    C#调用Windows自身的API开发摄像头拍照和摄像功能

    首先,我们需要引入必要的命名空间,如`System.Runtime.InteropServices`,用于P/Invoke(Platform Invoke)技术,这是.NET Framework提供的一个特性,允许C#代码调用非托管(通常为C或C++编写的)DLL中的函数。...

    C++结构体/函数定义转换C#函数定义/结构体

    在C#中,我们可以使用`DllImport`特性来调用这些DLL中的函数,进行P/Invoke(Platform Invoke)。 5. **Windows API调用**: - `winsiggen.exe`可能是一个Windows应用程序,它可能通过P/Invoke调用Windows API。在...

Global site tag (gtag.js) - Google Analytics