从非托管C ++调用C#代码?

时间:2012-03-16 04:40:32

标签: c# c++ pinvoke

在Mono中,您可以将C#中的委托传递给C ++函数,该函数将委托作为函数指针接收。这可以在Windows上的C#中完成,例如,您可以编译本机C ++非托管库,将其链接到C#项目并获取C ++函数以通过C#作为委托传递给它的函数指针调用C#函数吗? / p>

5 个答案:

答案 0 :(得分:6)

在.NET中定义委托,然后将其传递给非托管代码。 CLR将委托作为函数指针公开,您可以从非托管代码中调用它。

互操作层不知道如何处理C ++中的引用。因此,您需要将对象公开为指针,而不是引用。另外,.NET不知道什么是C ++ object是(它与System.Object不同)。这将需要通过 作为一个IntPtr,我认为在.NET中你可以用它做很多事情。

C ++回调:

typedef void (*CBFUNC1)(unsigned int, const char*, object&);
typedef object* (*CBFUNC2)(object*, struct _mystruct* );

代表的C#签名将是

delegate void CbFunc1(uint param1, [MarshalAs(UnmanagedType.LPStr)] string
param2, IntPtr param3);
delegate IntPtr CbFunc2(IntPtr param1, ref _mystruct param2);

答案 1 :(得分:1)

您拥有的一个选项是使用C ++ / CLI调用C#代码。如果您的C ++代码必须保持不受管理(本机),那么您应该将C#代码包装在COM组件中并从C ++代码中使用它。

答案 2 :(得分:1)

显然可以这样做 - 所有CLR主机都是本机应用程序。你的选择:

    托管应用程序中的
  • 调用您的本机DLL(PInvoke)
  • 调用托管COM对象(如Dan建议的那样)
  • 自己主持CLR - sample

答案 3 :(得分:1)

答案 4 :(得分:1)

Rohit的回答是正确的,但是路径上还有很多问题取决于你是否立即回电(C#调用回调C#的C ++)或者你想要反复回拨( C#调用C ++并在将调用返回一次或多次后再调用C#)。

我从Unity / C#和C / C ++ / Objective-C互操作的角度编写了this example,但无论你在哪里做C#/ C互操作,你都会发现一些注释和代码片段很有用。

如果C /非托管代码可能在不同时间回调,请特别确保您保留/保留从C#/托管到C /非托管代码的任何代理。