- 浏览: 213741 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
synack:
写的很好,图文并茂,语言简单清晰,赞!
SkipList 跳表 -
king_c:
jiandandecaicai 写道你好,请教一下是如何通过E ...
从Hadoop URL 中读取数据 -
jiandandecaicai:
你好,请教一下是如何通过Eclipse来连接Hadop机群的, ...
从Hadoop URL 中读取数据
在网上看到很多网友在.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://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#声明编写错误的地方:
简单介绍一下它的用法
发表评论
-
c++引用计数的本质
2015-03-24 14:26 1246为什么要用引用计数? 场景:代码里X是一个 ... -
COM 数组传输-使用VARIANT传递数组的方法及步骤 .
2015-02-16 17:22 21在使用COM/DCOM写组件时经常要传递数组,一般比如SHO ... -
MFC程序中打印调试信息
2015-01-20 22:11 9781、在要打印调试的类中加上头文件 #include ... -
opencv轮廓提取与轮廓拟合
2015-01-05 09:55 1958#include <iostream> #i ... -
c语言操作二进制文件fopen中fseek的注意事项
2014-11-22 01:04 1132今天在使用fopen的时候,遇到了fseek(fp,0 ... -
C++中delete和delete[]的区别
2014-11-21 23:41 599一直对C++中的delete和delete[]的区别不甚 ... -
缺少streams.h的解决方法
2014-10-09 17:19 1044这几天在学DirectShow的开发,一个streams. ... -
openface 人脸识别开放平台
2014-08-10 17:27 1714using System; using System.Co ... -
新中新二代身份证dll调用,报尝试读取或写入受保护的内存,这通常指示其他内存已损坏 这个错
2014-06-26 04:04 872新中新二代身份证dll调用问题: ... -
【OpenCV学习笔记】2.3 OpenCV2.2摄像头读取视频的问题和解决(VS2010)
2014-06-18 16:38 3882摄像头读取视频这一块研究了很长时间,终于弄好了。刚开始 ... -
C# 4.0 并行计算部分 [转发]
2014-05-03 15:24 1013沿用微软的写法,System.Threading.Task ... -
使用ATL创建进程外组件
2014-03-24 22:39 1166一、建立一个进程外组件1)打开菜单File|New,选择Pr ... -
vector 转换成 数组 - [C++]
2013-12-13 18:06 4658参考: http://topic.csdn.n ... -
ref:Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器
2013-09-09 00:21 800原文地址:http://www.s135.com ... -
openMP
2013-06-08 23:32 952最近在看多核编程。简单来说,由于现在电脑CPU一般都有两 ... -
nafxcw.lib与LIBCMT.lib在vs2008中链接冲突解决方案
2013-05-09 09:51 9431>正在链接...1>nafxcw.lib(af ... -
Errore HTTP 404.2 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理
2012-11-20 17:46 938如题,这个错误google时一大堆各种各样的解决办法,但 ... -
JAVA中的数据存储(堆及堆栈)
2012-11-06 21:40 1054在JAVA中,有六个不 ... -
error : Please use the /MD switch for _AFXDLL builds 的解决方法
2012-09-20 21:14 2652在用vs打开项目后,编译的时候出现“Please use ... -
共享内存的例子(转msdn)
2012-06-02 19:18 1416Creating Named Shared Memo ...
相关推荐
P/Invoke Interop Assistant,它支持托管代码和非托管代码之间的方法签名的转换,而且直接生成相关的C#或者是VB的方法调用代码。这个签名的转换,不只是适用于Windows的方法签名,只要给定一个C头文件,就可以转换...
《精通.NET互操作P/Invoke,C++Interop和COM Interop》包括3部分,平台调用——主要用于解决在托管代码中调用非托管程序设计语言编写的flat API(如Win32 API、C/C++风格的API等)的问题;C++ Interop——技术专门用于...
P/Invoke Interop Assistant,用来调试C++写的动态库转换成C#或VB.NET
可以把C/C++中的数据类型、结构体数据格式转换为C#或者VB版本中的对应格式类型。很方便
《CLR via C#》非托管代码互操作性提到的P/Invoke Interop Assistant开发工具,包含源代码,是从网站:http://clrinterop.codeplex.com/ 上下载的,作为备份
C#串口操作小例子,P/Invoke 调用...........
《精通.NET互操作:p/invoke, c++ interop和COM interop》一书的源代码
利用P/Invoke获取更改后的系统CultureInfo
源生成器,用于将用户定义的Win32 P / Invoke方法集和支持类型添加到C#项目中。 C#/ Win32 P / Invoke源生成器一个源生成器,用于将用户定义的Win32 P / Invoke方法集和支持类型添加到C#项目中。 功能快速向您的...
这个类库使用平台调用服务(即Platform Invocation Services)来与Win32 API直接交互。程序员可以通过继承在任何.NET语言下使用这个类库;这个文章还探讨了一些用C#和Visual Basic .NET写的示例程序
史上最全的C#、VB与WindowsAPI函数转换帮助工具。方便快捷查看Windows API中对应的C#、VB调用(P/Invoke)方式
为了能用上原来的C++代码,只好研究下从C# 中调用DLL 首先必须要有一个声明,使用的是DllImport关键字: 包含DllImport所在的名字空间 using System.Runtime.InteropServices; public class XXXX{ ...
C# Invoke多线程调用Demo......
C#可以通过P/Invoke调用C/C++写的DLL,一般在从DLL接收字符串时比较麻烦,本人在某个项目中遇到这个问题, 从DLL收读取字符串时遇到中文乱码,这里总结一下C#收取字符串时的处理。 C/C++字符串一般通过char* ...
J/Invoke enables Java developers to easily invoke native methods (such as the Win32 API or C-based Windows DLLs and Unix dynamic libraries) with pure Java code. Unlike error-prone JNI programming ...
从Credential Manager导出Windows凭据的Powershell脚本 https://github.com/peewpw/Invoke-WCMDump PS>Import-Module .\Invoke-WCMDump.ps1 PS>Invoke-WCMDump powershell.exe "IEX (New-Object Net.WebClient)....
C_窗体中Invoke和BeginInvoke方法详解
《精通.NET互操作:P/Invoke,C++ Interop和COM Interop》 因为此书太大,所以分为7部分下载;每部分可单独使用,为RAR压缩文件解压后为PDF版。因为第二部分和第六部分太大以后有权限了上传。 共分为:七部分 当前是:...
托管代码与非托管代码互操作的辅助产生代码的工具