我的解决方案中有可执行文件的以下输出结构:
%ProgramFiles% | +-[MyAppName] | +-[Client] | | | +-(EXE & several DLL assemblies) | +-[Common] | | | +-[Schema Assemblies] | | | | | +-(several DLL assemblies) | | | +-(several DLL assemblies) | +-[Server] | +-(EXE & several DLL assemblies)
解决方案中的每个项目都引用了不同的DLL程序集,其中一些是解决方案中其他项目的输出,其他则是普通的第三方程序集。例如,[Client] EXE可能引用[Common]中的程序集,该程序集位于不同的目录分支中。
所有引用都将“Copy Local”设置为false,以镜像最终安装的应用程序中文件的布局。
现在,如果我看一下Visual Studio IDE中的引用属性,我会看到每个引用的“Path”是绝对的,它对应于程序集的实际输出位置。这是可以理解和正确的。正如预期的那样,解决方案编译并运行得很好。
我不明白的是,为什么一切似乎都工作,即使我关闭IDE,重命名[MyAppName]目录并手动运行[Client] EXE?如果引用路径与链接时的引用路径不同,运行时如何查找程序集?
要清楚 - 这实际上正是我所追求的:一个半分散的应用程序文件集,无论[MyAppName]目录位于何处,甚至它的名称都可以正常运行。我只想知道,如果没有任何特定的路径解决方案,这是如何以及为什么这样做。
我已经阅读了this similar question的答案,但我仍然没有得到答案。
非常感谢!
答案 0 :(得分:1)
AFAIK唯一的解决方案是在MyAppBase中至少拥有“stub”exes,然后在app.config中为每个应用程序定义子目录作为DLL的源。
NTFS确实支持“挂载”其他目录(即硬链接)作为子目录,但它们非常不自动,因为除了理论之外我没有尝试过这种方式,我无法判断它是否可以用作破解。
答案 1 :(得分:0)
以下是.Net如何找到所需的程序集:http://msdn.microsoft.com/en-us/library/yx7xezcf(VS.71).aspx
第4步是您可能感兴趣的内容:http://msdn.microsoft.com/en-us/library/15hyw9x3(VS.71).aspx
答案 2 :(得分:0)
您是否考虑过使用GACutil将共享程序集添加到Global Assembly Cache
答案 3 :(得分:0)
编译时,Common文件夹可能被指定为binpath参数吗?
(请参阅探测专用binpath)
http://msdn.microsoft.com/en-us/library/15hyw9x3%28VS.71%29.aspx
-Matt