最近、別のサイトで C# ランタイム コンパイルに関する簡単な議論を見つけましたが、他の何かを検索していて、そのアイデアは興味深いと思いました。これを使ったことがありますか?これをいつどのように使用するか、およびどのような問題を解決するかを判断しようとしています。あなたがそれをどのように使用したか、またはどのような文脈でそれが理にかなっているのかを聞くことに非常に興味があります.
どうもありがとう。
最近、別のサイトで C# ランタイム コンパイルに関する簡単な議論を見つけましたが、他の何かを検索していて、そのアイデアは興味深いと思いました。これを使ったことがありますか?これをいつどのように使用するか、およびどのような問題を解決するかを判断しようとしています。あなたがそれをどのように使用したか、またはどのような文脈でそれが理にかなっているのかを聞くことに非常に興味があります.
どうもありがとう。
通常、これは、現在 Reflection を使用していて、パフォーマンスを最適化する必要がある場合に使用されます。
たとえば、リフレクションを使用してメソッド X を呼び出す代わりに、実行時に動的メソッドを生成してこれを行います。
これ (ランタイム コンパイル/ System.Reflection.Emit クラスの使用) を動的プロキシ (コード プロジェクト サンプル ) の生成またはリフレクション呼び出しを最適化する他の手段 (時間単位) で見てきました。
C# は JIT (ジャストインタイム) コンパイラであるため、すべての C# コードは実行時にコンパイルされます。その場でクラスなどを作成するためにReflection.Emitを参照していると思います。Xml-Rpc.Net ライブラリで最近見た例を次に示します。
XML-RPC サービスのメソッド呼び出しと同じ署名を持つ C# インターフェイスを作成します。
IMyProxy : IXmlRpcProxy
{
[XmlRpcMethod]
int Add(int a, int b);
}
次に、私のコードで次のようなものを呼び出します
IMyProxy proxy = (IMyProxy)XmlRcpFactory.Create(typeof(IMyProxy));
これは実行時コード生成を使用して完全に機能するプロキシを作成するため、次のように使用できます。
int result = proxy.Add(1, 2);
これにより、XML-RPC 呼び出しが処理されます。かなりクール。
これを使用する可能性があるケースの少なくとも 1 つは、動的コードを生成する場合です。たとえば、フレームワークはこれを内部で使用して、その場で XML シリアライザーを生成しています。実行時にクラスを調べた後、クラスをシリアル化/逆シリアル化するコードを生成できます。次に、そのコードをコンパイルし、必要に応じて使用します。同様に、任意の DB テーブルなどを処理するコードを生成し、生成されたアセンブリをコンパイルして読み込むことができます。
私は卒業論文で .NET のランタイム コンパイラ サービスを使用しました。基本的には、プロセスの視覚化のためのグラフィカル コンポーネントを視覚的に作成することでした。これは、C# コードとして生成され、アセンブリにコンパイルされ、解釈されることなくターゲット システムで使用できるため、より高速でコンパクトになります。さらに、生成された画像をリソースとまったく同じアセンブリにパッケージ化することもできます。
それの他の使用法は Java でした。ユーザーが入力できる数値アルゴリズム(大学に戻った)を使用して、潜在的に高価な関数をプロットする必要があるアプリケーションがありました。入力した関数をクラスに入れ、コンパイルしてロードすると、比較的高速に実行できるようになりました。
これらは、実行時のコード生成が優れていた私の 2 つの経験です。
私がそれを使用したのは、C# および VB コードをユーザーがアドホックに実行できるようにするためでした。1 行 (または数行) のコードを入力すると、それがコンパイルされ、アプリ ドメインに読み込まれ、実行されてからアンロードされます。これはおそらくその使用法の最良の例ではありませんが、それでもなおその例です