我最近在另一个关于C#运行时编译的网站上进行了简短的讨论,同时搜索其他内容,并认为这个想法很有趣。你有没有用过这个?我试图确定如何/何时可以使用它以及它解决了什么问题。我非常有兴趣听听你是如何使用它的,或者在什么情况下使用它。

非常感谢。

有帮助吗?

解决方案

通常情况下,我会在您当前使用Reflection并需要优化性能的情况下使用此功能。

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

其他提示

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

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

我在生成动态代理时已经看到了这个(运行时编译/使用System.Reflection.Emit类)(代码项目样本)或其他优化反射调用的方法(按时间)。

至少有一种情况可以使用它是在生成动态代码时。例如,框架在内部使用它来动态生成XML序列化程序。在运行时查看类之后,它可以生成用于序列化/反序列化类的代码。然后它根据需要编译该代码并用户。 以同样的方式,您可以生成代码来处理任意数据库表等,然后编译并加载生成的程序集。

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

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

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

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

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

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

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

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

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

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

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

我使用它的原因是允许用户ad-hoc运行C#和VB代码。他们可以键入一行代码(或几行),然后将其编译,加载到app域中,然后执行,然后卸载。这可能不是它的最佳使用示例,但它是一个非常少的例子

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top