動的ファクトリ メソッドでコンストラクターをラップするこのメソッドがあります。
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.1
。newobj <ctor>
したがって、ldnull
問題はこれら 2 つの IL 命令によって引き起こされたに違いありません。さらなる実験は、エラーが にあることを示唆していますldarg.1
。ldstr <string>
(上記の特定の例では、これを a に置き換えました。)
これらの IL 命令の何が問題なのか、誰かわかりますか?