我正在尝试将c#脚本集成到我的数据库应用程序中。我正在使用 globals 对象来从脚本中访问全局变量。
如果第一次编译脚本,我对等待时间不满意。
如何保存和加载编译以避免等待时间?
Script<object> script = CSharpScript.Create(scriptCode, globalsType: typeof(MyGlobals));
script.Compile(); //<-- load the Compilation from database/file here
script.RunAsync(myGlobalsInstance).Wait();
答案 0 :(得分:1)
您可以创建一个CSharpScript,然后通过GetCompilation
获取编译以获得编译。
var script = CSharpScript.Create("script..");
var compilation = script.GetCompilation();
从编译中,您实际上可以将compilation.Emit()
dll和pdb转换为磁盘或内存。棘手的(和roslyn内部位)是如何在程序集完成后让代码的代理执行。你可以看到roslyn如何做到here。
答案 1 :(得分:-1)
如果要进行预编译,可以使用System.CodeDom.Compiler;
中的类CompilerParameters opts = new CompilerParameters();
opts.OutputAssembly = <Destination FileName>;
opts.ReferencedAssemblies.AddRange(<needed references>);
//set other options;
var codeProvider = new Microsoft.CSharp.CSharpCodeProvider();
var results = codeProvider.CompileAssemblyFromFile(opts, <Your script source files>);
//check that there's no errors in the results.Errors
现在您在磁盘上有一个已编译的程序集。您可以动态加载它,从中实例化一个类并执行方法。您应该设计在脚本中运行的代码,它接受某些配置。您应该采取以下步骤:
var mydll = AppDomain.CurrentDomain.Load(<compiled Assembly From the previous step>);
var classInstance = <YouTypeOrInterface>mydll.CreateInstance(
<TypeFromTheAssembly>,
false,
BindingFlags.CreateInstance,
null,
new object[] { <Arguments you need to provides to your class constructor> }, CultureInfo.InvariantCulture, null);
现在,您可以使用此实例执行所需操作。例如。 classInstance.ExecuteSomething(...)