2016-09-13 3 views
4

データベースアプリケーションにC#スクリプトを統合しようとしています。私はグローバルオブジェクトを使用して、スクリプトからグローバル変数にアクセスできるようにしています。Roslyn/CSharpScript - コンパイル待ち時間を避けるためにコンパイルを保存/ロードする方法

初めてスクリプトをコンパイルすると待ち時間が不安です。
待機時間を避けるためにコンパイルを保存して読み込むにはどうすればよいですか?

Script<object> script = CSharpScript.Create(scriptCode, globalsType: typeof(MyGlobals)); 
script.Compile(); //<-- load the Compilation from database/file here 
script.RunAsync(myGlobalsInstance).Wait(); 
+0

おそらく、スクリプトの代わりに通常のアセンブリをコンパイルしてください。 – SLaks

+0

コンパイルを手動で作成する方法に関する情報はこちら[こちら](http://source.roslyn.io/#Microsoft.CodeAnalysis.CSharp.Scripting/CSharpScriptCompiler.cs,49) – m0sa

答えて

-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 

これで、ディスクに準拠したアセンブリが作成されました。動的にロードし、そこからクラスをインスタンス化し、メソッドを実行できます。スクリプトで実行するコードを設計して、いくつかの構成を受け入れるようにする必要があります。次の手順を実行する必要があります。

これで、このインスタンスで必要なことを行うことができます。例えば。 classInstance.ExecuteSomething(...)

+1

C#スクリプトは通常のC#とは異なりますが、おそらくCodeDOMでスクリプトをコンパイルしようとしてもうまくいかず、スクリプトを変更する必要があります。また、この作業を行っている場合、アセンブリをコンパイルできるRoslynの代わりにCodeDOMを使用する理由はありません。 – svick

1

CSharpScriptを作成し、GetCompilationでコンパイルしてコンパイルすることができます。コンパイルから

var script = CSharpScript.Create("script.."); 
var compilation = script.GetCompilation(); 

、することができます実際に compilation.Emit()ディスクやメモリへのDLLとPDB。トリッキーな(そしてロンリーンの内部ビット)は、アセンブリがあれば、コードのデリゲートをどのように実行させるかです。あなたはroslynがそれをどのようにしているか見ることができます here

+0

いいから、私はストリームにアセンブリを放出することができます。しかし、正しく理解していれば、コンパイルデータをCSharpScriptに戻す(単純な)方法はありませんか? – Bogomil

+1

アセンブリ(.dll)をお持ちの場合、なぜCSharpScriptが必要でしょうか?それをロードして(Assembly.Load)、型(Activator.CreateType)を作成し、実行するデリゲートを作成します。 – m0sa

+0

AFAIK c#スクリプトにはエントリポイントがなく、私の場合は "globals"変数のメンバーに直接アクセスする必要があります。つまり、私はストリームから再ロードしたいのですが、どうすればいいのかわかりません。 – Bogomil

関連する問題