在遍历一组程序集(例如AppDomain.CurrentDomain.GetAssemblies())时,如果尝试访问CodeBase等属性,则动态程序集会抛出NotSupportedException异常。如何在不触发和捕获NotSupportedException的情况下判断一个程序集是否为动态程序集?
在遍历一组程序集(例如AppDomain.CurrentDomain.GetAssemblies())时,如果尝试访问CodeBase等属性,则动态程序集会抛出NotSupportedException异常。如何在不触发和捕获NotSupportedException的情况下判断一个程序集是否为动态程序集?
检查汇编是否为动态:
if (assembly.ManifestModule is System.Reflection.Emit.ModuleBuilder)
我花了一段时间才明白这个问题,所以在这里提问并回答。
更新:
在.NET 4.0中,现在有一个属性:
if (assembly.IsDynamic)
在.NET 4中,您还可以检查Assembly.IsDynamic属性。
在.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"));
}
}
public override bool IsDynamic
{
get {
return true;
}
}
ModuleBuilder
可以是“非动态的”。您应该使用ModuleBuilder.IsTransient
来检查是否为“动态的”。 - leppie