C#コードフラグメントをテキストファイル(または任意の入力ストリーム)に保存して、それらを動的に実行できるかどうか疑問に思っていましたか?私に提供されたものがMain()ブロック内で正常にコンパイルされると仮定すると、このコードをコンパイルおよび/または実行することは可能ですか?パフォーマンス上の理由からコンパイルしたいと思います。
少なくとも、実装する必要のあるインターフェイスを定義して、そのインターフェイスを実装するコード「セクション」を提供することができます。
C#/すべての静的.NET言語での最善の解決策は、そのようなことにCodeDOMを使用することです。(注として、他の主な目的は、コードのビット、またはクラス全体を動的に構築することです。)
これは、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
名前空間を使用してランタイムコンパイルされたコードを実行する方法を正確に示しています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加