質問

Windowsで開発した後、LinuxでC#/ C ++アプリを実行しようとしています。

その一部であるFooLibはC ++で記述されており、パフォーマンスのためにC#から削除されています。 FooLibはシステムコールを使用せず、標準のC ++機能のみを使用します。次のように宣言された単一の関数をエクスポートします。

extern "C" __declspec(dllexport) void Foo(float*, int, float*);

Visual C ++でコンパイルされています。 WindowsでコンパイルされたFooLib.dllを使用してアプリをモノで実行しようとしましたが、dllの読み込み(DllImport)が次のように失敗しました。

Unhandled Exception: System.DllNotFoundException:Foo(single[2],int,single[])

だから、私は何をすべきですか?

  • 何らかの方法でエクスポート宣言を変更しますか?
  • Linux上でgccを使用して.soライブラリにコンパイルしてからロードしますか?
  • Linuxでgccを使用して.dllにクロスコンパイルし、それをロードしますか?
  • 他に何かありますか
役に立ちましたか?

解決

Linuxでライブラリを再コンパイルする必要がある場合、foolib.soを取得します。次に、DllMap(このリンクを確認)を作成する必要があります。 C#コードでLinuxの* .soライブラリ名を指定し、Windowsの別の* .dllを指定します。これは、OSに応じてライブラリ名を簡単にマップする方法です。

他のヒント

ネイティブバインディングを自動化するための非常に便利なツールはSWIGです。 http://www.swig.org/

最初のコメントに同意します。 Linuxでは.NETコードを再コンパイルせずに正常に実行できますが、ネイティブ呼び出しはネイティブにコンパイルする必要があります。

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