如何以编程方式检查GAC以获取程序集?
答案 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加载程序集,那么您将知道它存在。