将C++转换成VB,C#语言小工具介绍
2014-05-22 11:39
281 查看
在网上看到很多网友在.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. 有的结构体的情况是上面说的情形的综合,想想我们的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/
下载到它的源代码。
查找Win32 API中在.NET中的声明,选择“SigImp Search”,并在“Name”文本框里面输入你要查找的函数或者结构名称就可以了,如下图所示:
验证或者生成.NET函数(或结构)在C 中的声明,切换到“SigExp”并且打开一个包含P/Invoke函数调用的.NET Assembly就可以了,这个程序会显示对应的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. 有的结构体的情况是上面说的情形的综合,想想我们的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#声明编写错误的地方:
相关文章推荐
- NET 框架 语言转换工具网站 C#、VB、PHP。。。
- vb.net与c#相互转换工具
- VB.Net to C# 代码转换(互换互转)工具
- c#&vb两种语言语法的简要介绍
- C++ 谁能帮我仔细介绍下C C#这3个语言
- n个VB.Net C#代码转换工具
- vb.net与c#相互转换工具 网站地址列表
- 关于VB.Net C#代码转换工具
- VB.Net C#代码转换工具
- C#与VB.NET代码互相转换在线工具
- n个VB.Net to C# (C# to VB.net)代码转换(互换互转)工具
- UML工具推荐 Poseidon版本 可以免费下载,自动生成代码 C++ Java C# VB.NET等 (来自德国汉堡的国际性建模软件开发商Gentleware AG的)
- C#和VB.NET代码互相转换工具
- 用Visual Studio 2005 开发VB.NET-C#语言转换插件
- 关于VB.Net C#代码转换工具
- 推荐n个VB.Net to C# (C# to VB.net)代码转换(互换互转)工具
- n个VB.Net C#代码转换工具
- 反编译利器,编程学习的好工具,支持C#,VB等6种语言
- VB.net和C#代码互相转换的在线工具
- C#与VB.NET代码互相转换在线工具