首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从非托管C++调用C#代码?

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

Stack Overflow用户
提问于 2012-03-16 12:40:32
回答 5查看 5.2K关注 0票数 1

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-16 12:53:46

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

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

C++回调:

代码语言:javascript
复制
typedef void (*CBFUNC1)(unsigned int, const char*, object&);
typedef object* (*CBFUNC2)(object*, struct _mystruct* );

代表的C#签名将是

代码语言:javascript
复制
delegate void CbFunc1(uint param1, [MarshalAs(UnmanagedType.LPStr)] string
param2, IntPtr param3);
delegate IntPtr CbFunc2(IntPtr param1, ref _mystruct param2);
票数 6
EN

Stack Overflow用户

发布于 2012-03-16 12:50:34

一种选择是使用C++/CLI调入C#代码。如果您的C++代码必须保持非托管(本机)状态,那么您应该将C#代码包装在COM组件中,并在C++代码中使用它。

票数 1
EN

Stack Overflow用户

发布于 2012-03-16 12:54:39

这显然是可以做到的--所有CLR主机从一开始就是本机应用程序。您的选择:

托管应用程序中的

  • 调用本机DLL (PInvoke)
  • 调用托管COM对象(以Dan suggested)
  • host CLR自己的身份- sample
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9731990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档