gpt4 book ai didi

c# - .Net Standard 中 CompileToMethod 的替代方案

转载 作者:可可西里 更新时间:2023-11-01 07:58:11 29 4
gpt4 key购买 nike

我现在正在将一些使用表达式的库移植到 .Net Core 应用程序并遇到一个问题,我的所有逻辑都基于 LambdaExpression.CompileToMethod 而它根本就没有in. 这是示例代码:

public static MethodInfo CompileToInstanceMethod(this LambdaExpression expression, TypeBuilder tb, string methodName, MethodAttributes attributes)
{
...

var method = tb.DefineMethod($"<{proxy.Name}>__StaticProxy", MethodAttributes.Private | MethodAttributes.Static, proxy.ReturnType, paramTypes);
expression.CompileToMethod(method);

...
}

是否有可能以某种方式重写它以使其能够使用表达式生成方法?我已经可以使用 Emit 来做到这一点,但它非常复杂,我想避免使用它以支持高级表达式。

我尝试使用 var method = expression.Compile().GetMethodInfo(); 但在这种情况下我得到一个错误:

System.InvalidOperationException : Unable to import a global method or field from a different module.

我知道我可以手动发出 IL,但我需要准确地将 Expression -> 转换为绑定(bind)到特定 TypeBuilderMethodInfo 而不是构建我自己 DynamicMethod 就可以了。

最佳答案

这不是一个理想的解决方案,但如果您不想从头开始编写所有内容,则值得考虑:

  1. 如果查看 CompileToMethod 实现,您会发现它在底层使用内部 LambdaCompiler 类。
  2. 如果深入研究,您会发现 LambdaCompiler 使用 System.Reflection.Emit 将 lambda 转换为 MethodInfo
  3. System.Reflection.Emit 受 .NET Core 支持。
  4. 考虑到这一点,我的提议是尝试重用LambdaCompiler 源代码。你可以找到它here .

这个解决方案最大的问题是:

  1. LambdaCompiler 分布在许多文件中,因此查找编译它所需的内容可能很麻烦。
  2. LambdaCompiler 可能会使用一些 .NET Core 根本不支持的 API。

一些补充意见:

  1. 如果您想检查哪个平台支持哪个 API,请使用 .NET API Catalog .
  2. 如果您想查看 .NET 标准版本之间的差异,请使用 this网站。

关于c# - .Net Standard 中 CompileToMethod 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41520319/

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