1. ホーム
  2. c#

[解決済み】C#のコードフラグメントを動的にコンパイルして実行することは可能ですか?

2022-04-12 14:36:42

質問

C#のコード断片をテキストファイル(または任意の入力ストリーム)に保存し、それらを動的に実行することは可能でしょうか?私に提供されたものは、任意のMain()ブロック内で正常にコンパイルされると仮定すると、このコードをコンパイルおよび/または実行することは可能でしょうか?私はパフォーマンス上の理由から、それをコンパイルすることを好む。

少なくとも、彼らが実装する必要のあるインターフェースを定義し、そのインターフェースを実装したコードの「セクション」を提供することは可能です。

どのように解決するのか?

C#/すべての静的な.NET言語における最良の解決策は、以下のようになります。 コードドム などに使用します。(注釈として、他の主な目的はコードの断片やクラス全体を動的に構築することです)。

以下は LukeHのブログ LINQを使った遊び心もある。

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.CSharp;
using System.CodeDom.Compiler;

class Program
{
    static void Main(string[] args)
    {
        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;
              }
            }");
        results.Errors.Cast<CompilerError>().ToList().ForEach(error => Console.WriteLine(error.ErrorText));
    }
}

ここで最も重要なクラスは CSharpCodeProvider これはコンパイラを利用して、その場でコードをコンパイルします。もしコードを実行したいのであれば、アセンブリを動的にロードして実行するために、ちょっとしたリフレクションを使うだけでよいのです。

これ は C# の別の例で、(少し簡潔ではありますが)さらに、実行時にコンパイルされたコードを System.Reflection という名前空間があります。