Почему этот 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); работал нормально для меня.

Другие вопросы по тегам