如果我针对D3DX June2007_d3dx9_34构建我的应用程序并且目标系统有一个较新的版本Nov2007_d3dx9_36应该是一个问题吗?
我使用MS'redist-installer工具分发D3DX DLL,但我注意到一台'干净'的PC(之前没有安装过D3DX)我收到了关于丢失D3DX DLL的错误。在试图弄清楚安装程序本身是否工作之前,我想知道是否可能提供过于新版本的DLL问题 - 应用程序是否会查找具有确切名称的DLL?
答案 0 :(得分:2)
D3DX库不向后兼容,API可能会在不同版本之间发生变化。因此,目标系统必须具有与您构建应用程序相同的D3DX版本 - 较新版本将无效。
如果您在应用程序中使用Dependency Walker,它应该向您显示存在对具有确切版本号的DLL的依赖。
答案 1 :(得分:1)
DirectX SDK中的可再发行组件包括D3DX dll的完整历史记录。安装最新版本的DirectX可再发行组件应该让您的系统最终得到这些dll的每个版本。应用程序只允许通过从可再发行组件的目录结构中删除cab文件来安装所需的文件,以减少可再发行组件的大小,这就是为什么你最终可以得到43个dll但不是37例。
如果从应用程序中删除D3DX和D3DCOMPILER dll的依赖关系,您可以确保应用程序可以正常工作,因为d3d9 d3d10和d3d11核心dll与版本无关,并且还与Windows服务包版本绑定(即Vista的D3D11)例如来自Vista SP2或Win7库存安装。
另一种可能的方法是删除依赖项并让app启动是使dll成为延迟加载模块,因此只在需要时加载它(例如在开发环境中编译着色器)。只要您确定着色器存在于最终用户计算机上,就不需要编译着色器并且不会崩溃。调用LoadLibrary并手动调用函数将是一个更安全的选择,可以选择更好的错误消息,但需要做更多工作。