【发布时间】:2010-11-28 06:24:06
【问题描述】:
当迭代一组程序集时,例如AppDomain.CurrentDomain.GetAssemblies(),如果您尝试访问 CodeBase 等属性,动态程序集将引发 NotSuportedException。如何在不触发和捕获 NotSupportedException 的情况下判断程序集是动态的?
【问题讨论】:
标签: .net dynamic assemblies
当迭代一组程序集时,例如AppDomain.CurrentDomain.GetAssemblies(),如果您尝试访问 CodeBase 等属性,动态程序集将引发 NotSuportedException。如何在不触发和捕获 NotSupportedException 的情况下判断程序集是动态的?
【问题讨论】:
标签: .net dynamic assemblies
检查程序集是否是动态的:
if (assembly.ManifestModule is System.Reflection.Emit.ModuleBuilder)
这花了我一段时间才弄清楚,所以在这里问和回答。
更新:
在 .NET 4.0 中,现在有一个属性:
if (assembly.IsDynamic)
【讨论】:
ModuleBuilder.IsTransient 来检查“动态”。
在 .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"));
}
}
在 .NET Framework 4 中,检查 Assembly.IsDynamic 属性应该是更可取的,因为它更清晰,也许更面向未来,以防出现一些覆盖 IsDynamic 的新类。由于 AssemblyBuilder.IsDynamic 始终返回 true,这进一步证明了 AssemblyBuilder 对象始终等同于“动态 dll”。
这是 .NET 4 AssemblyBuilder 的 IsDynamic:
public override bool IsDynamic
{
get {
return true;
}
}
【讨论】: