托管程序调用非托管dll问题总结
托管程序Visual Basic.net, 非托管DLL标准C++程序(使用VC++编译)
函数调用定义
第一种写法:
<DllImportAttribute("XXX.dll", EntryPoint:="xxxxx", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function Xxxxx(ByVal arg0 As String, ByVal [arg] As Integer, ByVal arg1 As Integer) As IntPtr
第二种写法:
Public Declare Function Xxxxx Lib "XXX.dll" Alias "xxxxx" ((ByVal arg0 As String, ByVal [arg] As Integer, ByVal arg1 As Integer) As IntPtr
问题1:DLLNotFoundException
表示xxx.dll文件没有找到
问题2:EntryPointNotFoundException
表示函数的入口没有找到,EntryPoint:="xxxxx"指定有问题
后面就是高潮了!!!
问题3:PIvokeStackImbalance
相信有一群人死在这里,网上很多人说重启一下网络接口就好了,但是这里我们没有涉及到网络开发(当然我遇到这个问题是开发LOG系统,涉及到了网络开发)
来自bing翻译:
PInvoke 函数调用具有堆栈失去了平衡。这可能是因为 PInvoke 签名的托管与非托管的目标签名不匹配。请检查 PInvoke 签名的参数的调用约定匹配目标非托管的签名。
这个东西绝对会让你云里雾里,当时不妨搜索一下“函数调用约定”也许会找到一下不到的结果
其实是使用VC++默认编译,生成的是__cdecl约定,但是VB上面的写法默认使用的是__stdcall约定,所以才会导致这个错误的发生,这也就是我上面第一种写法后面
会加上CallingConvention:=CallingConvention.Cdecl,来指定其调用约定。所以使用dll的时候,先要确定该dll使用的哪种调用约定。
抵用约定可以使用__declspec(dllexport) || __declspec(dllimport)进行指定(这里指定的是cdecl约定)
问题4:AccessViolationException
这个异常绝对是一个奇葩异常
来自bing翻译
试图读取或写入受保护的内存。这通常是指示其他内存已损坏。
想了好久,试了好久,都解决不了,其实这个问题是你的内存已经混乱导致的,就是指定参数类型上出现了大问题。
参数类型指定列表
|
C/C++ |
C# |
|
HANDLE, LPDWORD, LPVOID, void* |
IntPtr |
|
LPCTSTR, LPCTSTR, LPSTR, char*, const char*,Wchar_t*, LPWSTR |
String [in], StringBuilder [in, out] |
|
DWORD, unsigned long, Ulong |
UInt32,[MarshalAs(UnmanagedType.U4)] |
|
bool |
bool |
|
LP<struct> |
[In] ref <struct> |
|
SIZE_T |
uint |
|
LPDWORD |
out uint |
|
LPTSTR |
[Out] StringBuilder |
|
PULARGE_INTEGER |
out ulong |
|
WORD |
uInt16 |
|
Byte, unsigned char |
byte |
|
Short |
Int16 |
|
Long, int |
Int32 |
|
float |
single |
|
double |
double |
|
NULL pointer |
IntPtr.Zero |
|
Uint |
Uint32 |
我是中枪在void*上面了。
还有写VC++开发的时候最好写微软的类型,这样,微软定义了大量的宏,可以帮你在宽字节和标准字节间转换。
以上所说对所有的.net平台受用。
最后给几个链接
我也写累了。还有问题联系我吧
托管程序调用非托管dll问题总结的更多相关文章
- (转)C#调用非托管Win 32 DLL
转载学习收藏,原文地址http://www.cnblogs.com/mywebname/articles/2291876.html 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使 ...
- 在VS2010上使用C#调用非托管C++生成的DLL文件
背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用.本篇文章将引导你快速理解这个调用 ...
- .net4.0调用非托管DLL的异常捕获
转发: 由于有些非托管的DLL内部异常未有效处理,当托管程序调用到这样的DLL时,就引起托管程序意外退出. 托管程序使用通常的捕获try……catch块不起作用.原因是.NET 4.0里新的异常处理机 ...
- 在VS2017上使用C#调用非托管C++生成的DLL文件(图文讲解)
原文:在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解) 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就 ...
- 【转】在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)
原文:http://www.cyqdata.com/cnblogs/article-detail-35876# 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件 ...
- 关于C#调用非托管DLL,报“内存已损坏的”坑,坑,坑
因客户需求,与第三方对接,调用非托管DLL,之前正常对接的程序,却总是报“内存已损坏的异常”,程序进程直接死掉,折腾到这个点(2018-05-11 00:26),终于尘埃落定,直接上程序. 之前的程序 ...
- 关于C#调用非托管动态库方式的性能疑问
最近的项目中,因为一些原因,需要C#调用非托管(这里为C++)的动态库.网上喜闻乐见的方式是采用静态(DllImport)方式进行调用.偶然在园子里看到可以用动态(LoadLibrary,GetPro ...
- .Net 环境下C# 通过托管C++调用本地C++ Dll文件
综述 : 本文章介绍.Net 环境下C# 通过托管C++调用本地C++ Dll文件, 示例环境为:VS2010, .Net4.0, Win7. 具体事例为测试C++, C#, 及C#调用本地C++D ...
- 编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源
建议50:在Dispose模式中应区别对待托管资源和非托管资源 真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源. 提供给调用者调用 ...
随机推荐
- tiny4412 串口驱动分析二 --- printk的实现
作者:彭东林 邮箱:pengdonglin137@163.com 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 ...
- linux内存查看方法
cat /proc/meminfo 查看RAM使用情况,最简单的方法是通过/proc/meminfo.这个动态更新的虚拟文件实际上是许多其他内存相关工具(如:free / ps / top)等的组合显 ...
- 文件流:"fopen","fclose",“ftell”"fseek","fgets","fprintf" ,“feof”,"fwrite","fread"
char const* filename="D:/hello.txt"; 路径名使用的是“/”或者使用 转义字符“\\”: "fopen", FILE *fp= ...
- C# HttpWebRequest 绝技 【转】
原文地址:http://www.sufeinet.com/thread-6-1-1.html 在线测试工具http://www.sufeinet.com/thread-3690-1-1.html c# ...
- 什么是ISP,他的工作原理是怎样的?
ISP是Image Signal Processor的缩写,全称是影像处理器.在相机成像的整个环节中,它负责接收感光元件(Sensor)的原始信号数据,可以理解为整个相机拍照.录像的第一步处理流程,对 ...
- Bean的作用域scope
Bean的作用域scope 1.singleton 单例,指一个bean容器中只存在一份 2.prototype 每次请求(每次使用)创建新的实例,destroy方式不生效 3.request 每次h ...
- Spark-Join优化之Broadcast
适用场景 进行join中至少有一个RDD的数据量比较少(比如几百M,或者1-2G) 因为,每个Executor的内存中,都会驻留一份广播变量的全量数据 Broadcast与map进行join代码示例 ...
- go语言的一些特性
go语言中如何判断一个方法是私有的还是公有的?说出来你可能不信,通过首字母的大小写. 不管是一个变量还是一个函数,如果它的首字母是大写的,那么它就是包外可见的,也就是说可以 从这个包的外面访问这个资源 ...
- 测试用例 自动生成工具PICT与AllPairs
通常我们在设计或编写测试用例时,存在一个"痛点":要么设计的测试用例存在遗漏,难以100%覆盖测试需求:要么被测系统过于复杂,设计的测试用例过多,导致前期的设计和后续的执行工作量过 ...
- css3——position定位详解
最近热衷于前端的开发,因为突然发现虽然对于网站.应用来说,功能处于绝对重要的地位,但是用户体验对于用户来讲同样是那么的重要,可以说是第一印象.最近在开发当中发现以前对于css中的position的理解 ...