我需要能够从C ++调用任意C#函数。 http://www.infoq.com/articles/in-process-java-net-integration建议使用ICLRRuntimeHost :: ExecuteInDefaultAppDomain(),但这只允许我调用具有以下格式的方法:int method(string arg)
调用任意C#函数的最佳方法是什么?
答案 0 :(得分:46)
C ++应用程序有几种方法可以调用C#DLL中的函数。
ICLRRuntimeHost::ExecuteInDefaultAppDomain()
)
答案 1 :(得分:25)
使用 / clr 标志编译C ++代码。有了它,您可以相对轻松地调用任何.NET代码。
例如:
#include <tchar.h>
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
System::DateTime now = System::DateTime::Now;
printf("%d:%d:%d\n", now.Hour, now.Minute, now.Second);
return 0;
}
这是否算作“C ++”?好吧,它显然不是标准C ++ ......
答案 2 :(得分:6)
如果您不关心C ++程序(或其中的一部分)是否使用/ clr编译,您可以使用C ++ / CLI简单地调用任何.NET代码(只要添加对它的引用) )。 Try out this article
编辑:这是a nice tutorial
另一种方法是将您的C#代码公开为COM。
答案 3 :(得分:4)
请参见DllExport。
IOW :与DllImport
的工作原理完全相反。
https://github.com/3F/DllExport
它支持Windows,并且正在跨平台支持。
C#代码(我们从C ++调用):
[DllExport]
public static int _add(int a, int b)
{
return a + b;
}
[DllExport]
public static bool saySomething()
{
DialogResult dlgres = MessageBox.Show(
"Hello from managed environment !",
".NET clr",
MessageBoxButtons.OKCancel
);
return dlgres == DialogResult.OK;
}
C ++代码(调用以前的C#代码):
typedef int(__cdecl *_add)(int a, int b);
typedef bool(__cdecl *saySomething)();
auto pAdd = (_add)GetProcAddress(lib, "_add");
int c = pAdd(5, 7);
auto pSaySomething = (saySomething)GetProcAddress(lib, "saySomething");
bool dlgres = pSaySomething();
还有一个YouTube视频,其视频位于Managed & Unmanaged; PInvoke; [ Conari vs DllExport]。老实说,该文档绝对是完美的,但不要让它让您失望:YouTube视频很棒。
该项目的灵感来自于另一个project from Robert Giesecke的220,000 downloads on NuGet。
有趣的事实:一些Python库已经使用它来实现C ++和C#的混合使用。
最后,感谢Robert Giesecke和Denis Kuzmin的出色工作!
答案 4 :(得分:3)
最简单的方法是使用COM互操作。
答案 5 :(得分:1)
您可以在编译成DLL的C#代码周围使用COM callable wrapper。
答案 6 :(得分:1)
作为替代方法,您可以使用Lua来实例化CLR对象,执行并返回结果。
答案 7 :(得分:0)
来自Microsoft:Write a custom .NET Core host to control the .NET runtime from your native code。
IOW :在Windows和Linux上从C ++调用C#。
此示例代码是跨平台的,它允许从Linux和Windows上的任何C ++应用程序调用.NET Core中的C#代码。
老实说,与其他DllExport
答案相比,此解决方案似乎非常复杂。 C ++代码在扫描资源和入口点等方面进行了大量工作。对此答案的一个论点可能是它是跨平台的。但是,其他DllExport
答案也是跨平台的,并且使用起来更简单。