コードフラグメントのダイナミックコンパイルと実行:可能性の調査
テキストファイルまたは入力ストリームとして保存された一連のC#コードフラグメントがあると仮定します。それでは、従来の編集プロセスをバイパスして、これらのフラグメントを動的にコンパイルして実行できますか?
c#and static .net言語の世界では、Codedom(コードドキュメントオブジェクトモデル)がこの問題を解決するための鍵です。その使用は、動的コードの構築に限定されませんが、ランタイム中にコードフラグメントまたはクラス全体をコンパイルします。
例:Codedomを使用してコードフラグメントをコンパイルします次のC#コードフラグメントは、ダイナミックコードコンパイルにCodedomを使用する方法を示しています。 実行してコンパイルされたコード
コードコンパイルが完了したら、反射された動的読み込みプログラムセットを使用してコードを実行できます。
<code class="language-csharp">using Microsoft.CSharp; using System.Collections.Generic; using System.CodeDom.Compiler; using System.Linq; class Program { static void Main(string[] args) { // 创建C#代码提供程序并设置编译参数 var csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } }); var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" }, "foo.exe", true); parameters.GenerateExecutable = true; // 从源字符串编译代码 CompilerResults results = csc.CompileAssemblyFromSource(parameters, @"using System.Linq; class Program { public static void Main(string[] args) { var q = from i in Enumerable.Range(1,100) where i % 2 == 0 select i; foreach(var item in q) Console.WriteLine(item); } }"); // 处理编译错误 if (results.Errors.HasErrors) { foreach (CompilerError error in results.Errors) { Console.WriteLine(error.ErrorText); } } } }</code>
結論:
Codedomは、C#コードフラグメントの動的なコンパイルと実行のための強力なプラットフォームを提供します。コンピレーションとパフォーマンスの要件を満たしている間、コードセグメントのカスタムインターフェイスを定義する利点も提供します。 新しい.NETバージョンでの使用は、より近代的なRoslynコンパイラAPIを使用して、パフォーマンスと互換性を向上させることをお勧めします。以上がC#コードフラグメントを動的にコンパイルして実行できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。