我有一个Windows,C ++软件项目(使用Visual Studio 2005,SP1构build)具有以下(简化)文件布局:
{App. Root Directory} |-- bin | |-- Microsoft.VC80.CRT | +-- Microsoft.VC80.MFC +-- utils
在bin和utils目录中都有各种可执行文件。 这些可执行文件中的每一个都依赖于我们存储在bin中的并行程序集(C ++运行时DLL),但是由于各种原因,我们已经将它们分离到这些单独的文件夹中(例如, utils文件夹中的exes是辅助工具到我们的主要应用程序,并不经常运行)。 由于此文件组织的直接结果, utils文件夹中的应用程序无法在尚未安装相应并行程序集的系统上运行(它们会以通常的“系统无法执行指定的程序”错误信息)。
我的问题:有没有一种方法可以告诉utils文件夹中的应用程序显式查找..\bin
文件夹中的相应的并排程序集? 微软的Assembly Searching Sequence文章没有提到这是否可能。 有没有一种巧妙的方法可以解决这些应用程序的运行时间要求?
我看到的潜在选项:
我的第一个反应是,从.\bin
文件夹中分离实用程序带来的实际好处是什么? 我自己也有OCD的倾向,我明白整洁的感觉,但是如果能够看到对你的应用程序部署能力产生负面影响,那么继续一个实践似乎是没有意义的。
这就是说,实际上在技术上是可行的。 要做到这一点,你使用app.config文件中的探测privatePath元素。 应用程序配置文件与应用程序清单的工作方式类似,不同之处在于它们不能作为资源进行嵌入:使用exe的全名(包括exe扩展名)和.config
创建与exe相同的文件夹。
<!-- 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这个解决方案是不合适的。