3

動的ファクトリ メソッドでコンストラクターをラップするこのメソッドがあります。

static Func<TArg1, TResult> ToFactoryMethod<TArg1, TResult>(this ConstructorInfo ctor)
    where TResult : class
{
    var factoryMethod = new DynamicMethod(
         name:           string.Format("_{0:N}", Guid.NewGuid()),
         returnType:     typeof(TResult), 
         parameterTypes: new Type[] { typeof(TArg1) });

    ILGenerator il = factoryMethod.GetILGenerator();
    il.Emit(OpCodes.Ldarg_1);
    il.Emit(OpCodes.Newobj, ctor);
    il.Emit(OpCodes.Ret);

    return (Func<TArg1, TResult>)
         factoryMethod.CreateDelegate(typeof(Func<TArg1, TResult>));
}

ただし、次のコードは に をスローしVerificationExceptionます.Invoke(…)

ConstructorInfo ctor = typeof(Uri).GetConstructor(new Type[] { typeof(string) });
Func<string, Uri> uriFactory = ctor.ToFactoryMethod<string, Uri>();
Uri uri = uriFactory.Invoke("http://www.example.com");

を置き換えても例外はスローされませんldarg.1newobj <ctor>したがって、ldnull問題はこれら 2 つの IL 命令によって引き起こされたに違いありません。さらなる実験は、エラーが にあることを示唆していますldarg.1ldstr <string>(上記の特定の例では、これを a に置き換えました。)

これらの IL 命令の何が問題なのか、誰かわかりますか?

4

1 に答える 1

6

thisこのメソッドは静的であるため、パラメーターはありませんarg0。変更il.Emit(OpCodes.Ldarg_1);することil.Emit(OpCodes.Ldarg_0);は私にとってはうまくいきました。

于 2012-08-20T16:42:43.247 に答える