c#-4.0 - 有什么方法可以在运行时创建动态类型,而无需将它们永久保留在应用程序域中?

标签 c#-4.0 dynamic-typing

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

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

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

能否神奇地使用 C# 4.0 dynamic 关键字?可以使用 .NET 4 ExpandoObject 吗?

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

最佳答案

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

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

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

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

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

  4. 如果您想像使用 CodeDom 那样动态生成 C# 样式代码,您仍然可以将它与 TypeBuilder 结合使用,这样您的动态 C# 代码就会在动态程序集中编译为 TypeBuilder,而不是编译为每次都有新的装配。为此,您可以使用 MCS(Mono 编译器服务)。您可以将 C# 格式的类传递给它,并稍加调整,就可以让它将您的代码编译为单个动态程序集。参见 Mono Compiler as a Service (MCS)

关于c#-4.0 - 有什么方法可以在运行时创建动态类型,而无需将它们永久保留在应用程序域中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5951025/

相关文章:

c# - 在c#中,定义纯方法的规则是什么?

c# - 如何使用 C# 从 .asc 文件中的特定位置读取数据

objective-c - Objective-C 中的动态类型和返回值

java - 如何在 Java 中动态创建类型实例

c# - 无法将服务引用添加到自承载 WCF 服务

c# - MySQL 和 C#.NET DataGridView、更新、插入和删除

mysql - NHibernate 数据库创建后如何将固定数据插入数据库?

class - 如何处理类内部的多态性

python - 如何使用 Python 执行方法接口(interface)?

php - PHP 中一个没有意义的字符串