2011-04-07 55 views
0

我正在開發一個項目,想單獨共享組件形式的項目文件夾大會SearchPath中通過%PATH%環境

+ Program Files 
    + My Company 

     +Commons 
      * Assembly1.dll 
      * Assembly2.dll 
      * Assembly3.dll 
      * Assembly4.dll 

     +Project1 
      * MyProject1.exe 
      * MyProject1.exe.config 

     +Project2 
      * MyProject2.exe 
      * MyProject2.exe.config 

試圖讓從「共享」文件夾中的項目負荷組件,所以我改變系統%PATH %環境來搜索DLL。

%PATH% = c:\Program files\My Company\Commons;%PATH% 

,但他們不擡頭看路環境(ProcessMonitor監控) 有人能告訴我如何定義從%PATH%環境組件搜索路徑的方式。

回答

4
string path = System.Environment.GetEnvironmentVariable("Path"); 
var folders = path.Split(';'); 
foreach (var folder in folders) 
{ 
    foreach (var file in Directory.GetFiles(folder, "*.*")) 
    { 
     // found files 
    } 
} 

執行搜索在AppDomain.AssemblyResolve事件找到DLL時您的應用程序正在啓動。有關這裏的事件的更多信息:http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx

+1

請注意,路徑變量可能包含不存在的目錄(例如,如果某個應用程序未經清理而卸載),因此您應該在執行Directory.GetFiles()之前使用Directory.Exists()檢查該路徑。 – 2012-09-30 07:04:03

+0

@DerrickCoetzee:好評。謝謝 – jgauffin 2012-09-30 08:01:35

0

我不相信dotNET在綁定程序集時依賴於路徑環境變量。

對於dotNET綁定策略,請參閱http://ondotnet.com/pub/a/dotnet/2003/03/17/bindingpolicy.html

特別是,你可以在這裏找到有用的元素: http://msdn.microsoft.com/en-us/library/efs781xb%28v=VS.100%29.aspx

+0

我已經嘗試將privatePath設置爲app.config,但路徑應該在項目文件夾下進行搜索。如果我將其設置爲「../Commons」,它不會查看上層文件夾。我希望myapp通過%PATH%環境搜索DLL。謝謝 – idemirel 2011-04-07 09:07:41

+0

我發現將私有程序集和GAC作爲包含引用程序集的唯一路徑很簡單。保留引用的DLL的幾個副本幾乎沒有什麼害處。好處是它非常清楚您的應用程序將使用哪個程序集。 – GregC 2011-04-07 09:10:59