托管程序调用非托管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参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源. 提供给调用者调用 ...
随机推荐
- 正规化方程Normal Equations解析
如果需要代做算法,可以联系我...博客右侧有联系方式. 一.正规化方程概念 假设我们有m个样本.特征向量的维度为n.因此,可知样本为{(x(1),y(1)), (x(2),y(2)),... ..., ...
- 一篇文章让你彻底弄懂WinForm GDI 编程基本原理
一 GDI编程原理 GDI(Graphics Device Interface,图形设备接口),主要负责Windows系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出. GDI的常用 ...
- Delphi CRC算法, 不错
http://www.cnblogs.com/tangqs/archive/2011/12/08/2280255.html
- ios unit test 工程选择release时候报错Undefined symbols for architecture i386
Undefined symbols for architecture i386: "_OBJC_CLASS_$_ItemReturn", referenced from: objc ...
- VUE -- 自定义控件(标签)
首先我们在 src目录下新建一个目录 叫”component”,建一个mycomponent.vue文件,然后也让他打2句话吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 ...
- Http标准协议Android网络框架——NoHttp
NoHttp详细文档:http://doc.nohttp.net NoHttp公益测试接口:http://api.nohttp.net 支持与RxJava完美结合.支持一句话切换底层为OkHttp,支 ...
- 【转载】struts应用在断网情况下启动报错解决办法(java/net/AbstractPlainSocketImpl.java:178:-1)
无意间struts应用在有网络的情况下启动正常,在断网的情况下启动报错,报错代码如下图所示: SEVERE: Exception starting filter struts2 Class: java ...
- Angular 学习笔记——service &constant
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...
- How to use Variables in different component
1. In Script Task component Set Value: Dts.Variables["ErrorMsg"].Value = string.Format(&qu ...
- css 背景 平移 动画
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...