C#でSWIGを使用する場合のベストプラクティスは何ですか?

StackOverflow https://stackoverflow.com/questions/25268

  •  09-06-2019
  •  | 
  •  

質問

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top