2009-04-08 95 views
8

我已经在C#中构建了一个DLL。现在我想用R Environment来调用该DLL中的函数。 R环境支持调用非托管C/C++ DLL,但不支持调用.NET DLL。所以我的问题是,我可以从C/C++ DLL调用C#DLL中的函数吗?如果是这样,你有链接到如何做到这一点的信息?你可以从C DLL调用C#DLL吗?

回答

9

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

+0

混合模式的C++ DLL听起来像它会做的伎俩 - 我刚刚看过可用的模板来创建使用VS2008混合模式DLL项目,但没有看到一个。你将如何开始混合模式DLL? – Guy 2009-04-08 04:12:02

+0

如果您创建一个新的C++类库,它将创建一个C++ .NET DLL项目。只要“公共语言运行时支持”设置设置为“公共语言运行时支持(/ clr)”,就可以在项目中自由使用托管代码和非托管代码。 – Andy 2009-04-08 11:14:21

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。