[英]Run-time compilation of code in .net with better performance at compile time
在任何人将此标记为重复之前,请尝试了解我的需要
我有一个用C#ASP.NET MVC5创建的软件,用户基本上可以创建任何公式,否则,切换条件也可能会从我的自定义DLL(包括datediff,DatePart)中包含一些自定义函数。
因此,对于这种情况,我们在MSScriptControl的帮助下使用了VBScript,但是我们决定将C#之类的语法转换为公式。
我已经探索了很多类似CodeDom和Roslyn的方法,但是问题是,要编译10行代码,几乎需要AVG 130毫秒。 后来我也尝试实现比上面两个慢得多的CS-Script,因为它内部使用CodeDOM,Roslyn,MONO作为编译器选项。
现在我正在寻找的是VBScript的替代版本,它几乎需要11毫秒进行编译和执行。
请为这种情况建议我其他任何方式或工具。
`using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;`
`namespace abc
{
public class Abc
{
static void Main()
{
var code = @"
using System;
namespace First
{
public class program
{
public static int Main()
{
if(Convert.ToDateTime(""01-04-2019
10:25:00"")>Convert.ToDateTime(""01-04-2019 15:00:00""))
{
return 1;
}
else
{
return 0;
}
}
}
}";
Console.WriteLine(code);
var options = new CompilerParameters();
options.GenerateExecutable = false;
options.GenerateInMemory = false;
var provider = new CSharpCodeProvider();
var compile = provider.CompileAssemblyFromSource(options, code);
var type = compile.CompiledAssembly.GetType("First.program");
var abc = Activator.CreateInstance(type);`
`var method = type.GetMethod("Main");
var result = method.Invoke(abc, null);`
`Console.WriteLine(result); //output:`
`}`
`}`
`}`
我们在项目中确实遇到了类似的问题。 我们正在生成数百个小型c#文件,并逐个编译它们以从每个文件中获得一个功能(实际上,该文件位于内存中,因此我们不受IO限制)。
该操作很慢,我们尝试了很多方法来提高吞吐量(更新Roslyn,更改选项等)。 我们发现开始编译时会产生一些开销,该开销与其中隐含的代码量不是线性的。
到目前为止,我们的最终解决方案是我们拥有的最好的解决方案(但是如果有人有更好的主意,我们将不胜感激):组编译。 一次调用多个文件的编译器比多次调用相同数量的文件要快得多。
在您的情况下,我的建议是:将所有功能归为一组并立即进行编译。 如果您有1000个功能,则单个功能100ms会很痛苦,但1000个功能1s可以。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.