[解決済み】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
という名前空間があります。
関連
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み】なぜPythonのコードをコンパイルするのか?
-
[解決済み】なぜC#では==と!=の両方を定義しなければならないのか?
-
[解決済み] イベントAction<>とイベントEventHandler<>の比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。