需要澄清:.NET运行时如何解析父文件夹中的程序集引用?

时间:2009-01-20 12:43:28

标签: .net assemblies reference resolution

我的解决方案中有可执行文件的以下输出结构:

%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的答案,但我仍然没有得到答案。

非常感谢!

4 个答案:

答案 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