我可以修改并排的汇编搜索序列吗?

时间:2012-04-30 19:09:47

标签: c++ windows visual-studio-2005 side-by-side winsxs

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

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

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

我的问题:有没有办法可以告诉 utils 文件夹中的应用,明确查看..\bin文件夹中相应的side-by装配?微软的Assembly Searching Sequence文章没有提及这是否可行。有没有一种聪明的方法可以解决这些应用程序的运行时要求?

我看到的潜在选项:

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

1 个答案:

答案 0 :(得分:3)

我的第一个回答是,将实用程序从.\bin文件夹中分离出来的实际好处是什么?我自己有强迫症的倾向,我理解整洁的感觉,但一旦它如此切实地被视为对您部署应用程序的能力产生负面影响,继续练习似乎毫无意义。

那就是说,实际上技术上是可行的。为此,您需要使用app.config文件中的probing 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元素的应用程序配置文件。 还仅在Windows NT 6.0(Vista)中添加了对probing节点的支持,因此如果您仍需要定位XP,此解决​​方案是不合适的。