57

我需要能够从 C++ 调用任意 C# 函数。http://www.infoq.com/articles/in-process-java-net-integration建议使用 ICLRRuntimeHost::ExecuteInDefaultAppDomain() 但这仅允许我调用具有以下格式的方法:int method(string arg)

调用任意 C# 函数的最佳方法是什么?

4

8 回答 8

31

使用/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++ ...

于 2009-04-22T19:02:15.227 回答
12

请参阅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 的出色工作!

于 2019-08-17T09:06:00.280 回答
6

如果您不关心您的 C++ 程序(或其中的一部分)是否使用 /clr 编译,则可以使用 C++/CLI 简单地调用任何 .NET 代码(只要添加对它的引用)。 试试这篇文章

编辑:这是一个很好的教程

另一种方法是让您的 C# 代码公开为 COM。

于 2009-04-22T19:18:32.833 回答
4

最简单的方法是使用 COM 互操作。

于 2009-04-22T18:41:05.187 回答
1

您可以在编译成 DLL 的 C# 代码周围使用COM 可调用包装器。

于 2009-04-22T19:23:45.020 回答
1

作为一种替代方法,您可以使用Lua来实例化 CLR 对象、执行并返回结果。

于 2009-04-22T21:18:38.223 回答
1

来自 Microsoft:编写自定义 .NET Core 主机以从您的本机代码控制 .NET 运行时

IOW:在 Windows 和 Linux 上从 C++ 调用 C#。

GitHub 上有示例代码。

此示例代码是跨平台的,它允许从 Linux 和 Windows 上的任何 C++ 应用程序调用 .NET Core 中的 C# 代码。

DllExport老实说,与其他答案相比,这个解决方案似乎相当复杂。C++ 代码在扫描资源和入口点等方面做了很多繁重的工作。这个答案的一个论点可能是它是跨平台的。但是,另一个DllExport答案也是跨平台的,并且使用起来更简单。

于 2019-08-17T09:16:48.967 回答