你能从C DLL调用C#DLL吗?

时间:2009-04-08 02:45:55

标签: c# .net c++ dll cross-platform

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

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

这篇文章可能会帮到你:

CLR Hosting APIs (MSDN)

已更新:有一个名为mergebin的工具随.NET SQLite wrapper一起提供,可用于创建混合模式本机/托管DLL。从以下位置获取源代码:

SQLite for ADO.NET 2.0 (SourceForge)

你会在bin\tools文件夹中找到exe。

千电子伏

答案 2 :(得分:0)

实际上很容易。只需使用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。