我们将在哪里使用C#运行时编译?

时间:2020-03-06 14:49:38  来源:igfitidea点击:

最近,我在另一个站点上进行了有关Cruntime编译的简短讨论,当时我在寻找其他东西,并认为这个想法很有趣。你有没有用过这个?我正在尝试确定如何/何时使用此功能以及它可以解决什么问题。我会对我们如何使用它或者在什么情况下有意义感到非常感兴趣。

非常感谢。

解决方案

通常,我会在我们当前使用Reflection且需要优化性能的情况下看到此用法。

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

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

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

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

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的运行时编译器服务。基本上,这是关于以可视方式创建一些用于过程可视化的图形组件,该组件以Ccode生成,编译为程序集,然后可以在目标系统上使用而无需解释,从而使其更快,更紧凑。而且,作为奖励,可以将生成的图像打包为与资源相同的程序集。

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

因此,这是我的两次经验,其中运行时代码生成是一件好事。

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

我们可以使用它向应用程序添加脚本支持。有关示例,请在此处或者此处。

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

我已经在生成动态代理(代码项目示例)或者优化反射调用的其他方式(按时间)中看到了这种情况(运行时编译/ System.Reflection.Emit类的使用)。