8

System.Reflection.Emit をしばらく使用していますが、バグが発生しやすいのと同じくらい苦痛です (そうでない人はいませんか?)。

SRE を直接操作するよりも安全で簡単な方法で IL を生成するために信頼できる、IL ジェネレーターの優れたラッパーがあるかどうか知っていますか?

編集:

式ツリーを操作することは、IL を直接出力するよりも断然簡単で安全であることはわかっていますが、現時点ではいくつかの制約もあります。コード ブロックを作成したり、ループを使用したり、複数のローカル変数を宣言して操作したりすることができません。.NET 4 がリリースされるまで待つ必要があります :)

さらに、既に SRE に依存しているコード ベースを扱っています。

明らかに、ILGenerator は私が必要とするすべてを行います。しかし、それを操作するときは、もっと助けていただければ幸いです。かなり低いレベルのままである ILGenerator ラッパーについて言及しているとき、次のようなメソッドを提供できるものについて考えます。

// Performs a virtual or direct call on the method, depending if it is a 
// virtual or a static one.
Call(MethodInfo methodInfo)

// Pushes the default value of the type on the stack, then emit 
// the Ret opcode.
ReturnDefault(Type type)

// Test the object type to emit the corresponding push 
// opcode (Ldstr, Ldc_I*, Ldc_R*, etc.)
LoadConstant(object o)

これは実際には 3 つの素朴な例ですが、私の予想を示すには十分かもしれません。これは一連の拡張メソッドとして見ることができますが、RunSharpのように条件付きステートメントとループをサポートすると便利です。実際、RunSharp は私が望むものにかなり近いですが、ILGenerator を抽象化しすぎて、そのすべての機能を公開していません。

どこかは思い出せませんが、オープンソース プロジェクトでそのようなヘルパーを見たことがあります。

4

3 に答える 3

6

.NET 3.5 を使用している場合は、式ツリーを使用する方が合理的であることに気付くかもしれません。それはあなたが何をしているかに完全に依存します - そしてそれはまだかなり苦痛になる可能性があります - しかし、それは確かに知っておくべき別のオプションです.

于 2008-10-13T08:32:24.203 に答える
4

[更新]: ;-p RunSharpという名前を考えました。私はそれを保証することはできませんが、それはあなたが必要としているものかもしれません.

でも; 何を生成する必要がありますか?CodeDomは 1 つのオプションです。メソッドを作成する場合、.NET 3.5 のExpressionクラスを使用すると、(Expression.Lambda/Compile.

于 2008-10-13T08:33:16.370 に答える
2

Mono.Cecilを使ってみる

Cecil は 、ECMA CIL 形式のプログラムとライブラリを生成および検査するためにJb Evainによって作成されたライブラリです。ジェネリックを完全にサポートし、デバッグ シンボル形式をサポートします。

于 2008-10-13T08:37:37.063 に答える