2009-04-08 28 views
8

私はC#でDLLを構築しました。今、そのDLLの関数を呼び出すためにR Environmentを使いたいと思います。 R環境では、アンマネージC/C++ DLLを呼び出すことができますが、.NET DLLには呼び出せません。だから私の質問は、C/C++ DLLからC#DLLの関数を呼び出すことができますか?もしそうなら、これを行う方法に関する情報へのリンクがありますか?C DLLからC#DLLを呼び出すことはできますか?

答えて

9

これを行う最も単純な方法は、C#DLLのCOMクラスの1つをCOMオブジェクトとして公開し、C/C++ DLLからそのインスタンスを作成することです。それが受け入れ可能なオプションでない場合は、混在モードのC++ DLL(管理コードと非管理コードの両方を含む)を作成する必要があります。 C/C++ DLLは、混在モードのDLLでエクスポートされた関数を呼び出すことができます。この関数は、呼び出しをC#クラスに転送します。

+0

この混在モードのC++ DLLは、トリックを行うように聞こえます。VS2008を使用した混在モードのDLLプロジェクトを作成するのに利用できるテンプレートを見てきましたが、表示されません。どのように混在モードのDLLを開始するつもりですか? – Guy

+0

新しいC++クラスライブラリを作成すると、C++ .NET DLLプロジェクトが作成されます。 "共通言語ランタイムサポート"設定が "共通言語ランタイムサポート(/ clr)"に設定されている限り、プロジェクトで管理コードと非管理コードの両方を自由に使用できます。 – Andy

3

この記事はあなたを助けるかもしれない:

CLR Hosting APIs (MSDN)

更新:mergebinと呼ばれるツールがあることに付属.NET SQLite wrapperあなたが混在モードネイティブ/マネージDLLを作成するために使用することができます。ソースコードをグラブ:

SQLite for ADO.NET 2.0 (SourceForge)

あなたがbin\toolsフォルダ内のexeファイルを見つけることができます。

kev

+0

リンクKevのおかげでおもしろい読書。 – Guy

0

実際はかなり簡単です。 NuGetを使って.Netプロジェクトに "UnmanagedExports"パッケージを追加するだけです。詳細は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をロードすることができるはずです。

関連する問題