【问题标题】:How to tell if a .NET assembly is dynamic?如何判断 .NET 程序集是否是动态的?
【发布时间】:2010-11-28 06:24:06
【问题描述】:

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

【问题讨论】:

    标签: .net dynamic assemblies


    【解决方案1】:

    检查程序集是否是动态的:

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

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

    更新:

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

    if (assembly.IsDynamic)
    

    【讨论】:

    • 不太正确。模块构建器可以是“非动态的”。您应该使用ModuleBuilder.IsTransient 来检查“动态”。
    【解决方案2】:

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

    【讨论】:

    • 微软终于提供了这个 :) 这显然是从现在开始的方式。
    【解决方案3】:

    在 .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; 
        } 
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 2010-12-08
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 2010-10-19
      • 1970-01-01
      相关资源
      最近更新 更多