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