理想的には、CreateObject
デリゲートを使用したいのですが、これらの動的メソッドを生成するコードは任意の型(少なくともプリミティブ、構造体、&クラスインスタンス)を処理できるデシリアライザ用です。しかし、CreateObject
デリゲートタイプの問題が発生しましたので、デバッグのためにCreateRectangle
デリゲートを試してみることにしました。私はもう少し働いている解決策に近づいたが、他の何かが正しくない。どちらのケースでも私のコードに何が間違っていますか?つまり、動的メソッドをCreateObject
とCreateRectangle
の両方で動作させるにはどうすればよいですか?または、私の呼び出しコードが原因ですか?Reflection.Emit.DynamicMethodで放射しているILの何が問題ですか?
出力:
{X=0,Y=0,Width=0,Height=0}
Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.
Exception has been thrown by the target of an invocation.
Common Language Runtime detected an invalid program.
コード:
using System;
using System.Drawing;
using System.Reflection.Emit;
namespace Experiments {
public class Program {
private delegate object CreateObject();
private delegate Rectangle CreateRectangle();
static void Main() {
Console.WriteLine(new Rectangle());
Console.WriteLine();
var dm = BuildDynamicMethod();
TryCreateDelegate<CreateObject>(dm);
Console.WriteLine();
TryCreateDelegate<CreateRectangle>(dm);
Console.WriteLine();
Console.ReadKey();
}
private static void TryCreateDelegate<T>(DynamicMethod dm) {
try {
var co = dm.CreateDelegate(typeof (T));
var value = co.DynamicInvoke(null);
Console.WriteLine(value);
} catch (Exception ex) {
Console.WriteLine(ex.Message);
var indent = 0;
while (ex.InnerException != null) {
indent++;
ex = ex.InnerException;
Console.WriteLine(new string('\t', indent) + ex.Message);
}
}
}
private static DynamicMethod BuildDynamicMethod() {
var tr = typeof(Rectangle);
var dm = new DynamicMethod("buildNewRectangle", tr, Type.EmptyTypes);
var il = dm.GetILGenerator();
il.Emit(OpCodes.Ldloca_S, (byte)0);
il.Emit(OpCodes.Initobj, tr);
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Box, tr);
il.Emit(OpCodes.Ret);
return dm;
}
}
}
+1、受け入れます。素晴らしい作品!どうもありがとう! –