質問

最近、何か別のことを検索しているときに、別のサイトで C# ランタイム コンパイルに関する簡単な議論に遭遇し、そのアイデアは興味深いと思いました。これを使ったことがありますか?これをいつ、どのように使用して、どのような問題を解決できるかを判断しようとしています。あなたがそれをどのように使用したのか、またはそれがどのような文脈で意味をなすのかを聞きたいです。

どうもありがとう。

役に立ちましたか?

解決

通常、これは現在 Reflection を使用していて、パフォーマンスを最適化する必要がある場合に使用されます。

たとえば、リフレクションを使用してメソッド X を呼び出す代わりに、実行時に動的メソッドを生成してこれを実行します。

他のヒント

これを使用して、アプリケーションにスクリプトのサポートを追加できます。例としては、 ここ または ここ.

内部オブジェクト フレームワークの一部をスクリプト部分に公開することは非常に簡単に可能であるため、たとえば Office の VBA と同じ効果を持つものを比較的簡単にアプリケーションに追加できます。

私はこれ(ランタイムコンパイル/System.Reflection.Emitクラスの使用)を動的プロキシの生成で見てきました( コードプロジェクトのサンプル ) またはリフレクション呼び出しを (時間的に) 最適化するその他の手段。

これを使用できるケースの少なくとも 1 つは、動的コードを生成する場合です。たとえば、フレームワークはこれを内部で使用して、XML シリアライザーをオンザフライで生成します。実行時にクラスを調べた後、クラスをシリアル化/逆シリアル化するコードを生成できます。次に、そのコードをコンパイルし、必要に応じて使用します。同様に、任意の DB テーブルなどを処理するコードを生成できます。次に、生成されたアセンブリをコンパイルして読み込みます。

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 呼び出しが処理されます。かなりクール。

私は卒業論文で .NET のランタイム コンパイラ サービスを使用しました。基本的には、プロセスを視覚化するためのグラフィカル コンポーネントを視覚的に作成することでした。このコンポーネントは C# コードとして生成され、アセンブリにコンパイルされ、解釈されることなくターゲット システム上で使用できるようになり、より高速かつコンパクトになります。さらに、生成されたイメージをリソースとしてまったく同じアセンブリにパッケージ化することもできます。

これのもう 1 つの用途は Java です。私は、ユーザーが入力できる数値アルゴリズム(大学に戻っていたもの)を使用して、潜在的に高価な関数をプロットする必要があるアプリケーションを持っていました。入力した関数をクラスに配置し、コンパイルしてロードすると、比較的高速に実行できるようになりました。

以上が、ランタイム コード生成が良かったという私の 2 つの経験です。

私がこれを使用したのは、ユーザーがアドホックに C# および VB コードを実行できるようにするためでした。コード行 (または数行) を入力すると、そのコードがコンパイルされ、アプリ ドメインにロードされて実行され、その後アンロードされます。これはおそらくその使用例の最良の例ではありませんが、それでも一例です

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top