2012-07-25 74 views
4

我想使用反射動態加載GAC中程序集的最新安裝版本。從GAC動態加載最新的程序集版本

到目前爲止,我已經找到了多種工作方式來完成這個任務,但他們都有其特定的缺點。

最簡單的解決方案是使用Assembly.LoadWithPartialName()方法。但這種方法已經過時了,因爲.NET框架2:

var assembly = Assembly.LoadWithPartialName("Microsoft.WindowsAzure.ServiceRuntime"); 

另一種可能性是使用Assembly.Load()(所推薦的過時的警告),並調用不同的裝配版本的完全限定程序集名稱在try/catch塊獲取最新安裝的版本。這尖叫維護,只是看上去很髒:

Assembly assembly = null; 

try 
{ 
    assembly = Assembly.Load("Microsoft.WindowsAzure.ServiceRuntime, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); 
} 
catch (FileNotFoundException) { } 

try 
{ 
    assembly = Assembly.Load("Microsoft.WindowsAzure.ServiceRuntime, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); 
} 
catch (FileNotFoundException) { } 

最後但並非最不重要的還有another solution我發現這裏的SO使用Assembly.LoadFrom()方法,然後基本上導入組件管理器模塊fusion.dll推測的最新版本的路徑。對於這樣一個「簡單」的任務來說,這似乎太過分了。

沒有更好的解決方案來實現這一點,而無需使用過時的方法,使用魔法字符串或通過調用非託管代碼創建維護地獄?

在此先感謝!

+0

[Assembly.LoadFrom()](http://msdn.microsoft.com/en-us/library/system.reflection.assembly.loadfrom)如何? – 2012-07-25 22:28:46

+0

是的,這是第三種解決方案。但它需要fusion.dll來確定GAC中最新版本的路徑。 – 2012-07-25 22:30:04

回答

2

Fusion.dll ...呃。我會找到你的目標框架版本並枚舉所有的gas目錄,並簡單地根據根組件名稱查詢它們,這樣你唯一的魔術字符串就是程序集名稱。然後,使用Assembly.ReflectionOnlyLoadFrom靜態方法比較版本,直到找到最新的版本,然後使用Assembly.Load方法和相應的文件路徑參數。除非您已嚮應用程序提供適當的信任,否則您可能無法使用點擊一次下載。

// List of all the different types of GAC folders for both 32bit and 64bit 
// environments. 
List<string> gacFolders = new List<string>() { 
    "GAC", "GAC_32", "GAC_64", "GAC_MSIL", 
    "NativeImages_v2.0.50727_32", 
    "NativeImages_v2.0.50727_64" 
}; 

foreach (string folder in gacFolders) 
{ 
    string path = Path.Combine(@"c:\windows\assembly", folder); 
    if(Directory.Exists(path)) 
    { 
     Response.Write("<hr/>" + folder + "<hr/>"); 

     string[] assemblyFolders = Directory.GetDirectories(path); 
     foreach (string assemblyFolder in assemblyFolders) 
     { 
      Response.Write(assemblyFolder + "<br/>"); 
     } 
    } 
} 

請參閱this other answer here on stack overflow。我用它來成功地枚舉gac。

+0

沒有直接關係,但應該注意的是,有時DLL會在'temp'文件夾下安裝(?)出於某種奇怪的原因。 – itsho 2015-01-15 15:33:09