19

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

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

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

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

非常感谢。

4

2 回答 2

7

我会给你一些例子:

  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 问题,描述了有人想要创建动态程序集的场景:
如何使用代码生成来动态创建 C# 方法?

于 2010-03-07T01:40:39.660 回答
6

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

这是我学习动态编译程序集的地方,无论是在我不需要卸载或控制安全性时在内存中,还是在临时文件中加载远程处理以允许卸载。

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

祝你好运。

于 2010-03-07T00:59:42.253 回答