从C+调用C#代码+; 我需要能够从C++调用任意的C函数。建议使用ICLRRuntimeHost::ExecuteInDefaultAppDomain(),但这只允许我调用具有以下格式的方法:int-method(string-arg) < >调用任意C函数的最佳方法是什么?< P>最简单的方法是使用COM互操作。< /P> < P>编译< C++ >代码,使用 /CLR < /强>标志。这样,您就可以相对轻松地调用任何.NET代码

从C+调用C#代码+; 我需要能够从C++调用任意的C函数。建议使用ICLRRuntimeHost::ExecuteInDefaultAppDomain(),但这只允许我调用具有以下格式的方法:int-method(string-arg) < >调用任意C函数的最佳方法是什么?< P>最简单的方法是使用COM互操作。< /P> < P>编译< C++ >代码,使用 /CLR < /强>标志。这样,您就可以相对轻松地调用任何.NET代码,c#,c++-cli,interop,C#,C++ Cli,Interop,例如: #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; } #包括 #包括 int _tmain(int argc,

例如:

#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;
}
#包括
#包括
int _tmain(int argc,_TCHAR*argv[]
{
System::DateTime now=System::DateTime::now;
printf(“%d:%d:%d\n”,now.Hour,now.Minute,now.Second);
返回0;
}

这算“C++”吗?显然,这不是标准的C++。……/p>< p>如果你不关心C++程序(或它的一部分)是否用/CLR编译,你可以使用C++ +CLI来简单调用任何.NET代码(只要你添加了一个引用)。

编辑:这里是


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

您可以在编译成DLL的C#代码周围使用

> P>作为替代方法,可以使用实例化CLR对象、执行和返回结果。

< P>有一种C++应用程序调用C*yDLL中的函数的几种方法。
  • 使用C++/CLI作为中间DLL
  • 反向P/Invoke
  • 使用COM
  • 使用CLR宿主(
    ICLRRuntimeHost::ExecuteInDefaultAppDomain()
  • 进程间通信(IPC)
  • 编辑:托管HTTP服务器并通过HTTP谓词(例如REST样式的API)调用
  • IOW:
    DllImport
    的工作方式完全相反

    它支持Windows,目前正在进行跨平台支持

    C代码(我们从C++中调用):

    C++代码(调用以前的C#代码):

    还有一段YouTube视频,在上有一个演示。老实说,这些文档还不够完美,但不要因此而拖延:YouTube视频非常棒

    这个项目的灵感来自另一个已经完成的项目

    有趣的事实:一些Python库使用了这个工具来实现C++和C语言混合的功能。 最后,感谢罗伯特·吉塞克和丹尼斯·库兹明,出色的工作

    来自Microsoft:

    <强> IO: <强> Windows和Linux上从C++调用C**。< /P> 有

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


    老实说,与另一个
    DllExport
    答案相比,这个解决方案似乎相当复杂。C++代码正在进行大量的重扫描,以查找资源和入口点等。对此答案的一个论点可能是它是跨平台的。但是,另一个
    DllExport
    答案也是跨平台的,而且使用起来更简单。

    你说的任意代码是什么意思?可达到的最好粒度不是函数级吗?从.NET 5以来,使用共享库的跨平台方式:请参阅。然后它不再是C++调用C ^,它是C++ + CLI调用Cy-您已经回避了这个问题。C++与C++ + CLI是一个非常重要的区别,不应该被掩盖。你不能导出C++ + CLI函数,这样它们就可以从普通C++代码中调用吗?丹,你能发布一个例子,展示如何从C++调用CLI代码吗?C++/CLI可以调用任何C++函数,就像它是“正则”C++函数一样。添加你的引用,/CLR,它只是工作。“这算是C++吗?很显然,它不是标准C++”…关键是普通的C/C++代码应该能够调用C++/CLI,而C++/CLI在中调用C#。看到它是如何工作的,我对这个解决方案很满意。@Filip:不太满意;如果你只是添加
    /clr
    你仍然会得到
    不安全的
    代码,这实际上限制了你在C#真正有用的许多地方(例如,Windows Phone、Silverlight、ASP.NET、任何其他执行不可信代码的地方…)IJW(C++互操作)比COM互操作简单得多。回答好,教程不好。如果可能,请链接到更好的教程:)这5种方法中哪一种更可取,为什么?如果你正在寻找一个跨平台的解决方案(所以COM或C++CLR是不可能的),并且可以容忍一个扁平的API(没有OOP语法,即La C API),(将是).NET 5中的一个解决方案:通过这个,你可以从C代码中创建一个DLL,可以在Linux上从C或C++中使用。(允许处理C对象,就像在C++ API中对C++代码所做的那样)。感谢您的捐赠,Tolmie!这确实有助于继续开发和支持我的免费产品。CoreCLR支持我计划在我的时间内尽可能通过第90期进行审查。关注新闻。啊,是的,与糟糕的文档相比,每个人都可以使用an和您已经注意到的其他相关文档。但总体而言,每个人都可以改进我们的文档entation!我个人只添加了关于我们的DllExport工具和相关PInvoke功能的基本内容,因为我更喜欢使用代码而不是文档:)
    [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;
    }
    
    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();