【问题标题】:get 'ldftn' function pointer in C#在 C# 中获取“ldftn”函数指针
【发布时间】:2010-10-12 14:39:58
【问题描述】:

在cil代码中,ldftn用于获取调用委托构造函数的函数指针地址(即.ctor(object, native int))。
C#中如何获取用于构造委托的函数指针?

【问题讨论】:

  • 你想要原始指针地址,还是只想要一个变量中的委托对象?
  • 用于调用 .ctor 的函数指针(即 .ctor(object, [native int]))
  • 目前还不清楚您在说什么 ctor。 _methodPtr 值只能由 JIT 编译器生成。在为该方法生成机器代码之前,无需调用任何内容。

标签: c# .net clr function-pointers cil


【解决方案1】:

您的问题的措辞让人难以理解您实际想要做什么。我想也许你想要的是这样的:

MethodInfo mi = ...
var ptr = mi.MethodHandle.GetFunctionPointer();
// now call a delegate .ctor using that ptr

【讨论】:

    【解决方案2】:

    如果您正在寻找 Reflection.Emit 代码的外观,那么如下所示:

    il.Emit(OpCodes.Ldftn, yourMethodInfo);
    il.Emit(OpCodes.Newobj, yourDelegateType.GetConstructors()[0]);
    

    第一行将函数指针加载到堆栈中。第二行将其“传递”给委托的构造函数。 yourDelegateType 应该类似于 typeof(Func<string>) 等。

    【讨论】:

    • 是的,这是在 Reflection.Emit 中创建委托的一种方式。但我只想要函数指针,即 ldftn 的输出
    • @Kii,你想用它做什么?你能提供一些(伪)代码来说明你想要完成的事情吗?
    • 曾几何时,有一个方法:object create_object(object[] args) 然后我想通过该方法创建一个委托:object _delegate = create_object(new object[] { null , get_ptr (method_info) });
    • @Kii,但是为什么 create_object 返回委托还不够呢?这是唯一可以在 C# 中原生地传递给函数指针的东西。
    【解决方案3】:

    ldftn 在 C# 9 .NET 5 中可用 https://docs.microsoft.com/dotnet/core/dotnet-five

    Function pointers: Language constructs that expose the following intermediate language (IL) opcodes: ldftn and calli.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多