从C ++调用C#代码

时间:2009-04-22 18:38:33

标签: c# c++-cli interop

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

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

8 个答案:

答案 0 :(得分:46)

答案 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 Giesecke220,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#。

sample code on GitHub

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

老实说,与其他DllExport答案相比,此解决方案似乎非常复杂。 C ++代码在扫描资源和入口点等方面进行了大量工作。对此答案的一个论点可能是它是跨平台的。但是,其他DllExport答案也是跨平台的,并且使用起来更简单。