托管程序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平台受用。

最后给几个链接

函数调用约定

DllImportAttribute 类

我也写累了。还有问题联系我吧

托管程序调用非托管dll问题总结的更多相关文章

  1. (转)C#调用非托管Win 32 DLL

    转载学习收藏,原文地址http://www.cnblogs.com/mywebname/articles/2291876.html 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使 ...

  2. 在VS2010上使用C#调用非托管C++生成的DLL文件

    背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用.本篇文章将引导你快速理解这个调用 ...

  3. .net4.0调用非托管DLL的异常捕获

    转发: 由于有些非托管的DLL内部异常未有效处理,当托管程序调用到这样的DLL时,就引起托管程序意外退出. 托管程序使用通常的捕获try……catch块不起作用.原因是.NET 4.0里新的异常处理机 ...

  4. 在VS2017上使用C#调用非托管C++生成的DLL文件(图文讲解)

    原文:在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解) 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就 ...

  5. 【转】在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)

    原文:http://www.cyqdata.com/cnblogs/article-detail-35876# 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件 ...

  6. 关于C#调用非托管DLL,报“内存已损坏的”坑,坑,坑

    因客户需求,与第三方对接,调用非托管DLL,之前正常对接的程序,却总是报“内存已损坏的异常”,程序进程直接死掉,折腾到这个点(2018-05-11 00:26),终于尘埃落定,直接上程序. 之前的程序 ...

  7. 关于C#调用非托管动态库方式的性能疑问

    最近的项目中,因为一些原因,需要C#调用非托管(这里为C++)的动态库.网上喜闻乐见的方式是采用静态(DllImport)方式进行调用.偶然在园子里看到可以用动态(LoadLibrary,GetPro ...

  8. .Net 环境下C# 通过托管C++调用本地C++ Dll文件

     综述 : 本文章介绍.Net 环境下C# 通过托管C++调用本地C++ Dll文件, 示例环境为:VS2010, .Net4.0, Win7. 具体事例为测试C++, C#, 及C#调用本地C++D ...

  9. 编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源

    建议50:在Dispose模式中应区别对待托管资源和非托管资源 真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源. 提供给调用者调用 ...

随机推荐

  1. 1.NFC入门

    1.什么是NFC? 近距离无线通信技术(Near Field Communication,NFC).NFC提供了一种简单的.非触控式的解决方案,可以让消费者简单直观地交换信息.访问内容与服务. 2.运 ...

  2. 用DVD镜像离线安装Debian的软件包

    先介绍一下环境: 虚拟机:debian7.2.0 主机: Win7 方法一: 由于有时候无法联网就需要离线安装软件包,可以把debian官网上列出的几个DVD镜像都下下来,其实主要是DVD1,这样就不 ...

  3. VBA Collection用法总结

    Sub test() ' Dim s As Collection '定义s变量为集合对象 ' Set s = New Collection '初始化集合对象s (否则无法使用) Dim s As Ne ...

  4. Java千百问_03基本的语法(005)_二进制是如何做位运算的

    点击进入_很多其它_Java千百问 二进制是如何做位运算的 程序中的全部数在计算机内存中都是以二进制的形式储存的.位运算说白了,就是直接对整数在内存中的二进制位进行操作. 其它运算符看这里:java种 ...

  5. navigationItem的设置和titleView的设置

    设置导航栏中间的标题 self.navigationItem.title = @"title"; 设置导航栏的主题颜色 self.navigationBar.barTintColo ...

  6. Oracle 11g 递归+ exists运行计划的改变

    有一个递归查询在10g上执行非常快,但在11g上执行不出来. SQL> select * from v$version; BANNER ----------------------------- ...

  7. Mac环境下反编译apk

    0,工具汇总 我们反编译apk主要使用下面三个工具 apktool:用于获取资源文件 dex2jar:获取源文件jar包 JD-GUI:反编译源文件jar包查看源码 找这些工具时折腾了我点时间.如今把 ...

  8. Oracle 格式化中文时间

    SELECT TO_CHAR(SYSDATE, 'MM"月"DD"日"') A FROM dual; --注: 当格式字符串当中, 存在 自定义的字符信息的时候 ...

  9. Maven学习小结

    简介:一款服务于Java的自动化构建工具 1 安装 必须已经安装了jdk且配置了环境变量,注意查看当前maven版本支持的jdk版本 配置Maven的环境变量 MAVEN_HOME PATH 使用mv ...

  10. PHP和Java的主要区别有哪些?哪个最适合Web开发语言?

    一.前言 PHP和Java都是现在比较流行的二种编程语言. 对于许多新手来说,都会思考如果学的时候,该学哪种语言呢?下面这篇文章给大家整理两者的区别以及一些选择建议,一起来看看吧. 二.简介 PHP与 ...