【问题标题】:Deploying C# application that uses DirectX assemblies部署使用 DirectX 程序集的 C# 应用程序
【发布时间】:2012-04-09 20:39:54
【问题描述】:

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

也就是说,我需要将应用程序部署给用户。在我的项目中,我引用了以下程序集:

  • 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, Version=1.0.2902.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或其依赖项之一。系统找不到指定的文件。

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

我的问题:

  1. 为什么 DirectX 有时会注册这些程序集而有时不会?
  2. 从内部引用 DirectX 程序集的正确方法是什么 申请?

【问题讨论】:

  • 它们在机器和开发 PC 上的程序集版本是否相同?
  • @Adam 实际上,我完全不确定。我的目标是可追溯到 2005 年的 DirectX 9 DLL。一些用户安装了 DirectX 11(当然是更新的)并且应用程序失败。我假设 DirectX 的更新版本也应该安装所有以前的 DLL 版本,以便实现应用程序兼容性。如果不是这种情况,我将不得不引用多个版本的程序集。我说的对吗?
  • 从 DirectX 文档看来,每个版本都已部署。您是否考虑过在您的安装包中包含 DirectX 安装。根据msdn.microsoft.com/en-us/library/windows/desktop/…
  • 因此,即使他们安装了它,安装也会悄悄地消失,但如果他们没有安装,它会静默安装然后继续。
  • DirectX 11 对以前版本的支持由于某种虚拟化而下降。如果您的程序需要 DirectX 9,则需要该版本,提供您在支持网站上构建的版本,并告诉用户安装该版本。为什么不针对 Direct X 11 构建?

标签: c# deployment directx assemblies


【解决方案1】:

对于您看到这些问题,我并不感到惊讶。您依赖的是一个极其陈旧、已停产且不再受支持的 API。出于兼容性目的,最新的运行时安装程序仍会安装程序集,但默认情况下不包含它们,因为它们不希望任何人使用它们。

老实说,他们真的很老了(比如,10 岁),他们有许多已知的错误和问题,永远无法修复,并且有完全可以接受的替代品。只要您继续支持您的应用,您就应该切换到其中之一或辞职来处理此类问题。

【讨论】:

  • 你是说安装程序集只能由离线运行时安装程序完成并且已经过时了吗?因为这将与我在客户端计算机上遇到的模式相匹配。正如我已经说过的,我知道不再支持使用托管 DirectX,但希望我仍然能够使用它(我真的没有使用任何高级 DirectX 技术,只是简单的 2D 渲染)。如果您是对的,那么必须在客户端计算机上运行离线安装程序。
  • 我不确定,因为我已经很久没有使用它了。找出答案的最佳方法是设置一个快速 VM 并运行各种安装程序并检查哪些安装了托管 DLL。
  • 虽然您的回答不能解决我的问题,但很明显您是对的,我不应该使用过时的库。谢谢你让我意识到这一点。 PS。程序集只能由离线安装程序安装。
【解决方案2】:

我在飞行模拟器中的 SimConnect DLL 中遇到过类似的情况。在这种情况下,如果用户在安装 .Net 框架之前安装了 Flight Simulator,则结果表明 DLL 没有添加到 GAC。

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

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

【讨论】:

  • 不幸的是,该问题也出现在 Windows 7 上。你是对的,.NET 默认安装在这个系统上,所以这不是我的问题的根源。不过,感谢您的洞察力。
  • 我遇到了同样的问题,唯一的逻辑解决方案是安装 Directx,@Daniel-van-os 是对的。这肯定会解决问题,但 Directx 存在兼容性问题,主要问题是我的软件将安装在许多 PC 上,并且添加 Directx 作为先决条件不是一个选项。再见 Directx,我肯定会看到另一个解决方案 :)。
猜你喜欢
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2011-10-05
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多