2009-01-20 29 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