Direct托管的Microsoft.DirectX.Direct3DX.dll不同版本产生的问题

最近写的软件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)就可以看到,发现

可以运行的:

<Reference Include= False ..\..\DirectX\Microsoft.DirectX.Direct3DX.dll " class="has" height="70" src="http://img.e-com-net.com/image/info8/3e02c100bab244c6a57609f2f53dfbbc.png" width="963">

不能运行的:

<Reference Include= False ..\..\DirectX\Microsoft.DirectX.Direct3DX.dll " class="has" height="47" src="http://img.e-com-net.com/image/info8/67a0a8ae870b4ea6a6a3abe5aec960b1.jpg" width="650">

 查看电脑上C:\Windows\assembly\GAC\Microsoft.DirectX.Direct3DX(可以从VS引用浏览查看)发现Direct3DX有多个版本

Direct托管的Microsoft.DirectX.Direct3DX.dll不同版本产生的问题_第1张图片

原先使用的时1.0.2902.0版本大小约2614K,现在使用的版本1.0.2911.0大小约565K。(中间经过几次改进,内容少了许多,而且依赖也有所不同。正是这不同的依赖导致现在问题的发生。)

虽然说只要装DirectX就可以解决所有问题,但具体原因是什么呢,到底缺少了什么东西,中间改进了什么很难说。而且以后再遇到这些缺少依赖无法 运行的情况又怎么办?这些问题困扰我很长时间。我在网上找了许多相似问题的,大部分都说缺少dll,可是dll又存在(-_-!)。

问题就在于两个dll有什么区别,很明显大小不同。既然功能没有缩减,那么最新的肯定引用了别的库,电脑中 dll那么多我如何知道。可是找到最新dll的依赖上就是关键,然后我在网上找到了一个很棒的可以查询dll依赖的软件DependencyWalker。打开软件载入不同的dll可以看到以下结果。

原来旧的dll

Direct托管的Microsoft.DirectX.Direct3DX.dll不同版本产生的问题_第2张图片

 新的dll

Direct托管的Microsoft.DirectX.Direct3DX.dll不同版本产生的问题_第3张图片

原先用的是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!)

 

你可能感兴趣的:(我的BUG不可能这么可爱)