.net 动态程序集

标签 .net dynamic-assemblies

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

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

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

  • 对上述任何解释将不胜感激。

    非常感谢。

    最佳答案

    我会给你一些例子:

  • ASPNET 为每个 ASPX、ASMX 或 ASHX 生成程序集并动态加载它们。这里真正的好处是应用程序代码可以以模板语言部署,并且可以动态编译和按需运行。动态部分使得部署模型非常简单方便,也意味着效率:只有被调用的页面才会被实际加载。
  • DotNetZip 在保存自解压存档时创建一个动态程序集。实际上它不是“从内存运行”,它最终被写入文件,所以这可能适合也可能不适合您对动态程序集的定义。程序集是在运行时动态创建的。但此时并未调用它。为什么要动态创建?因为 exe 需要能够使用特定的 Win32 图标,所以它可能需要版本号和其他属性。这些东西可以在编译时设置。此外,程序集的源代码源自模板,使用调用者提供的各种数据来填充模板中的插槽。因此,动态生成的程序集确实是正确的方法。
  • 在 .NET 的 ASMX Web 服务框架中,wsdl.exe 编译器(或 xsd.exe 工具)将生成用于序列化/反序列化 XML 消息的类型。它通常会发出将 XML 元素建模为公共(public)的类型 字段 .但是,虽然 DataGrid 和其他数据绑定(bind)控件可以使用
    对象作为数据源,它们只显示公共(public)
    房产 .因此,应用程序无法执行 Web 服务调用、取回对象数组,然后将其分配为 Datagrid 的源。我使用动态生成的程序集作为适配器,以允许数据驱动的控件使用 Web 服务调用的输出。 [我认为,随着 ObjectDataSource 和 .NET 中的其他变化,这个问题已经消失了]。
  • 在 .NET 内部,为特定类型实例化 System.Xml.Serialization.XmlSerializer 类会动态生成程序集。我想这里的胜利与任何 interpeted-vs-compiled 代码比较相同。在 xml 序列化中,基本思想是枚举类型的公共(public)字段和属性,然后发出一个 XML 文档,其中包含来自这些字段和 Prop 的值。如果应用程序不必在每次调用 XmlSerializer.Serialize() 时都使用 System.Reflection 来枚举类型的成员(非常慢),那不是很好吗?


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

    关于.net 动态程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2394699/

    相关文章:

    c# - 使用 compiletoMethod() 表达式树静态链接和编译运行时

    c# - 动态模块什么时候可以有类型加载异常?

    c# - .NET:从动态程序集中访问非公共(public)成员

    c# - 使用 C# 使用 Assembly GetManifestResourceStream 方法读取资源文件

    .net - 如何在 DataGrid 列标题上捕获 "Click"事件

    .net - 将主显示比例切换到 100% 的命令

    .net - 独特的 CodeCoverage 突出显示

    c# - 我需要锁吗?