如何判断一个.NET程序集是dynamic的?

当遍历一组程序集(例如AppDomain.CurrentDomain.GetAssemblies())时,如果尝试访问CodeBase等属性,dynamic程序集将引发NotSuportedException。 你怎么知道一个程序集是dynamic的而不触发并捕获NotSupportedException呢?

要检查程序集是否是dynamic的:

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

这花了我一段时间才弄清楚,所以在这里要求和回答。

更新:

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

 if (assembly.IsDynamic) 

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

在.NET Framework 4之前,最简单的解决scheme似乎是检查Assembly是否为System.Reflection.Emit.AssemblyBuildertypes。 这是我们在我们团队中使用的解决scheme。

如果你看一下AssemblyBuilder的CodeBase属性实现,它会抛出一个exception,不pipe别的什么。 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对象总是等价于“dynamicdll”。

这里是.NET 4 AssemblyBuilder的IsDynamic:

 public override bool IsDynamic { get { return true; } }