检查GAC以获取装配

时间:2009-12-19 19:43:21

标签: .net gac

如何以编程方式检查GAC以获取程序集?

5 个答案:

答案 0 :(得分:20)

即使没有尝试变得复杂,你也可以向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

这很容易实现和解析,并且不依赖于任何第三方实现。

答案 1 :(得分:7)

最好使用ReflectionOnlyLoad方法。此方法将程序集加载到仅反射上下文中,可以在其中检查但不执行。

答案 2 :(得分:6)

从.NET,反射API - Assembly.Load(...)如果找不到程序集将抛出FileNotFoundException。 API需要一个完全限定的程序集名称,因此我认为它必须在GAC中。我用它来测试SQL Server Compact Edition的存在:

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

答案 3 :(得分:2)

您可以使用Fusion COM API。张俊峰写了managed wrapper。但是从2004年开始,我不知道它的效果如何。

答案 4 :(得分:0)

您是想探测装配的GAC,还是只想知道装置上是否存在装配?

如果您不关心程序集实际上在GAC中,但只能在计算机上加载(来自appdomain),您可以使用具有程序集名称的LoadAssembly(强,常见,完整等)。如果可以通过Fusion加载程序集,那么您将知道它存在。