【问题标题】:.net dynamic assemblies.net 动态程序集
【发布时间】:2011-01-24 13:56:13
【问题描述】:

最近有人问我是否对 .Net 中的动态程序集有所了解。简短的回答是 - 我不知道。

我找到了大量描述如何创建动态程序集的文章,但没有一个能够真正解释以下内容:

  • 它们是什么(除了直接从内存中运行)
  • 与静态程序集相比,它们有哪些优势
  • 实际使用示例

任何对上述内容的解释将不胜感激。

非常感谢。

【问题讨论】:

    标签: .net dynamic-assemblies


    【解决方案1】:

    我会给你一些例子:

    1. ASPNET 为每个 ASPX、ASMX 或 ASHX 生成程序集并动态加载它们。这里真正的好处是应用程序代码可以以模板语言部署,并且可以动态编译并按需运行。动态部分使得部署模型非常简单方便,也意味着效率:只有被调用的页面才会被实际加载。

    2. DotNetZip 在保存自解压存档时会创建一个动态程序集。实际上它不是“从内存中运行”,它最终被写入文件,所以这可能适合也可能不适合您对动态程序集的定义。程序集 在运行时动态创建。但此时并未调用它。为什么要动态创建?因为 exe 需要能够使用特定的 Win32 图标,所以它可能需要版本号和其他属性。这些东西可以在编译时设置。此外,程序集的源代码源自模板,使用调用者提供的各种数据来填充模板中的插槽。因此,动态生成的程序集确实是正确的方法。

    3. 在 .NET 的 ASMX Web 服务框架中,wsdl.exe 编译器(或 xsd.exe 工具)将生成用于序列化/反序列化 XML 消息的类型。它通常会发出将 XML 元素建模为公共 字段 的类型。但是,虽然 DataGrid 和其他数据绑定控件可以使用 对象作为数据源,它们只显示公共 属性。因此,应用程序无法执行 Web 服务调用、取回对象数组,然后将其分配为 Datagrid 的源。我使用动态生成的程序集作为适配器,以允许数据驱动的控件使用 Web 服务调用的输出。 [我认为,随着 ObjectDataSource 和 .NET 中的其他变化,这个问题已经消失了]。

    4. 在 .NET 内部,为特定类型实例化 System.Xml.Serialization.XmlSerializer 类会动态生成程序集。我想这里的胜利与任何 interpeted-vs-compiled 代码比较相同。在 xml 序列化中,基本思想是枚举类型的公共字段和属性,然后发出一个 XML 文档,其中包含来自这些字段和道具的值。如果应用程序不必在每次调用 XmlSerializer.Serialize() 时都使用 System.Reflection 来枚举类型的成员(非常慢),那不是很好吗?


    这是一个最近的 SO 问题,描述了有人想要创建动态程序集的场景:
    How to use code generation to dynamically create C# methods?

    【讨论】:

      【解决方案2】:

      This article 有点过时了,代码也有点“土”,但我想说它是关于动态编译和一些突出问题的最容易理解的文章之一。 p>

      在这里我学会了即时编译程序集,既可以在我不需要卸载或控制安全性时在内存中编译,也可以通过远程处理加载到临时文件以允许卸载。

      一个真实的例子:一个在线 .net 正则表达式工具,它接受用于替换方法的 c# 代码,该替换方法被动态编译到沙盒程序集中,用于执行替换和丢弃。这种策略效果很好,但是无论沙盒如何都注入恶意代码的可能性太大,因此最终放弃了这个想法。

      祝你好运。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        • 1970-01-01
        • 2010-11-28
        相关资源
        最近更新 更多