【发布时间】: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