9

クロスプラットフォームであるC#でアプリケーションを作成しています。DllImportいくつかの異なるライブラリに使用します。また、x32とx64の両方です。自分でコンパイルした.dll/.soで正しく動作するようです。x32共有ライブラリをx32サブフォルダーに配置し、x64共有ライブラリをx64サブフォルダーに配置しました。

.net Frameworkを介したWindowsSetDllDirectory("x32" or "x64")では、現在のランタイムに応じて呼び出します。モノラルでは、Windows、Linux、またはMacのいずれかを使用してDllMap、RandomLibrary.dll.configでを使用します。x32またはx64ディレクトリにあるファイルに対しては正常に機能します。

ただし、DllImportFreeType2など、自分が作成していないライブラリにも使用します。Windowsでは、ビルドされたライブラリを2つのサブフォルダに押し込みました。ただし、Linuxでは、使いやすいローカルパッケージマネージャーを介してインストールできるlibfreetype6ライブラリを使用したいと思います。DllMapリンクを/usr/lib/x86_64-linux-gnu/libfreetype.so.6にハードコーディングできますが、使用するディストリビューションに応じてfreetypeファイルが変わると思います。

使用しているディストリビューションに関係なく、libfreetype.soを見つける簡単な方法はありますか?

4

2 に答える 2

3

Linux では DllImport("libfreetype.so.6") を使用するだけで十分です。これは、システムが正しく処理するように構成されている必要があるためです。正しいパッケージがインストールされていることを確認してください。うまくいかない場合は、システムの設定が間違っている可能性があります。得られたエラー、LD_LIBRARY_PATH 環境変数の値、/etc/ld.so.conf の内容、および /etc/ld.so.conf.d 内のファイルを投稿してください。 /。の出力

/sbin/ldconfig -p |grep freetype

同様に便利です。

于 2012-08-10T08:08:09.800 に答える
2

Mono には、これ専用のもの/手順があり、DllMapと呼ばれます。どのアンマネージ ライブラリをどのプラットフォームにロードするかを指定できます。例えば:

<configuration>
    <dllmap dll="foobar" os="linux" wordsize="64" target="linux/amd64/libfoobar.so" />
    <dllmap dll="foobar" os="linux" wordsize="32" target="linux/i386/libfoobar.so" />
</configuration>

私は上記を自分で試したことはありません - dllmap ドキュメントは、ターゲット値がパスではないことを示唆しているようですが、確信が持てません。

もう 1 つの方法は、単純なシェルスクリプトまたはバッチ ファイルを使用することです。archLinux では、シェル スクリプトを呼び出して適切に設定することで、アーキテクチャを簡単に解決できますLD_LIBRARY_PATH。私は通常、自分の mono プログラムの周りにシェル ラッパーを好みます (MyProgram.exeコンソールで見ると見苦しくなります)。

最後に、共有ライブラリをプリロードするためにdlopenまたはLoadLibararyに pinvoke すると、もっと楽しくなるかもしれません。

マネージド アプリが起動したら、現在のアーキテクチャを決定しdlopen()、Linux またはLoadLibaray()Windows の場合に使用します。

于 2012-08-11T06:59:09.227 に答える