2009-12-19 134 views

回答

2

您可以使用Fusion COM API。張俊峯寫了一個managed wrapper。不過,從2004年開始,所以我不知道它的效果如何。

+2

使用基於COM的Fusion API是正確的方法,但嘗試使用Assembly.Load並捕獲FileNotFoundException更容易。 – 2010-02-20 22:33:36

+0

@Mike Post:但它也有將程序集加載到應用程序域中的不幸副作用,這並不是真正需要的。易用性並不總是勝過正確性(我認爲它很少這麼做)。 – casperOne 2011-05-30 15:22:46

+1

ReflectionOnlyLoad具有將程序集加載到應用程序域的相同副作用。閱讀文檔中的細則。這不得不使用複雜的非託管COM Fusion API。 – 2011-06-01 21:30:03

0

你想探討一個組件的GAC,或者你只是想知道該組件存在於機器上嗎?

如果你不在乎程序集實際上是在GAC中,但只是可以在機器上加載(從appdomain),你可以使用程序集名稱(強,普通,完整等)的LoadAssembly。如果程序集可以通過Fusion加載,那麼你會知道它存在。

15

即使不想變得複雜,你也可以剔除gacutil並捕獲輸出。例如,gacutil /l Microsoft.Practices.Unity給我:

Microsoft (R) .NET Global Assembly Cache Utility. Version 3.5.30729.1 
Copyright (c) Microsoft Corporation. All rights reserved. 

The Global Assembly Cache contains the following assemblies: 
    Microsoft.Practices.Unity, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31 
bf3856ad364e35, processorArchitecture=MSIL 

Number of items = 1 

gacutil /l Some.Nonexistant.Assembly

Microsoft (R) .NET Global Assembly Cache Utility. Version 3.5.30729.1 
Copyright (c) Microsoft Corporation. All rights reserved. 

The Global Assembly Cache contains the following assemblies: 

Number of items = 0 

這是很容易實現和分析,不依賴於任何第三方實現。

+2

刪除'gacutil.exe'並捕獲輸出是我對過度複雜的定義,我喜歡儘可能簡單:)如果在使用gacutil和Fusion API之間,它可能會有爭議。看到我的答案在這裏:http://stackoverflow.com/a/19459379/1004119。 – 2013-10-18 21:41:59

6

在.NET中,如果反射API - Assembly.Load(...)未找到程序集,它將拋出FileNotFoundException。 API需要一個完全合格的程序集名稱,所以我認爲它必須位於GAC中。我正在使用它來測試SQL Server精簡版的存在:

Assembly foo = Assembly.Load("System.Data.SqlServerCe, Version=3.5.1.0, " + 
    "Culture=neutral, PublicKeyToken=89845dcd8080cc91"); 
+1

Assembly.Load還搜索其他位置:默認加載上下文包含通過探測全局程序集緩存找到的程序集,如果運行時宿主(例如SQL Server)中的主機程序集存儲區,以及應用程序的ApplicationBase和PrivateBinPath域。 - http://msdn.microsoft.com/cs-cz/library/dd153782.aspx – Bohdan 2011-10-08 18:01:53

+1

也許這是一個想法,將其與http://msdn.microsoft.com/en-us/library/system結合使用。 reflection.assembly.globalassemblycache(v = vs.110).aspx GlobalAssemblyCache屬性 – ErikEJ 2014-02-21 12:10:50

7

最好使用ReflectionOnlyLoad方法。此方法將程序集加載到僅反射的上下文中,在該上下文中它可以被檢查但不被執行。