2011-09-14 18 views
4

これについてはかなりの質問がありますが、一般的にはC++ライブラリを参照しています。C++/CLIまたはC#P/extern関数を呼び出す、大きなCライブラリを呼び出す

私は非常に重要なCのdll(約2800の関数)を持っており、これらのうち約70のAPIをC#で作成する必要があります。私はP/Invokeを使い始めましたが、Cコード(ポインタを他のものや二重ポインタなどの構造体)から渡したり返す複雑な構造を持っていて、必要なものを手に入れるのにかなり時間がかかりました。

今私はC++/CLIについては全く知らないけど、C++で少し経験があります。

私のプロジェクトでこれを学ぶ努力をする価値があるのだろうかと思っています。 C++ラッパーを使用することなどマーシャリング構造、グローバルヒープ内の割り当てのポインタ、と格闘するかどうかを持っていない私を可能にするのでしょうか?....多く、大きなアップはかなりです。この偉大なコミュニティ

答えて

3

C#のネイティブ構造体を扱うのは難しいです。したがって、C++/CLIラッパーの作成は簡単です。これらの構造体をref classesに変換/ラップするのはあまり問題なく、C#で使用できます。

void some_function(Some_Struct * ss) 
{ 
    //... 
} 

struct Some_Struct 
{ 
    int intVal; 
    double dblVal; 
} 

//C++/ClI 
public ref class Wrapper 
{ 
    public: 
    void CallSomeFunction(int intval, double doubleval) 
    { 
     Some_Struct * ss = new Some_Struct(); // maybe malloc is more appropriate. 
     ss->intVal = intval; 
     ss->dblVal = doubleval; 
     some_function(ss); 
     delete ss; // or Free(ss); 
    } 
} 

//C# 
Wrapper wrapper = new Wrapper(); 
wrapper.CallSomeFunction(10,23.3); 
6

感謝広い表面積。私はC++/CLIはP/invokeよりも簡単だと思います。 C++の機能を使う必要はなく、本質的にC言語を書いて、C++/CLIでコンパイルして書き出すことができます。

+0

ありがとうございました。 私はあなたがうまくいくことを確認するために、私の現在のDLLをC++/CLIでコンパイルするだけです。そして、一度私はすべてのC#で使用するための大丈夫ですか?あるいは、私はC++クラスを書く必要がありますか? C++/CLiラッパーに関するすべての記事は、既存のC++クラスごとにクラスを作成することについて言及しています...クラスがないので、どのように進むべきかわかりません。チュートリアルやそれは素晴らしいでしょう! – nche

+0

いいえ、私はあなたのDLLをそのまま残し、C++/CLIラッパーを書く方が良いと思います。 C++/CLIラッパーは、ネイティブDLLを呼び出すことができ、管理されたインターフェイスをC#コードにエクスポートすることもできます。 –

+0

@Nchek:通常、リンクする前にネイティブDLLの一部であるオブジェクトファイルを取得し、新しいC++/CLIコードで静的にリンクして、単一のDLLを作成します(インストールの頭痛を取り除きます。グローバルアセンブリキャッシュにインストールされているなど)。しかし、既存のコードに '/ clr'を使う理由はありません。 –

関連する問題