我需要能够从 C++ 调用任意 C# 函数。http://www.infoq.com/articles/in-process-java-net-integration建议使用 ICLRRuntimeHost::ExecuteInDefaultAppDomain() 但这仅允许我调用具有以下格式的方法:int method(string arg)
调用任意 C# 函数的最佳方法是什么?
我需要能够从 C++ 调用任意 C# 函数。http://www.infoq.com/articles/in-process-java-net-integration建议使用 ICLRRuntimeHost::ExecuteInDefaultAppDomain() 但这仅允许我调用具有以下格式的方法:int method(string arg)
调用任意 C# 函数的最佳方法是什么?
C++ 应用程序有多种方法可以调用 C# DLL 中的函数。
ICLRRuntimeHost::ExecuteInDefaultAppDomain()
)
使用/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++ ...
请参阅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();
以及在Managed & Unmanaged上带有演示的 YouTube 视频;调用;[Conari 与 DllExport]。老实说,文档还不够完美,但不要让这让您失望:YouTube 视频非常棒。
该项目的灵感来自 Robert Giesecke 的另一个项目,该项目在 NuGet 上有220,000 次下载。
有趣的事实:一些 Python 库已经使用它来实现 C++ 和 C# 混合的功能。
最后,感谢 Robert Giesecke 和 Denis Kuzmin 的出色工作!
最简单的方法是使用 COM 互操作。
您可以在编译成 DLL 的 C# 代码周围使用COM 可调用包装器。
作为一种替代方法,您可以使用Lua来实例化 CLR 对象、执行并返回结果。
来自 Microsoft:编写自定义 .NET Core 主机以从您的本机代码控制 .NET 运行时。
IOW:在 Windows 和 Linux 上从 C++ 调用 C#。
GitHub 上有示例代码。
此示例代码是跨平台的,它允许从 Linux 和 Windows 上的任何 C++ 应用程序调用 .NET Core 中的 C# 代码。
DllExport
老实说,与其他答案相比,这个解决方案似乎相当复杂。C++ 代码在扫描资源和入口点等方面做了很多繁重的工作。这个答案的一个论点可能是它是跨平台的。但是,另一个DllExport
答案也是跨平台的,并且使用起来更简单。