.net 检查GAC是否有组件

.net 检查GAC是否有组件,.net,gac,.net,Gac,如何以编程方式检查程序集的GAC?您可以使用Fusion COM API。张俊峰写了一篇文章。但是,它是从2004年开始的,所以我不知道它的工作情况如何。您是想探测GAC中的某个程序集,还是只想知道该程序集存在于机器上 如果您不关心程序集是否实际在GAC中,而只是可以在计算机上加载(从appdomain),那么您可以将LoadAssembly与程序集名称(strong、common、full等)一起使用。如果程序集可以通过Fusion加载,那么它将被加载,然后您将知道它存在 即使不想变得复杂,您

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

您可以使用Fusion COM API。张俊峰写了一篇文章。但是,它是从2004年开始的,所以我不知道它的工作情况如何。

您是想探测GAC中的某个程序集,还是只想知道该程序集存在于机器上


如果您不关心程序集是否实际在GAC中,而只是可以在计算机上加载(从appdomain),那么您可以将LoadAssembly与程序集名称(strong、common、full等)一起使用。如果程序集可以通过Fusion加载,那么它将被加载,然后您将知道它存在

即使不想变得复杂,您也可以直接转到
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某些.不存在的.程序集相比

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

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

从.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");

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

使用基于COM的Fusion API是正确的方法,但是尝试一个程序集。加载并捕获FileNotFoundException要容易得多。@Mike Post:但它还有一个不幸的副作用,就是将程序集加载到应用程序域中,这并不是这里真正需要的。易用性并不总是胜过正确性(我认为它很少做到)。ReflectionOnlyLoad具有与将程序集加载到应用程序域相同的副作用。阅读文档中的细节。对于必须使用复杂的非托管COM Fusion API.Assembly.Load搜索其他位置而言,这只是一种不同的解决方法:默认加载上下文包含通过探测全局程序集缓存找到的程序集,如果运行时是托管的(例如,在SQL Server中),则主机程序集存储,以及应用程序域的ApplicationBase和PrivateBinPath。-将其与GlobalAssemblyCache属性结合起来可能是一个好主意推出
gacutil.exe
,捕获输出是我对过于复杂的定义,我喜欢让事情尽可能简单:)如果是在使用gacutil和Fusion API之间,那么这可能是有争议的。请参见我的答案:。您不能指望gacutil在所有环境中都可用——它是一个Visual Studio工具,在“正常的.NET运行时安装”中不可用。您无法分发gacutil.exe。这是违反许可证的。非常密切相关:而且: