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

时间:2009-09-14 20:27:50

标签: .net dynamic assemblies

在迭代一组程序集时,例如AppDomain.CurrentDomain.GetAssemblies(),如果您尝试访问CodeBase等属性,动态程序集将抛出NotSuportedException。如何在不触发和捕获NotSupportedException的情况下判断程序集是否是动态的?

3 个答案:

答案 0 :(得分:42)

检查装配是否是动态的:

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

我花了一段时间才弄明白,所以在这里被问及回答。

<强>更新

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

if (assembly.IsDynamic)

答案 1 :(得分:20)

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

答案 2 :(得分: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; 
    } 
}