C# 你能从C动态链接库调用C动态链接库吗?

C# 你能从C动态链接库调用C动态链接库吗?,c#,.net,c++,dll,cross-platform,C#,.net,C++,Dll,Cross Platform,我用C#构建了一个DLL。现在我想使用调用DLL中的函数。R环境支持调用非托管C/C++DLL,但不支持调用.NET DLL。所以我的问题是,我可以从C/C++DLL调用C#DLL中的函数吗?如果是这样的话,您是否有一个指向如何执行此操作的信息的链接?最直接的方法是将C#DLL中的一个C#类公开为COM对象,然后从C/C++DLL创建它的实例。如果这不是一个可接受的选项,您需要创建混合模式C++ + DLL(它包含托管代码和非托管代码)。您的C/C++DLL可以在混合模式DLL中调用导出的函数,

我用C#构建了一个DLL。现在我想使用调用DLL中的函数。R环境支持调用非托管C/C++DLL,但不支持调用.NET DLL。所以我的问题是,我可以从C/C++DLL调用C#DLL中的函数吗?如果是这样的话,您是否有一个指向如何执行此操作的信息的链接?

最直接的方法是将C#DLL中的一个C#类公开为COM对象,然后从C/C++DLL创建它的实例。如果这不是一个可接受的选项,您需要创建混合模式C++ + DLL(它包含托管代码和非托管代码)。您的C/C++DLL可以在混合模式DLL中调用导出的函数,而混合模式DLL又可以将调用转发到您的C#类。

本文可能会帮助您:

更新:有一个名为的工具随附,您可以使用它创建混合模式本机/托管DLL。从以下位置获取源代码:

您将在
bin\tools
文件夹中找到exe


Kev

这其实很容易。只需使用NuGet将“UnmanagedExports”包添加到.Net项目中。有关详细信息,请参阅

然后可以直接导出,而无需执行COM层。以下是示例C#代码:


R应该能够像C++的DLL一样加载TeXTrimePo.< /P>混合模式C++ + DLL听起来像是要做的——我刚刚看过可用VS2008创建混合模式DLL项目的模板,但没有看到。如果你创建一个新的C++类库,那么你将创建一个C++ .NET DLL项目。只要将“公共语言运行时支持”设置设置为“公共语言运行时支持(/clr)”,您就可以在项目中自由使用托管代码和非托管代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using RGiesecke.DllExport;

class Test
{
    [DllExport("add", CallingConvention = CallingConvention.Cdecl)]
    public static int TestExport(int left, int right)
    {
        return left + right;
    }
}