【发布时间】:2017-02-08 23:59:51
【问题描述】:
我在 C# 中有以下设置:
public delegate void CallbackDelegate(string message);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern void setCallback(CallbackDelegate aCallback);
public void testCallbacks()
{
System.Console.Write("Registering C# callback...\n");
setCallback(callback01);
}
public void callback01(string message)
{
System.Console.Write("callback 01 called: " + message + "\n");
}
这在 C++ 中(该函数通过 mono_add_internal_call 正确注册):
typedef void (*CallbackFunction)(const char*);
void setCallback(MonoDelegate* delegate)
{
// How to convert the MonoDelegate to a proper function pointer?
// So that I can call it like func("test");
}
调用 C++ 函数并将 something 传递给委托变量。 但是现在呢?
我环顾四周,发现函数“mono_delegate_to_ftnptr”被提到了几次,从这些例子来看,它似乎正是我所需要的。
然而,这个函数在我的mono(4.6)发行版中似乎根本不存在,所以我只能猜测它不再存在了。
我还找到了一些如何使用 PInvoke 执行此操作的示例。这是我不想使用的东西 - 因为 InternalCall 对于我的目的来说要快得多。
当然,如果 PInvoke 是唯一的方法,那就这样吧,但我对此表示怀疑。
到最后,我真的不知道如何从这里开始。
【问题讨论】:
-
否决票的任何具体原因?我应该添加一些东西吗?
-
在 Microsoft 的 InternalCall 工具链实现 C++/CLI 中,您将使用签名
setCallback(System::Action<System::String^>^ delegate)直接接受直接接收 .NET 字符串的 .NET 委托。也许如果您展示了如何在 Mono 中向 InternalCall 函数传递 .NET 引用类型,它可能会导致更轻量级的解决方案。