C# 调用C++库引发不得不说的事
第三方引用库使用方式有两种1.动态库(DLL),2.静态库(Lib)
区别:
静态库:我们的程序在链接时会把用到的静态库全部都链接进去,形成一个exe,这也导致我们的exe很大(程序是先编译,再链接库,最后形成exe)
动态库:是在不再把整个库都链接进去,而是程序用到哪个库,再加载哪个库,这就降低了exe的大小,但同时,运行速度也会变慢。当然,用动态库的话你的系统也需要有这些动态库(这里有坑),因为程序是没有的,所以啊,其实exe还是那么大,但是我们把exe的东西拿出来了,才降低了exe的大小。
DLL编译的时候需要指定系统版本x64或者x86,所以在接入dll的时候需要明确产品定位,具体接入那个版本库,x86系统不支持x64软件,x64可以运行x86(好像有性能损耗)。
接入C#项目的调用这里就不记录了,网上资料挺多,这里主要记录一下编译的问题:
我们编译项目解决平台绝大部分都是Any CPU,可能很少有人注意这里的区别,首先Any CPU 编译时默认首选32位!!!
此时如果引入x64的DLL,就会无法编译通过,一些人可能会想到引入的x64DLL从而把平台改为x64,这里我不建议这么操作(产品打包安装程序可能会出现问题),只需要取消勾选首选32位就可以解决编译问题
解决编译问题,功能完成就该转交测试了,因为我们项目是桌面程序,所以需要打包成安装程序,这里我使用的是vs自带的打包工具
打包程序需要设置安装平台
我这里都以x64为例,如果选择解决方案平台选择Any CPU 那么打包时就不支持Itanium平台
这里需要注意一点,最开始提到了,动态库是使用的时候才会调用对应的DLL,这就要求一点,对应的电脑上需要有这个DLL才能运行,开发环境不用多说环境肯定比测试,生产环境丰富,
所以调用的C++DLL,我们哪怕我们明确它在我们项目里,但是在测试环境都有可能无法运行
C++时别人提供的,我们不知道对方还有那些引用。因此需要借助一些工具如Depend专门查看DLL引用依赖的工具,不过win10无法运行Depend,解析DLL时就程序就会卡死
这里win10推荐Dependencies 这是github地址:
上图就是通过依赖查看工具打开C++DLL之后的结果,可以清楚查看到都有拿下DLL引用,如果在系统文件夹下面没找到引用DLL(会产生异常信息“找不到指定模块”),此时需要补充必要的环境或直接将缺少的DLL复制到生产环境对应目录下就可以解决
这里需要仔细查看,因为是动态库,缺少任意一个子集引用都可能无法运行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现