0


0

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)は失敗しました:

未処理の例外:System.DllNotFoundException:Foo(single [2]、int、single [])

それで、私はどうすればいいですか?

  • 輸出申告を何らかの方法で変更しますか?

  • Linux上でgccを使ってそのものを.soライブラリにコンパイルし、それをロードしますか?

  • Linux上でgccを使用してそれを.dllにクロスコンパイルし、それをロードしますか?

  • 他に何か?

2 Answer


2


あなたはあなたのライブラリをLinux上で再コンパイルする必要があります、あなたはfoolib.soを得るでしょう。 その後、C#コードでLinux用の* .soライブラリ名を指定する必要がなくなるように、DllMap( リンクを確認)を作成する必要があります。 Windows用の個別の* .dll - これは、OSに応じてライブラリ名を簡単にマッピングするための方法です。


0


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

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