你可以从C DLL调用C#DLL吗?

问题描述:

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

这样做最直接的方法是将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

这篇文章可能会帮助你:

CLR Hosting APIs (MSDN)

更新时间:有一个叫mergebin工具附带的.NET SQLite wrapper你可以用它来创建混合模式的本地/托管的DLL。从抓斗的源代码:

SQLite for ADO.NET 2.0 (SourceForge)

你会发现在bin\tools文件夹中的exe文件。

Kev

这实际上很简单。只需使用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。