2009-01-20 28 views
1

我有可执行以下输出结构,我的解决方案:需要澄清:.NET运行时如何从父文件夹解析程序集引用?

 
%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中的引用属性,我会看到每个引用的“路径”都是绝对的,并且它对应于程序集的实际输出位置。这是可以理解和正确的。正如所料,解决方案编译并运行得很好。

我不明白为什么即使关闭IDE,重命名[MyAppName]目录并手动运行[Client] EXE,为什么一切似乎都能正常工作?如果参考路径与链接时不相同,运行时如何找到程序集?

要清楚 - 这实际上正是我所追求的:无论[MyAppName]目录位于何处,甚至是什么名称,都能正常运行的半分散应用程序集。我只想知道,如何以及为什么在没有任何特定路径解决方案的情况下工作。

我已阅读this similar question的答案,但我仍然不明白。

非常感谢!

回答

1

AFAIK唯一的解决方案是在MyAppBase中至少有“stub”exes,然后在每个应用程序的app.config中为DLL的源定义子目录。

NTFS确实支持将其他目录(即硬链接)“挂载”为子目录,但它们是非常不自动的,因为除了理论之外我还没有尝试过这种方式,所以我不能确定这是否会起作用黑客。

+0

如何在app.config中定义DLL源代码? – 2011-01-05 05:42:11

0

你有没有考虑使用GACutil到您的共享组件添加到Global Assembly Cache

+0

否。据我了解,GAC旨在用于共享程序集。就像“由多个应用程序使用的那些”一样。我的程序集不被其他应用程序共享 - 它们对我的应用程序的安装(无论是客户端部分,服务器部分还是在极少数情况下都是)都是私有的。 – aoven 2009-01-20 14:02:13