【问题标题】:How can I pass a C# function pointer into CLI/C++ code?如何将 C# 函数指针传递给 CLI/C++ 代码?
【发布时间】:2012-10-15 01:14:00
【问题描述】:

我希望非托管 C++ 代码调用 C# 函数作为回调。我有一个围绕非托管代码的 CLI/C++ 类。此 CLI/C++ 类的实例存在于 C# 中。

C# 代码类似于以下文本。我有一个指向 callBack 方法的(委托)函数指针。我有 CLI_class 的 CLI 实例。我想在 addValueChangedCallBack 函数中以某种方式给它函数指针。

public Setup(){
    tempFUNC myFuncObj = new tempFUNC(callBack)
    CLI_class c=new CLI_class();
    c.addValueChangedCallBack(myFuncObj)
}

public delegate void tempFUNC(float x);

void callBack(float x){
....
}

然后在 CLI 代码中我想做这样的事情:

void addValueChangedCallback(void (*ManipCallBack)(float)){
   unmanagedCPPCLASS.addValueChangedCallback(ManipCallBack)

}

如何将函数指针转换为 C++ 指针 (*)?此外,我无法在 C++/CLI 项目中引用 C# 项目,因为 C# 类已经引用并使用了 C++/CLI 项目。会不会有依赖问题?

我在某些网站上看到了对“封送数据”或使用“互操作”的引用。我不明白它们是如何工作的,或者从我所看到的任何东西来看它们到底做了什么,这些是我应该使用的吗?

【问题讨论】:

  • 我会尝试创建一个正确签名的包装 C++ 函数,该函数随后调用 C# 函数。使用 C++/CLI 时不需要编组或互操作,重点是让编译器使用语言扩展来处理这个问题。
  • 在 C++/CLI 代码中声明委托类型,这样您就不会依赖于 C# 程序集。公开。使用 Marshal.GetFunctionPointerForDelegate() 获取可以传递给本机代码的指针。不要忘记存储传递的委托对象以保持引用。
  • 感谢您的反馈,如何从 C++ 代码中调用 C# 函数?目前我的 C# 项目引用了 CLI/C++ 项目,所以我无法从 CLI/C++ 代码中引用 C# 项目。依赖将是循环的。此外,使用 C# 代码中已经存在的方法也很重要(我需要交互 C++ 和 C# GUI 元素)。
  • @Hans 我不认为它是完全重复的,因为还有进一步的要求。需要告诉 OP 如何传递 C# 委托,或者如何从托管 C++ 管理/包装它。因此,他需要比您当前链接的答案中更多的详细说明/解释?

标签: c# c++-cli function-pointers unmanaged managed


【解决方案1】:

您可以让两个项目相互引用并使用 System.InteropServices.Runtime.Marshal.GetFunctionPointerForDelegate 来获取函数指针。

但如果我是你,我会创建 C# 类 ComVisible 并让 C++ 代码通过 COM 接口直接调用 C# 方法。这样就不需要 C++/CLI 包装器。正如您所经历的那样,包装器总是很痛苦。 C++/CLI 有它的用途,但创建包装器不是。

【讨论】:

  • 非常感谢!!你是否有一种特殊的方法可以让 Visual Studios 中的类相互引用?还是应该引用 dll?
  • 项目应该相互引用。您可以通过在解决方案资源管理器中右键单击项目名称并选择 Add Reference... 来执行此操作
  • 我之前尝试这样做的时候,Visual Studios说不能给项目添加项目引用,因为会导致循环依赖。有没有其他方法可以做到这一点?
  • 另外,C++ 代码是第 3 方图形库,我无法访问源代码,所以这就是我使用复杂 CLI 层的原因。
  • 然后在C++/CLI代码中声明委托类型,这样C++/CLI项目就不会像@HansPassant所说的那样依赖C#项目了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 2017-08-30
  • 2011-05-19
  • 2011-04-17
  • 2012-02-22
  • 1970-01-01
  • 2011-05-22
相关资源
最近更新 更多