Почему этот DynamicMethod (ldarg.1, newobj, ret) вызывает исключение VerificationException?
У меня есть этот метод, который оборачивает конструктор в метод динамической фабрики:
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
Таким образом, проблема должна быть вызвана этими двумя инструкциями IL. Дальнейшие эксперименты показывают, что ошибка заключается в ldarg.1
, (Я заменил это на ldstr <string>
для конкретного примера выше.)
Кто-нибудь видит, что не так с этими инструкциями по IL?
1 ответ
Решение
Этот метод является статическим, поэтому он не имеет this
параметр как arg0
, изменения il.Emit(OpCodes.Ldarg_1);
от il.Emit(OpCodes.Ldarg_0);
работал нормально для меня.