2

我有一个 Windows、C++ 软件项目(使用 Visual Studio 2005、SP1 构建),它具有以下(简化的)文件布局:

{App. Root Directory}
|-- bin
|   |-- Microsoft.VC80.CRT
|   +-- Microsoft.VC80.MFC
+-- utils

binutils目录中都有各种可执行文件。这些可执行文件中的每一个都依赖于我们存储在bin中的并行程序集(C++ 运行时 DLL),但出于各种原因,我们将它们隔离到这些单独的文件夹中(例如,utils文件夹中的 exe 是补充工具到我们的主要应用程序,并且不经常运行)。这种文件组织的直接结果是,utils文件夹中的应用程序无法在尚未安装适当的并行程序集的系统上运行(它们失败并显示通常的“系统无法执行指定的程序”错误信息)。

我的问题:有没有办法告诉utils文件夹中的应用程序明确地在..\bin文件夹中查找适当的并排程序集?Microsoft的Assembly Searching Sequence文章没有提到这是否可能。有没有一种聪明的方法可以解决这些应用程序的运行时要求?

我看到的潜在选择:

  1. 将并行程序集的副本放入utils文件夹中。这可以在运行时完成(以防止我们的应用程序安装包膨胀),但看起来有点脏。
  2. 静态链接运行时 DLL。我不想这样做!
  3. 让最终用户安装通常的可再发行包。我也不想这样做。
4

1 回答 1

4

我的第一反应是,从.\bin文件夹中分离实用程序有什么实际好处?我自己有强迫症倾向,我理解整洁的感觉,但是一旦可以明显地看到它对您部署应用程序的能力产生负面影响,继续练习似乎有点毫无意义。

也就是说,这实际上在技术上是可行的。为此,您可以使用 app.config 文件中的探测 privatePath元素。应用程序配置文件的工作方式与应用程序清单类似,但它们不能作为资源嵌入:在与 exe 相同的文件夹中创建一个文件,使用 exe 的全名(包括 exe 扩展名)并附加.config.

<!-- acme.exe.config -->
<configuration>   
  <windows>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="bin;..\bin" />
    </assemblyBinding>
  </windows>
</configuration>

有许多警告使该解决方案可能不可行 - 任何指定自己的依赖程序集的 dll 都需要具有包含probing privatePath元素的应用程序配置文件。此外,probing仅在 Windows NT 6.0 (Vista) 中添加了对节点的支持,因此如果您仍需要以 XP 为目标,则此解决方案不合适。

于 2012-04-30T20:42:33.443 回答