编译代码的序列化

时间:2018-01-24 08:13:12

标签: c# serialization compilation

一个我无法弄清楚的问题,我正在玩一个我正在制作的小工具,我的想法是我允许用户他/她编写他/她自己的C#代码,然后我保存将代码编入DB中,一旦他们希望运行该脚本,我只需执行以下代码:

 var Script = CSharpScript.Create<string>(ScriptText, options, typeof(Script_Host));
 var _Compilation = Script.Compile();

 ScriptRunner<string> runner = Script.CreateDelegate();

 Script_Host globals = new Script_Host();
 globals._Parent = this;
 globals._ConnectionString = _ConnectionString;
 globals.Source = Source;
 globals.Destination = Destination;
 globals.Parameters = Parameters;
 globals.Result = "";
 _ScriptResult = runner(globals).Result;
 Result = _ScriptResult;

所以我已经编译了代码并且它可以运行并且它可以工作,这很好,但它有一个缺陷。这意味着每次用户想要运行代码时我都必须使用那段代码,编译并运行它......这需要时间。

现在我只想获取compiled代码,将其序列化并将其作为varbinary插入到数据库中...因此每个脚本只编译一次(如果他们正在进行更新,则编译更多)并且&# 39; s .. ..

到达compiled脚本的最佳方法是什么,如何将其转换为varbinary?

1 个答案:

答案 0 :(得分:1)

您正在使用错误的工具来完成工作。 脚本是关于&#34;快速执行一串代码&#34;如果你想动态制作程序集并让它们围绕标准的编译过程是更好的方法......

执行一个简单的脚本:

await CSharpScript.EvaluateAsync("Console.WriteLine(\"Hello world!\")");

创建程序集:

https://docs.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/generating-and-compiling-source-code-from-a-codedom-graph

...这里的结果是你最终得到了一个物理程序集,你可以重用它而不是基于ram中生成的浮点数blob的上下文。