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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性