21

C# でSWIGライブラリを使用した人はいますか? 持っている場合、どのような落とし穴を見つけましたか?また、ライブラリを使用する最善の方法は何ですか? C で記述されたプログラムのラッパーとして使用することを考えており、.NET アプリケーションで使用できるヘッダー ファイルをラップしたいと考えています。

編集:ターゲットOSのいくつかの明確化。

Linux と Windows でアプリケーションを実行する予定であるため、SWIG を調べています。P/Invoke はオプションではありません。

4

3 に答える 3

14

私の最後のプロジェクトでは、C# SWIG 構成ファイル全体を次に示します。

%module mdProject

%{
#include "mdProject.h"
%}

SWIGでコンパイルしました:

swig -csharp -c++ -I../../Include mdProject.i

これにより Project.cxx が生成され、これをコンパイルして「メイン」DLL に直接リンクしたため、2 つ目の C++「ヘルパー」DLL は必要ありませんでした。SWIG は、.NET DLL にコンパイルした一連の C# ファイルも生成しました。私の他のラッパー (Java、PHP など) は、ヘルパー DLL を使用します。

@patrick が述べたように、SWIG は P/Invoke を使用するため、問題がある場合は別の解決策を見つける必要があります。

通常とは異なるタイプ (void、構造体など) を使用する場合は、それを正しくするために追加の作業を行う必要がありますが、int や char* などを使用する平均的な API の場合は問題ありません。

于 2009-07-01T17:49:21.633 に答える
10

以前の投稿者が犯した間違いは、例を見ずにドキュメントを読んだことだと思います。

数時間前、いくつかの C++ クラスを C# に接続する必要がありました。私は自分の Swig dir を調べ (他の作業のために既に持っていました)、ディレクトリを見つけ、Examples/csharp/classコードを参照し、ソリューションをロードし、それを理解し、コピーし、自分のコードに挿入し、動作し、私の仕事は完了しました。

そうは言っても、生成された P/Invoke コードはすべてのニーズに対応できるソリューションではありません。プロジェクトによっては、いくつかの単純な API ラッパーを自分で記述したり、マネージ C++ を記述したりするのと同じくらい簡単な場合があります (この優れた例については、SlimDX を調べてください)。

私のニーズに対して、それはシンプルで簡単でした - 私は持っていましmystuff.dllmystuffnet.dll. ドキュメントがわかりにくいことに同意します。

編集: OP で C のみが言及されていることに気付きました。そのためには、Swig は実際には必要ありません。通常の C#/C DLLImport 相互運用構文を使用するだけです。Swigは、C# から C ++ クラスを呼び出せるようにする場合に役立ちます。

于 2009-07-01T02:21:09.190 に答える
5

数年前、.NET で使用するプロジェクト C++ をラップするために SWIG を使用しようとしました。

SWIG が必要とする構成を作成するのは非常に大きな苦痛だったので、あまりうまくいきませんでした。当時、私は別の言語/ APIなどを学ぶのではなく、解決策が欲しかった. 最近は SWIG の方が使いやすいかもしれません。

C++ プロジェクトをラップするために Managed C++ を使用することになりました。本当にうまくいきました。

dll から直接関数を呼び出しているだけの場合は、上記のどちらも気にせず、P/Invokeを使用することをお勧めします。

于 2008-08-25T21:57:19.960 に答える