如何判断一个.NET程序集是否是动态的?

44

在遍历一组程序集(例如AppDomain.CurrentDomain.GetAssemblies())时,如果尝试访问CodeBase等属性,则动态程序集会抛出NotSupportedException异常。如何在不触发和捕获NotSupportedException的情况下判断一个程序集是否为动态程序集?

3个回答

44

检查汇编是否为动态:

if (assembly.ManifestModule is System.Reflection.Emit.ModuleBuilder)

我花了一段时间才明白这个问题,所以在这里提问并回答。

更新:

在.NET 4.0中,现在有一个属性:

if (assembly.IsDynamic)

6
有些不正确。 ModuleBuilder 可以是“非动态的”。您应该使用 ModuleBuilder.IsTransient 来检查是否为“动态的”。 - leppie

22

在.NET 4中,您还可以检查Assembly.IsDynamic属性。


微软终于提供了这个 :) 从现在开始,这显然是前进的方向。 - Mike Stockdale

0

在.NET Framework 4之前,最简单的解决方案似乎是检查程序集是否为System.Reflection.Emit.AssemblyBuilder类型。这是我们团队使用的解决方案。

如果您查看AssemblyBuilder的CodeBase属性实现,它只会抛出异常,而不考虑其他任何因素。AssemblyBuilder还是一个密封类,因此派生类无法更改此行为。因此,如果您有一个AssemblyBuilder对象,可以确定您永远无法调用CodeBase或GetManifestResourceStream或一堆其他方法。

public override string CodeBase
{
    get
    {
        throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicAssembly"));
    }
}

在.NET Framework 4中,检查Assembly.IsDynamic属性应该更可取,因为它更易读,也许更具未来性,以防某个新类出现并覆盖了IsDynamic。由于AssemblyBuilder.IsDynamic始终返回true,这更证明了一个AssemblyBuilder对象总是等同于一个“动态dll”。
以下是.NET 4 AssemblyBuilder的IsDynamic:
public override bool IsDynamic
{ 
    get {
        return true; 
    } 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接