最近有人问我是否对 .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?