.net动态程序集

Pea*_*nut 18 .net dynamic-assemblies

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

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

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

对上述任何解释都将非常感激.

非常感谢.

Che*_*eso 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()时,这不是很好吗?


这是一个最近的SO问题,描述了有人想要创建动态程序集的场景:
如何使用代码生成来动态创建C#方法?


Sky*_*ers 6

这篇文章有点过时了,代码有点"质朴",但我想说它是关于动态编译和一些突出问题的最容易访问的文章之一.

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

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

祝好运.