【问题标题】:Function pointer translation from C++ to C#从 C++ 到 C# 的函数指针转换
【发布时间】:2013-11-03 10:57:53
【问题描述】:

我正在将一些 C++ 代码翻译成 C#,并且结构定义中有一个函数指针,比如 func*

这个 func* 是一个指向许多其他函数指针的指针,这些指针都包含在一个 C++ 头文件中(这个头文件不会被翻译)。

有没有办法翻译这个?

代码sn-p:

struct CK_FUNCTION_LIST {
int version; 
/* Pile all the function pointers into it. */
#include "pkcs11f.h"
};

我要翻译的类包含类型CK_FUNC_LIST*的成员。

【问题讨论】:

  • 我认为你在正确的轨道上,因为你用 Delegates 标记了你的姿势。但不确定你是说 func* 指向一系列函数还是一个 dingle 函数。委托将是拥有指向特定函数的“指针”的方法。如果您确实需要指向一系列指针的“指针”,我认为您可以使用委托数组(或列表,或集合,或适用于您填充系列的方式)。如果不是你的意思,解释更多?还是贴出一段c++代码?

标签: c# c++ delegates function-pointers


【解决方案1】:

为了演示当你想在 C# 中使用函数指针的等价物时你通常会做什么,看看这个:

struct MyFunctions {
  public Func<int,string,bool> ptr1;
  public Action<int> ptr2;
}

class Program
{
  static void Main(string[] args)
  {
     MyFunctions sample = new MyFunctions() { ptr1 = TestValues, ptr2 = DoThing };
     sample.ptr1(42, "Answer");
     sample.ptr2(100);
  }

  static bool TestValues(int a, string b)
  {
     Console.WriteLine("{0} {1}", a, b);
     return false;
  }

  static void DoThing(int a)
  {
     Console.WriteLine("{0}", a);
  }
}

输出是:

42 Answer
100

【讨论】:

  • 所以,就我而言,我必须在定义结构 CK_FUNC_LIST 的同一文件中重新定义 C# 中“pkcs11f.h”的函数?
  • 为什么在 struct def 中使用 Func 和 Action 作为成员类型?它们是关键字吗?
  • 这取决于您是否打算调用这些函数。如果不是,那么为什么它们是结构的一部分。如果您正在与非托管代码进行互操作,则可以使用 IntPtr 作为您可能打算或可能不打算使用的非托管内存的占位符(指针)。
  • Func 和 Action 是由框架定义的通用(模板化)类型,旨在简化定义委托的过程。您可以使用 Func 一次性指示函数签名,而不是单独声明一个接受整数和字符串并返回 bool 的命名委托类型。
  • 看起来这个问题的答案是避免Func,并根据stackoverflow.com/questions/2462814/…“手动”定义您的委托
【解决方案2】:

如果要移植代码,C# 中有几个选项:

1) 使用 lamdas(例如未命名的代表)。如果这些是 1-off 函数(例如,它们只使用一次),这将是最佳选择。

2) 使用命名委托。它们的行为与 C++ 函数指针非常相似。如果您在多个地方使用相同的功能,这将是更好的选择。

只是为了澄清(正如 Ben Voigt 指出的那样):这些实际上与 lamda 语法将为您创建一个委托相同。

委托类型可以是框架提供的(Action、Func、Predicate) 或用户声明,并且可以内联创建委托(lambda, 匿名委托)或通过命名方法。

【讨论】:

  • 这真的只有一种选择。 Lambda 语法产生一个委托(除非你建议他使用表达式树?)
  • @BenVoigt 是的,但您也可以编写和命名您自己的代表(我在这里得到的区别)。我故意省略了表达式树,因为它们是你知道的东西的痛苦......并且可能不能很好地达到这个目的。
  • 那么也许你打算使用委托,有一些选项:委托类型可以是框架提供的(ActionFuncPredicate)或用户声明的,委托可以内联(lambda,匿名委托)或通过命名方法来创建。
  • 我更喜欢这种措辞...我会将其复制到答案中。
  • @TylerDurden 这是一个不同的问题,已经回答了:stackoverflow.com/questions/2462814/…
【解决方案3】:

在 C# 中使用函数指针的正常方式是声明一个 Action 或 Func。这些是类型安全的,因此它们只接受与类型参数的签名匹配的方法。

代表更通用(Action 和 Func 只是特定的命名)但不太清楚。确实,我们需要更多信息才能更具体。

【讨论】:

    猜你喜欢
    • 2011-07-31
    • 2021-03-23
    • 2023-03-29
    • 2012-11-21
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多