检查GAC以获取装配

Jes*_*ssy 25 .net gac

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

jas*_*son 22

甚至没有尝试变得复杂,你可以掏空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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

  • 抛出`gacutil.exe`并捕获输出是我过于复杂的定义,我喜欢尽可能保持简单:)如果是在使用gacutil和Fusion API之间那么它可能是有争议的.请参阅我的回答:http://stackoverflow.com/a/19459379/1004119. (2认同)

BAL*_*aph 7

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


Str*_*ter 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");
Run Code Online (Sandbox Code Playgroud)


Dav*_*own 2

您可以使用 Fusion COM API。张俊峰写了一个托管包装器。不过,这是 2004 年的,所以我不知道它现在效果如何。

  • 使用基于 COM 的 Fusion API 是真正正确的方法,但尝试 Assembly.Load 并捕获 FileNotFoundException 要容易得多。 (2认同)