2009-04-08 93 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。