你能从C DLL中调用一个C# DLL吗?

8

我已经用C#构建了一个DLL。现在我想使用R环境调用该DLL中的函数。R环境支持调用非托管的C/C++ DLL,但不支持.NET DLL。那么我的问题是,我能否从C/C++ DLL中调用C# DLL中的函数?如果可以,您有关于如何实现的信息链接吗?


可能是重复的问题:从C中调用C# - StayOnTarget
3个回答

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

那个混合模式的C++ DLL听起来似乎可以解决问题 - 我刚刚查看了使用VS2008创建混合模式DLL项目的可用模板,但没有找到。你会如何开始一个混合模式DLL呢? - Guy
如果您创建一个新的C++类库,将会创建一个C++ .NET DLL项目。只要“公共语言运行时支持”设置为“公共语言运行时支持(/clr)”,您就可以在项目中自由使用托管代码和非托管代码。 - Andy

3

1

这实际上非常简单。只需使用NuGet将“UnmanagedExports”包添加到您的.Net项目中即可。有关详细信息,请参见https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

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

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;
    }
}

R应该能够像普通的C dll一样加载TextExport。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接