0

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

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

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

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

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

それで、私は何をすべきですか?

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

2 に答える 2

2

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

于 2009-10-22T18:43:33.537 に答える
0

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

最初のコメントに同意します。.NET コードは再コンパイルしなくても Linux で正常に動作するはずですが、ネイティブ呼び出しはネイティブにコンパイルする必要があります。

于 2009-10-23T12:12:51.000 に答える