判断DLL文件是C/C++动态链接库还是.NET程序集及查看DLL依赖
前言
如果是程序方面的识别,一般我们如果直接在C++中引用.NET DLL程序会报错的,一般需要我们将.NET DLL生成组件dll 然后再在C++中用,而且需要做些相应的配置。比如开启clr 选项之类的。
同样在.NET程序中直接使用C++ DLL也是会有问题的,一般要我们通过interop技术比如Pinvoke之类的来做的。
常见问题客户端在部分电脑上无法加载指定模块
针对异常情况,做故障分析:
C++编译的dll正常,C#编译正常;
加载路径也没问题
排除DLL本身的问题后,出现问题的原因就可能是运行环境的问题。
加载的C++生成的DLL,如果其依赖其他DLL,而所依赖的DLL不在当前运行环境,也会出现此种异常。
判断DLL类型如果可以使用工具,你可以用CorFlags.exe (CorFlags Conversion Tool).aspx) 工具来识别。
我本地CorFlags.exe所在的路径为
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools
添加到环境变量中
添加后就能使用了
C++ DLL
代码语言:javascript代码运行次数:0运行复制CorFlags.exe .\RobotUsbWrapper.dll.NET DLL
代码语言:javascript代码运行次数:0运行复制CorFlags.exe .\RobotpenGateway.dll会看到
查询DLL依赖官方工具能同时查询C++ DLL和.NET DLL的依赖。
这种方式只能查看依赖,不能查看依赖所在位置,后两种都支持查看依赖位置。
利用vs子自带工具:VS 2017的 x64_x86 交叉工具命令提示符
打开进入cmd模式,找到C++的dll路径,通过命令:
代码语言:javascript代码运行次数:0运行复制dumpbin /dependents 需要检测的.dll如
代码语言:javascript代码运行次数:0运行复制dumpbin /dependents .\RobotUsbWrapper.dll结果
Dependencies能同时查询C++ DLL和.NET DLL的依赖。
支持查看依赖位置。
支持Win10。
https://github.com/lucasg/Dependencies/releases
百度云下载地址:
链接:https://pan.baidu.com/s/13YYSX-wNLykqFzdx7QDKAA
提取码:psvm
运行其中的DependenciesGui.exe文件,把DLL拖进去即可。
软件依赖环境:
Microsoft Visual C++ Redistributable
Dependency Walker能同时查询C++ DLL和.NET DLL的依赖。
支持查看依赖位置。
仅适用于winxp/win7/win8,但是不能用于win10,会卡死报错。
https://dependencywalker.com/
DLL嵌入EXE中项目地址:https://github.com/MiloszKrajewski/LibZ
使用Nuget图形或者命令下载LibZ.Bootstrap
代码语言:javascript代码运行次数:0运行复制Install-Package LibZ.Bootstrap -Version 1.2.0然后,配置Post buid 脚本(生成后时间命令行):
代码语言:javascript代码运行次数:0运行复制set LIBZ=$(SolutionDir)packages\LibZ.Bootstrap.1.2.0.0\tools\libz.exe
%LIBZ% inject-dll --assembly 星火微课.exe --include *.dll --move编译通过后就可以了。这里需要注意的是–assembly后的参数是项目生成的文件名,不是新生成的名称.
但是并不建议这样做:
只有.NET的DLL会被嵌入到EXE中,C++的不会,并且大大增加生成时间。