gpt4 book ai didi

c# - 获取已关闭的未创建泛型方法的 token

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

我正在使用 MethodBuilder.SetMethodBody() 发出方法,而不是使用内置的 ILGenerator。原因主要是对异常处理信息有更多控制,通常是对发出的操作码有更多控制。

在我需要调用方法的所有情况下,我调用 ModuleBuilder.GetMethodToken() 并且它工作正常,除非我需要 call未创建的封闭通用方法(具有相同的动态模块)。它抛出一个 NotSupportedException:Specified method is not supported.

当然 MethodBuilder.TokenMetadata 不起作用,因为该方法尚未创建,这让我别无选择。

所以问题是,我如何获取 token 以用于我自定义发出的 call 操作码到这个通用方法?

编辑:我发现内置的 ILGenerator.EmitCall 通过调用接受 bool 值的内部方法获取 token ,生成器有时会传递 false。但是,MethodBuilder.GetMethodToken() 始终将 true 传递给相同的内部方法。似乎是这样,但既然我无法使用内部方法,那么必须有另一种方法吗?

如果没有其他方法,我实际上正在考虑使用反射来手动获取和调用该方法。

编辑:确实,通过将 false 作为参数的反射调用内部方法(顺便说一句,它是 ModuleBuilder.GetMethodTokenInternal)确实可以解决问题。但我不认为没有获取 token 的正常方法,因为如果您手动调用通用方法,SetMethodBody 需要它。

最佳答案

我想到的解决方案是通过反射调用内部方法并将所需的参数传递给它。

// If the to be called method is generic...
var methodInfo = Type.GetType("System.Reflection.Emit.ModuleBuilder")
.GetTypeInfo()
.DeclaredMethods
.Where((method) => method.Name == "GetMethodTokenInternal" && method.GetParameters().Length == 3)
.First();
int token =
(int)methodInfo.Invoke(_moduleBuilder, new object[] { closedGenericMethod, null, false });

但实际上我在第一次调用后使用委托(delegate)来加快速度。

关于c# - 获取已关闭的未创建泛型方法的 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27566402/

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