C# dllimport 的一系列坑与错误

C# dllimport 的一系列坑与错误

错误一:无法加载 DLL“xxxx.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。

解决办法:确认"xxxx.dll"是否在你调试程序的的根目录中

错误二:System.BadImageFormatException:“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)”

解决办法:将你的程序右键→属性→生成→目标平台→“X86”,目前大多数C提供的dll基本都要在32位平台下进行调用。

 

错误三:System.DllNotFoundException:“无法加载 DLL“xxxxl.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。”

 解决办法:确认"xxxx.dll"是否在你调试程序的的根目录中,以及该dll所需要的引用的文件dll全部文件都要在一起

错误四:托管调试助手 "PInvokeStackImbalance":“对 PInvoke 函数“xxxxx::xxxxx”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配

解决办法:该问题是由于方法中的参数类型与dll提供的标准方式不一致引起的

一般常见的:unsigned char *   在C#中都使用stringbuilder 即可,注意分配stringbuilder合理的空间,用法:stringbuilder a=new stringbuilder(1000自己分配),当然也可以使用byte[],如果有字符集的需要,用byte,数字类型的,一般都是使用int代替。

错误五:System.EntryPointNotFoundException:“无法在 DLL“xxxxx.dll”中找到名为“xxxxx”的入口点。”

解决办法:该问题是由于在C#定义的方法与import的dll提供的不一致引起的,一定要和dll里面一致,当觉得命名不太好或者不一致的时候,可以在dllimport,使用EntryPoint的方法备注,如下图:

 

 

其他错误:有的C提供的DLL需要在dllimport的时候声明一下调用

CallingConvention = CallingConvention.Cdecl

 

posted @ 2022-08-11 09:41  码路迢迢  阅读(2794)  评论(1编辑  收藏  举报