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