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="Microsoft.DirectX.Direct3DX, Version=1.0.2902.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">       <SpecificVersion>False</SpecificVersion>       <HintPath>..\..\DirectX\Microsoft.DirectX.Direct3DX.dll</HintPath>     </Reference>

不能运行的:

<Reference Include="Microsoft.DirectX.Direct3DX, Version=1.0.2911.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">       <SpecificVersion>False</SpecificVersion>       <HintPath>..\..\DirectX\Microsoft.DirectX.Direct3DX.dll</HintPath>     </Reference>

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

1.0.2902.0__31bf3856ad364e35 1.0.2903.0__31bf3856ad364e35 1.0.2904.0__31bf3856ad364e35 1.0.2905.0__31bf3856ad364e35 1.0.2906.0__31bf3856ad364e35 1.0.2907.0__31bf3856ad364e35 1.0.2908.0__31bf3856ad364e35 1.0.2909.0__31bf3856ad364e35 1.0.2910.0__31bf3856ad364e35 1.0.2911.0__31bf3856ad364e35

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值