最近写的软件3D显示在其他电脑上出现了问题,但原先的版本还可以运行。后来发现问题出在Microsoft.DirectX.Direct3DX.dll身上。
问题是运行3D界面时出现异常:System.IO.FileNotFoundException:Could not load file or assmbly 'Microsoft.DirectX.Direct3DX.dll' or one of its dependencies.找不到指定模块。
从问题上看,是无法载入dll,或者dll缺少某个依赖。但是为什么旧的软件就可以运行呢?然后我查看不同软件下的dll版本,打开VS(我使用的是VS2017)工程文件(*.csproj)就可以看到,发现
可以运行的:
不能运行的:
查看电脑上C:\Windows\assembly\GAC\Microsoft.DirectX.Direct3DX(可以从VS引用浏览查看)发现Direct3DX有多个版本
原先使用的时1.0.2902.0版本大小约2614K,现在使用的版本1.0.2911.0大小约565K。(中间经过几次改进,内容少了许多,而且依赖也有所不同。正是这不同的依赖导致现在问题的发生。)
虽然说只要装DirectX就可以解决所有问题,但具体原因是什么呢,到底缺少了什么东西,中间改进了什么很难说。而且以后再遇到这些缺少依赖无法 运行的情况又怎么办?这些问题困扰我很长时间。我在网上找了许多相似问题的,大部分都说缺少dll,可是dll又存在(-_-!)。
问题就在于两个dll有什么区别,很明显大小不同。既然功能没有缩减,那么最新的肯定引用了别的库,电脑中 dll那么多我如何知道。可是找到最新dll的依赖上就是关键,然后我在网上找到了一个很棒的可以查询dll依赖的软件DependencyWalker。打开软件载入不同的dll可以看到以下结果。
原来旧的dll
新的dll
原先用的是Advapi.dll一个系统重要的dll,现在用的时D3dx9_30.dll,只有安装directx的电脑才存在。因此这就解释为什么部分电脑不能用。我将d3dx9_30.dll拷到我的程序目录下,结果可以打开。然后将d3x9_30.dll(注意有32和64两种版本)拷贝到对应的目录C:\Windows\System32和C:\Windows\SysWOW64下,删除我的程序目录下的dll,结果也可以运行。
以后遇到这种问题就可以通过软件找到对应dll,就可以解决了。
最后说一下光这个d3dx9就有24至43(20种)。(OvO!)