2012-03-26 64 views
2

我正在开发使用DirectX进行图形渲染的应用程序。我必须指出,我没有使用XNA或SlimDX,尽管我可能应该这样做。但是,在项目启动时我不知道这一点,现在已经太晚了,因为需要很长时间才能转换为其中的任何一个。部署使用DirectX程序集的C#应用​​程序

也就是说,我需要将应用程序部署到用户。在我的项目,我引用如下组件:

  • Microsoft.DirectX
  • Microsoft.DirectX.Direct3D
  • Microsoft.DirectX.Direct3DX

我只需要这些组件,闲来无事。用户需要在其计算机上安装DirectX作为先决条件。因此,我发现将这些DirectX DLL包含到我的应用程序文件夹或GAC中是不必要的。

我遇到了一些环境问题,而其他工作完美。我追溯了DirectX程序集是否在%windir%\ assembly中注册的问题。如果此处列出了DirectX程序集,则运行该应用程序。如果没有 - 它无法启动。

问题是,即使DirectX安装在所有计算机上(dxdiag的作品,其中列出了DirectX文件),其中一些计算机中没有列出这些程序集。发生这种情况时,应用程序失败,System.IO.FileNotFound例外:

无法加载文件或程序集“Microsoft.DirectX.Direct3D,版本= 1.0.2902.0,文化=中性公钥= 31bf3856ad364e35”或一个的依赖关系。该系统找不到指定的文件。

例如,如果最新的独立安装程序是从Microsoft网站下载并安装的,则会注册程序集。当他们没有安装时,我不确定这种情况,但它发生了。经常。

我的问题:

  1. 为什么有时的DirectX注册这些组件有时不?
  2. 从 应用程序中引用DirectX程序集的正确方法是什么?
+0

它们是不同机器和开发PC上的相同组件版本吗? – 2012-03-26 10:34:25

+0

@Adam其实,我不确定。我的目标是可以追溯到2005年的DirectX 9 DLL。一些用户正在安装DirectX 11(当然这是更新的),并且应用程序失败。我认为更新版本的DirectX应该安装所有以前的DLL版本,以便允许应用程序兼容性。如果不是这种情况,我不得不引用多个版本的程序集。我对吗? – 2012-03-26 11:10:16

+0

从DirectX文档看,它看起来好像部署了每个版本。你有没有想过在你的安装包中包含DirectX安装。按照http://msdn.microsoft.com/en-us/library/windows/desktop/ee416644(v=vs.85).aspx – 2012-03-26 11:52:03

回答

2

我不惊讶你看到这些问题。您依赖于一个非常陈旧,停产且不再受到支持的API。最新的运行时安装程序仍会安装程序集以达到兼容目的,但它们并未默认包含在内,因为它们不希望任何人使用它们。

老实说,他们真的很老(10岁),他们有许多已知的错误和问题,将永远不会被修复,并有完全可以接受的替代品。只要你继续支持你的应用程序,你就应该切换到其中的一个或者辞职以处理类似的问题。

+0

您是否在说安装程序集只能由脱机运行时安装程序完成,并且已过时?因为那符合我在客户端计算机上遇到的模式。正如我已经说过的,我知道使用Managed DirectX不再支持,但希望我仍然能够使用它(我真的没有使用任何先进的DirectX技术,只是一个普通的2D渲染)。如果你是对的,运行离线安装程序必须在客户端计算机上强制执行。 – 2012-04-01 10:44:12

+0

我不知道,因为我使用它已经很长时间了。找出最好的方法是建立一个快速虚拟机并运行各种安装程序,并检查哪些安装托管的DLL。 – MikeP 2012-04-01 14:11:28

+0

虽然你的回答并没有解决我的问题,但你是对的非常明显,我不应该使用过时的库。感谢让我意识到这一点。 PS。装配仅由脱机安装程序安装。 – 2012-05-23 11:26:51

2

我曾经经历过类似SimConnect DLL的飞行模拟器的一部分。在这种情况下,事实证明,如果用户在安装.Net框架之前安装了Flight Simulator,则该DLL不会添加到GAC中。

我的猜测是这里发生了类似的事情。

这当然意味着它只能在默认没有.Net的XP系统上发生,并且在.Net安装完成后重新安装DX后应该修复。

+0

不幸的是,这个问题也发生在Windows 7上。你是对的,在这个系统上默认安装.NET,所以在我的情况下这不能成为问题的根源。尽管如此,感谢您的洞察力。 – 2012-03-26 11:18:50

+0

我遇到同样的问题,唯一的逻辑解决方案是安装Directx,@ Daniel-van-os是对的。这肯定会解决问题,但Directx存在兼容性问题,主要问题是我的软件将安装在许多PC中,并且不能将Directx作为先决条件添加。所以再见Directx,我会看到另一个解决方案:)。 – Samidjo 2013-01-26 09:16:30