看看我对这个问题的回答:
Setting path of the Native Library for DllImport on Mono for Mac
二进制启动器来自monodevelop/main/build/MacOSX/monostub.m。
您可以使用任MyApp.app/Contents/Frameworks
一路径或其他路径,重要的部分是不要在您的路径中使用任何路径名,[DllImport]
而是将<dllmap>
using添加@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>