你可以从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#类。
答
这篇文章可能会帮助你:
更新时间:有一个叫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。
混合模式的C++ DLL听起来像它会做的伎俩 - 我刚刚看过可用的模板来创建使用VS2008混合模式DLL项目,但没有看到一个。你将如何开始混合模式DLL? – Guy 2009-04-08 04:12:02
如果您创建一个新的C++类库,它将创建一个C++ .NET DLL项目。只要“公共语言运行时支持”设置设置为“公共语言运行时支持(/ clr)”,就可以在项目中自由使用托管代码和非托管代码。 – Andy 2009-04-08 11:14:21