質問
C#で SWIG ライブラリを使用している人はいますか?持っている場合、どのような落とし穴を見つけましたか、またライブラリを使用する最良の方法は何ですか? Cで記述されたプログラムのラッパーとして使用することを考えています。ヘッダーファイルをラップして、.NETアプリケーションで使用できるようにします。
編集:ターゲットOSのいくつかの明確化。LinuxおよびWindowsでアプリケーションを実行する予定です。そのため、SWIGを検討している理由です。 P / Invokeはオプションではありません。
解決
以前の投稿者が犯した間違いはドキュメントを読んだことであり、例を見ていないと思います。
数時間前、いくつかのC ++クラスをC#にインターフェイスする必要がありました。 Swig dirを見て(他の作業用に既に持っていました)、ディレクトリ Examples / csharp / class
を見つけ、コードを閲覧し、ソリューションをロードし、グロッキングし、コピーして、コードを入力しました、それは働いた、私の仕事は終わった。
とはいえ、生成されたP / Invokeコードは、すべてのニーズに対するソリューションではありません。プロジェクトによっては、単純なAPIラッパーを自分で作成したり、マネージC ++を作成したりすることも簡単です(この素晴らしい例についてはSlimDXを参照してください)。
私のニーズのために、それはシンプルで簡単でした- mystuff.dll
があり、さらに mystuffnet.dll
を出荷できます。ドキュメントの入手が難しいことに同意します。
編集:OPがCのみに言及していることに気付きました。そのためには、Swigを実際に必要とせず、通常のC#/ C DLLImport interop構文。 Swigは、 C ++クラスをC#から呼び出す場合に役立ちます。
他のヒント
最後のプロジェクトの場合、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を使用するため、問題がある場合は別の解決策を見つける必要があります。
通常のものからはずれた型(ボイド、構造など)を使用する場合、それを正しくするために追加の作業を行う必要がありますが、int、char *などを使用する平均的なAPIの場合は問題ありません。
私はSWIGを使用して、数年前に.NETで使用するプロジェクトC ++をラップしようとしました。
SWIGが必要とする構成を作成するのは非常に大きな苦痛だったので、私はそれほど遠くには行きませんでした。当時は、別の言語/ api /などを学ぶのではなく、解決策が必要でした。最近、SWIGの方が使いやすいかもしれませんが、あなたには言えません。
最終的にManaged C ++を使用してC ++プロジェクトをラップしました。本当にうまくいきました。
dllから関数を直接呼び出す場合は、上記のいずれについても心配せずに、単に P / Invoke