11

我最近在另一个网站上偶然发现了一个关于 C# 运行时编译的简短讨论,当时我正在搜索其他内容,并认为这个想法很有趣。你用过这个吗?我正在尝试确定如何/何时可以使用它以及它解决了什么问题。我很想听听您是如何使用它的,或者在什么情况下它是有意义的。

非常感谢。

4

7 回答 7

7

通常,我看到这用于您当前正在使用反射并且需要优化性能的情况。

例如,不是使用反射来调用方法 X,而是在运行时生成一个动态方法来为您执行此操作。

于 2008-09-27T16:46:20.007 回答
5

您可以使用它为您的应用程序添加脚本支持。例如看这里这里

将您的内部对象框架的一部分发布到脚本部分是很容易的,因此您可以相对轻松地向您的应用程序添加一些具有相同效果的东西,例如 Office 的 VBA。

于 2008-09-27T18:56:11.770 回答
3

我在生成动态代理(代码项目示例 )或其他优化反射调用的方法(时间方面)时看到了这一点(运行时编译/使用 System.Reflection.Emit 类)。

于 2008-09-28T17:24:22.230 回答
2

至少在生成动态代码时可能会用到它。例如,框架在内部使用它来动态生成 XML 序列化器。在运行时查看一个类后,它可以生成代码来序列化/反序列化该类。然后它编译该代码并根据需要使用它。以同样的方式,您可以生成代码来处理任意 DB 表等,然后编译和加载生成的程序集。

于 2008-09-27T16:49:43.897 回答
2

好吧,所有 C# 代码都是运行时编译的,因为它是 JIT(即时)编译器。我假设您指的是 Reflection.Emit 来动态创建类等。这是我最近在 Xml-Rpc.Net 库中看到的一个示例。

我创建了一个与 XML-RPC 服务的方法调用具有相同签名的 C# 接口,例如

IMyProxy : IXmlRpcProxy
{
    [XmlRpcMethod]
    int Add(int a, int b);
}

然后在我的代码中我称之为

IMyProxy proxy = (IMyProxy)XmlRcpFactory.Create(typeof(IMyProxy));

这使用运行时代码生成来为我创建一个功能齐全的代理,所以我可以像这样使用它:

int result = proxy.Add(1, 2);

然后它会为我处理 XML-RPC 调用。很酷。

于 2008-09-27T16:52:45.933 回答
2

我在毕业论文中使用了来自 .NET 的运行时编译器服务。基本上,它是关于可视化地为过程可视化创建一些图形组件,这些组件生成为 C# 代码,编译成程序集,然后可以在目标系统上使用而无需解释,以使其更快、更紧凑。而且,作为奖励,生成的图像可以打包到与资源相同的程序集中。

它的另一个用途是在 Java 中。我有一个应用程序,它必须使用用户可以输入的一些数值算法(回到大学)来绘制一个可能很昂贵的函数。我将输入的函数放入一个类中,编译并加载它,然后它可以用于相对快速的执行。

所以,这是我的两个经验,运行时代码生成是一件好事。

于 2008-09-27T17:12:52.313 回答
2

我使用它的目的是允许 C# 和 VB 代码由用户临时运行。他们可以输入一行代码(或几行代码),然后将其编译、加载到应用程序域中、执行,然后卸载。这可能不是其用法的最佳示例,但仍然是一个示例

于 2008-09-27T17:18:00.040 回答