.net动态程序集

时间:2010-03-07 00:54:45

标签: .net dynamic-assemblies

最近有人问我是否对.Net中的动态装配有所了解。简短的回答是 - 我没有。

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

  • 它们是什么(除了直接从记忆中运行)
  • 它们提供的静态组件有哪些优势
  • 真实世界的用法示例

非常感谢对上述任何解释。

非常感谢。

2 个答案:

答案 0 :(得分:7)

我会举几个例子:

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

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

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

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


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

答案 1 :(得分:6)

This article 有点陈旧,代码有点'质朴'但我会说它是关于动态编译和一些突出问题的最容易访问的文章之一。

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

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

祝你好运。

相关问题