2008-12-18 108 views
23

如何獲取(可能)在GAC中註冊的DLL的(物理)已安裝路徑?這個DLL是一個控件,可以在.Net應用程序以外的其他東西(包括除VS之外的其他IDE)中進行託管。安裝到GAC的DLL的(物理)(安裝的)路徑

當我使用System.Reflection.Assembly.GetExecutingAssembly()。位置時,它給出了winnt \ system32中GAC文件夾的路徑 - 或者在VS中的設計模式中給出了VS IDE的路徑。

我需要得到物理dll實際安裝的路徑 - 或VS的bin/debug或(release)文件夾。

原因是我需要在此文件夾中找到一個XML文件,它具有在設計模式和運行時都使用的配置設置。

或者最好如何處理這種情況?我有一個可疑的網絡位置,目前我正在使用設計模式...(不要認爲ApplicationData文件夾會削減它(但具有.Net版本soved,因爲它通過ClickOnce安裝,可以使用Clickonce數據文件夾))

回答

22

如果事情放在GAC得到,它實際上被複制到在%WINDIR%\組件的部位,如

C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll 

我假設你當您在GAC中安裝時查看有問題的程序集的位置時,可以看到類似的內容。這其實是正確的。 (在.NET 1.1中,當您查看GAC程序集的屬性時列出了「Codebase」,但這只是爲了向您顯示運行gacutil時原始文件的位置 - 它實際上並未指示要加載的內容。 )您可以閱讀more about that here

長話短說,你可能無法做你想做的事情。您可能希望將行爲切換爲相對於主應用程序集(Assembly.GetEntryAssembly())的行爲,或者將文件放置在某個衆所周知的位置,而不是基於環境變量被設置。

+0

我從一開始就想按照第二個建議去創建一個標準的ApplicationData文件夾 - 但它必須在下一個版本中發佈,現在已經太晚了。我已經得到它現在嘗試多個psosible路徑... – kpollock 2008-12-22 11:40:18

+1

+1這是一個偉大的鏈接 – 2010-08-30 08:53:39

3

您是否可以將資源嵌入到此DLL中?這樣,DLL在磁盤上的位置並不重要,因爲XML文件將遵循它。然後,您可以做這樣的事情:

Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyProject.MyXmlFile.xml"); 
XmlDocument d = new XmlDocument(); 
using (StreamReader r = new StreamReader(s)) 
{ 
    d.LoadXml(r.ReadToEnd()); 
} 
+0

這就是我們正在做的,但該文件是一個配置設置文件,這意味着我們必須針對不同的環境做多個構建。這個想法是做一個構建,並讓配置文件控制環境相關的設置。 – kpollock 2008-12-18 13:27:32

2

如果您正在尋找將GACed DLL保存在文件系統中的物理位置,請嘗試以下操作: start - > run - > c:\ windows \ assembly \ gac 如果您沒有找到你的DLL相關的文件夾在那裏,你可以在Windows資源管理器中做一個「Up」文件夾來顯示c:\ windows \ assembly中的所有文件夾結構。然後,您可以尋找GAC_MSIL或任何其他文件夾在那裏在你的DLL ....

乾杯, 斯里蘭卡

3

組裝工作後,影像複製到全局程序集緩存,我不認爲有任何追溯源程序集位置的元數據。

您想通過在GAC中部署來實現什麼目標?如果僅僅是爲了解決CLR的目的,那麼有一種替代方式可以解決你的問題。

不要GAC安裝DLL,而在註冊表中添加下列鍵,

32 bit OS : HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\foo 

64 bit OS : HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\foo 

爲Foo鍵(使用(此註冊表位置由CLR試圖解決的組件時擡頭)你最喜歡的名字而不是foo),你會看到一個鍵名「Default」。雙擊它並將該值設置爲組件存在的位置。 (絕對路徑是首選)

現在來自Visual Studio,您的客戶端應該能夠在「添加引用」對話框中看到您的程序集並可以使用它。

現在來到你的實際問題,

Assembly.GetExecutingAssembly()將返回在insatlled dll的存在位置的路徑。從那裏找到XML文件。 :)

注意:在註冊表項中,4.0.30319是您的應用程序所針對的.NET Framework版本。使用您的應用程序的任何版本。