你会在哪里使用C#运行时编译?

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

非常感谢。

通常情况下,我会在您当前使用Reflection并需要针对性能进行优化的情况下使用此方法。

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

您可以使用它为您的应用程序添加脚本支持。 有关示例,请查看此处或此处 。

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

我已经在生成动态代理( 代码项目示例 )或其他优化reflection调用(时间)的方法中看到了这一点(运行时编译/使用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)); 

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

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

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

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

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

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

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