4

メソッドの本体を文字列で保持します。メソッドを動的に作成したい。しかし、私は知りません、その体を設定する方法。CodeDom を使用する非常に退屈な方法を見ました。また、OpCodes で Emit を使用しているのを見ました。文字列変数から準備完了のコードを使用する方法はありますか?

string method_body = "return \"Hello, world!\";"; //there is method body
DynamicMethod dm = new System.Reflection.Emit.DynamicMethod("My_method",
                 typeof(string), new Type[] { }); //any way to create method dynamically
//any way to set body
string result = (string)dm.Invoke(...); //I need write result in variable
4

3 に答える 3

7

あなたが望むのは「サービスとしてのコンパイラ」のようです。これは MS .NET 4.0 にはありませんが、それ以降のリリースにある可能性があります。しかし、それはすでにMonoにあります。それまでは、次のオプションを使用できます。

  • を使用CSharpCodeProviderしますが、リフレクションを介してメソッドとしてロードする(そしてデリゲートを作成する)必要があります
  • 使用するCodeDom
  • 使用するReflection.Emit
  • 使用するExpression

4.0 では、ExpressionAPI が 3.5 よりもはるかに充実しており、CodeDom. しかし、軽視しないReflection.Emitでください。スタックを理解して使用するには少し時間がかかりますILGeneratorが、人々が考えがちなほど悪くはありません。

補足として、一度だけ実行したい場合を除きInvoke、fromを使用しないでください。DynamicMethodより良いアプローチは、 を使用してからCreateDelegate、そのデリゲートを保存 (および再利用) することです。

var dm = new System.Reflection.Emit.DynamicMethod("My_method",
    typeof(string), null);
var il = dm.GetILGenerator();
il.Emit(OpCodes.Ldstr, "Hello, world!");
il.Emit(OpCodes.Ret);
Func<string> func = (Func<string>)dm.CreateDelegate(typeof(Func<string>));
var s = func();

またはExpressionAPI を使用:

var lambda =Expression.Lambda<Func<string>>(Expression.Constant("Hello, world"));
var func = lambda.Compile();
var s = func();
于 2010-06-07T06:14:02.057 に答える
2

これらの名前空間を確認する必要があります。

System.Reflection;
System.CodeDom.Compiler;
Microsoft.CSharp;

これはあなたが始めるかもしれません:http ://www.west-wind.com/presentations/dynamicCode/DynamicCode.htm

于 2010-06-07T05:17:07.670 に答える
1

これを .CS ファイルに保存し、その場でコンパイルして実行します。

于 2010-06-07T05:15:49.257 に答える