我该如何以尽可能平台无关的方式从C++调用.NET?

7

我有一个C++应用程序,想要调用.NET(C#)方法。我原本打算使用C++/CLI,但它只支持Windows。

由于我们还支持MAC,我希望以一种方式从C++调用.NET,这种方式可以在Windows和Mac上(使用Mono)工作。

最佳的方法是什么?

编辑:我应该补充说明,我们想要调用的C#代码不是我们自己的。我们无法对其进行任何更改。当然,C++代码是我们自己的。


很棒的问题。我很好奇看看人们会想出什么。 - James Johnson
我想知道,Mac/Mono是否支持DCOM? - wilx
1
一个可能的解决方案是通过使用Google的Protocol Buffers加上套接字来模拟RPC。 Protocol Buffers有一个.NET实现 - megabyte1024
1个回答

1
最简单的方法是通过函数指针公开功能。无论是.NET还是本机代码,都可以通过函数指针与C/C++代码进行交互。函数指针在所有支持C++代码运行的平台上都受支持,因此它可以在没有任何.NET理解的情况下编写。

@AndrewS 在搜索中使用的术语是“Reverse PInvoke”。以下是关于该主题的几篇文章:http://msdn.microsoft.com/en-us/magazine/cc164193.aspx http://blogs.msdn.com/b/davidnotario/archive/2006/01/13/512436.aspx - JaredPar
谢谢 - 一旦我得到了搜索词,我找到了很多信息。但有一个问题:反向pInvoke似乎需要在c#端使用委托 - 但我们没有那个代码的所有权。有没有办法直接“只是”调用c#方法? - user236520
很遗憾,@AndrewS。为了调用C#代码,您需要一些跨越本地/托管边界的机制。从本地方面来看,您实际上只有两个选择:委托的反向pinvoke或COM互操作。 - JaredPar
在这种情况下,我考虑编写一个非常薄的 C# 层,它具有必要的委托,然后调用第三方 C# 例程。 - user236520
@AndrewS。这听起来就像是我在这里采取的方法。 - JaredPar
1
这里有一个重要的点,就是确保在交互操作中使用的委托不会被垃圾回收。 - CodesInChaos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接