C#调用非托管C++编写的dll,运行时找不到xxx.dll的问题。

茅山道士 2012-02-20 01:52:12
以前有个非托管C++编写的类,导出了几个函数,现在在C#中用[dllimport]语法调用,在开发环境的机器上是好的,但是移植到其他机器上就出现“不能找到xxx.dll”的问题。即使把dll拷贝到system32目录下,或者在应用程序中使用绝对路径也不行。网上搜索有人说是dll的依赖库没有一起拷贝,但是语焉不详。根据这个思路,使用dumpbin /dependents xxx.dll查看一下依赖后,发现依赖项msvcr100.dll和kernel32.dll,后面是标准windows的内核库,不用考虑,前面的是vc7.0的运行时库,就是缺少这个依赖项导致dll不能正确被加载。拷贝这个dll到应用程序目录,问题解决。

这里有个两点需要总结:
1、部署C#程序的时候,不仅需要考虑.net framework的版本和依赖问题,如果还调用了非托管C++编写的dll、,那么还需要考虑该dll对应版本的C++运行时库。
2、非托管的C++运行程序(exe)如果没有相应的dll运行时库支持,运行时会给出具体的提示,但是dll就比较诡异,只给出找不到模块的提示,具体问题需要自己运行dumpbin /dependents解决。
...全文
198 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
本课程主要是针对ILRuntime设计一个独立的脚本热更新框,框架的优势:1.将代码热更脱离Assetbundle资源热更,独立的部分更适用于各种不同的框架。2.加快项目的逻辑更新,bug修复.(后期修bug,多数情况下并不用动到资源,只需要更新脚本代码,无需重走资源打包发布流程,大大提升效率)3.提供热更模式和正常开发模式的快速切换接口,可以让队友像平常一样去开发.4.不依赖市面上的任何AB框架,完全兼容市面上各种不同的AB框架.5.重点:希望通过它,帮助你学习、了解ILRuntime真正在项目中的应用.框架的将提供以下这些接口,这些接口将从0开始,在Unity里将C#脚本编译成dll,然后将dll放到服务器上,再将dll下载下来,进行加载,到最后从Unity主工程调用热更新的代码逻辑.1.Create hotfixdll接口将热更部分的代码 编译成dll生成dll版本配置(MD5)2.更新对比接口本地跟服务器的dll进行版本对比3.下载热更dll下载dll本身的文件下载版本记录文件4.加载热更dll加载dll实例化:AppDomain初始化:注册跨域继承适配器注册委托适配器LitJson重定向调用性能优化(CLR绑定功能)调用热更接口Hotfix.HotfixApplication.Main 进入热更逻辑5.ILMonoBehaviour用于监听组件的生命周期,实际是桥接(调用)热更的逻辑AwakeStartEnableUpdateLateUpdate.......6.添加其他常用的库DOTweenLitJsonSpineGoogle.ProtobufTextAnimation可以根据上面的方式,自行添加依赖的库... 

110,580

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧