3

我目前对动态生成类型的理解是这样的:

如果您通过 CodeDom 生成一个类型并将其加载到 AppDomain 中,则无法在Assembly.Unload(...)不破坏整个 AppDomain 的情况下卸载该类型(即不存在)。

关于如何在运行时创建自定义类型还有其他想法吗?

C# 4.0dynamic关键字可以以某种方式神奇地使用吗?.NET 4ExpandoObject可以用一些可爱的方式吗?

可以将匿名类型和动态关键字与一些技术魔法结合起来吗?!感觉就像我们分散的工具可能会实现一些有用的东西。但我可能是错的。

4

1 回答 1

2

一旦程序集或类型被加载到 AppDomain 中,它就会一直存在,直到 AppDomain 被拆除,期间,没有例外。

这就是为什么 CodeDom 在大量使用时都是邪恶的。这是一个有保证的内存泄漏和性能问题。每次使用 CodeDom 编译都会生成一个新程序集。我认为你有几个选择:

  1. 为您的动态类型运行沙盒化 AppDomain。

  2. 在可以接受回收和池化的环境中运行您的主 AppDomain。显然,在客户端应用程序中,这是不可能的,但如果您在 ASP .NET 中运行,则可以添加代码来监控 AppDomain 中加载的程序集的数量,并在该数量达到临界点时请求回收。然后只需让 IIS 将您的 Web 应用程序池化,您仍然具有高可用性,因为您有多个 AppDomains 同时运行。

  3. 使用 TypeBuilder 和 Reflection.Emit。这使您可以为所有动态生成的类型使用一个动态程序集。

  4. 如果您想像使用 CodeDom 一样动态生成 C# 样式代码,您仍然可以将其与 TypeBuilder 结合使用,因此您的动态 C# 代码将在动态程序集中编译为 TypeBuilder,而不是每次都编译为新程序集。为此,您可以使用 MCS(单声道编译器服务)。您可以将 C# 格式的类传递给它,稍作调整,您就可以让它将您的代码编译为单个动态程序集。请参阅Mono 编译器即服务 (MCS)

于 2011-05-10T13:58:30.623 回答