この質問に対する私の答えを見てください:
MonoforMacでのDllImportのネイティブライブラリのパスの設定
バイナリランチャーは、monodevelop / main / build / MacOSX/monostub.mから提供されます。
どちらかMyApp.app/Contents/Frameworks
または他のパスを使用できます。重要な部分は、パス名を使用しないことです。[DllImport]
代わりに、他の回答で説明したように、<dllmap>
使用法を追加@executable_path
します。app.config
そこにはgithubのテストアプリへのリンクもあります。
詳細な手順
たとえば、内のパスを選択してMyApp.app
、ネイティブdllをインストールしますContents/SharedSupport/sqlite3.0.8.6.dylib
。
管理対象アセンブリが配置されているディレクトリからネイティブへの相対パスを計算し、その先頭に.dll
追加@executable_path
します。
たとえば、管理対象アセンブリがに
Contents/MonoBundle/MyApp.exe
あり、ネイティブdllがに
Contents/SharedSupport/sqlite3.0.8.6.dylib
ある場合、それは
@executable_path/../SharedSupport/sqlite3.0.8.6.dylib
です。
を使用して、ライブラリのインストール名をこの相対パスに変更しinstall_name_tool
ます。
MyApp.exe.config
プロジェクトに新しいファイルを追加します。
<configuration>
<dllmap dll="sqlite" target="@executable_path/../SharedSupport/sqlite3.0.8.6.dylib" />
</configuration>
手順2で計算したパスをtarget
フィールドに使用します。MonoDevelopでファイルを右クリックし、コンテキストメニューから[クイックプロパティ]を選択して、[出力ディレクトリにコピー]を有効にします。これにより、ファイルがディレクトリにコピーされるContents/MonoBundle
ため、のすぐ隣に配置されますMyApp.exe
。
[DllImport ("sqlite")]
コードでこれを参照するために使用します。
別の図書館がそれを参照するとき
たとえば、別のライブラリがMono.Data.Sqlite.dll
それを参照する場合、それはもう少し複雑になります。
上記と同じ手順を使用しますが、他のライブラリが[DllImport]
ネイティブライブラリを参照するために使用している名前を特定し、それをに入れる必要があり<dllimport dll="..." />
ます。[DllImport]
ソースコードでステートメントを探すかmonodis
、アセンブリで実行して次のように検索できpinvokeimpl
ます。
// method line 679
.method assembly static hidebysig pinvokeimpl ("sqlite3" as "sqlite3_create_function" cdecl )
default int32 sqlite3_create_function (native int db, unsigned int8[] strName, int32 nArgs, int32 nType, native int pvUser, class Mono.Data.Sqlite.SQLiteCallback func, class Mono.Data.Sqlite.SQLiteCallback fstep, class Mono.Data.Sqlite.SQLiteFinalCallback ffinal) cil managed preservesig
{
// Method begins at RVA 0x0
} // end of method UnsafeNativeMethods::sqlite3_create_function
したがってMono.Data.Sqlite.dll
、「sqlite3」を使用してネイティブdllを参照しているため、MyApp.exe.config
ファイルは次のようになります。
<configuration>
<dllmap dll="sqlite3" target="@executable_path/../SharedSupport/sqlite3.0.8.6.dylib" />
</configuration>