自动生成PInvoke调用Windows API的C#函数声明_第1页
自动生成PInvoke调用Windows API的C#函数声明_第2页
自动生成PInvoke调用Windows API的C#函数声明_第3页
自动生成PInvoke调用Windows API的C#函数声明_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

如果你的结构体里面包含TCHAR字符串成员的话,需要考虑ANSI和UnicodeDLL的情形。2.

如果你的结构体里面包含数组成员,需要考虑定长的数组,而不是对应C#数据类型。3.

如果你的结构体里面包含联合体(UNION),需要使用Explict选项,如果联合体里面又包含结构体。4.

你还要考虑你的结构体可以同时在32位和64位机上运行。5.

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

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

如果你的结构里面还包含了其他的结构体。8.

如果你的结构体里面还包含函数指针……9.

如果你的结构体里面包含函数指针数组。10.

如果你的结构体里面包含了指针……11.

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

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

有的结构体的情况是上面说的情形的综合,想想我们的VARIANT结构吧。

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

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

看起来微软自己也是深受.NET蹩脚的P/Invoke支持的毒害,因此无奈之余发布了P/InvokeInteropAssistant工具,你可以去下面这个链接来下载这个工具:/download/f/2/7/f279e71e-efb0-4155-873d-5554a0608523/CLRInsideOut2008_01.exe

实际上这个工具已经开源了,你可以从这里/clrinterop/下载到它的源代码。

简单介绍一下它的用法自动生成Native函数或者结构在.NET程序中的声明,切换到“SigImpTranslateSnippet”标签,然后将Native函数或者结构的声明拷贝到“NativeCodeSnippet”文本框里面,然后选中“AutoGenerate”对话框,点击“Generate”就可以获取对应的.NET声明,如下图所示:

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

验证或者生成.NET函数(或结构)在C中的声明,切换到“SigExp”并

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论