gpt4 book ai didi

c# - 为什么这个 DynamicMethod (ldarg.1, newobj, ret) 会触发 VerificationException?

转载 作者:行者123 更新时间:2023-11-30 14:35:30 25 4
gpt4 key购买 nike

我有一个将构造函数包装在动态工厂方法中的方法:

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 指令有什么问题吗?

最佳答案

此方法是静态的,因此它没有作为 arg0this 参数。通过 il.Emit(OpCodes.Ldarg_1); 更改 il.Emit(OpCodes.Ldarg_1);; 对我来说效果很好。

关于c# - 为什么这个 DynamicMethod (ldarg.1, newobj, ret) 会触发 VerificationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12041490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com