gpt4 book ai didi

mono - 在 MonoMac 应用程序中包含自定义 dll 和 dylib

转载 作者:行者123 更新时间:2023-12-04 11:55:07 26 4
gpt4 key购买 nike

背景:我的 MonoMac 应用程序使用 sqlite3.0.8.6.dylib 的自定义构建。

我需要确切的步骤让 MyApp.app 使用这个 dylib。

以下是我采取的一些步骤:

  • 将 dylib 复制到 MyApp.app/Contents/SharedSupport。 (相关问题:这是第 3 方 dylib 的首选位置还是首选 MyApp.app/Contents/Frameworks?)
  • 更改了库的已安装名称,使其与其新位置相匹配。
    MyApp.app/Contents/SharedSupport> otool -L libsqlite3.0.8.6.dylib 
    libsqlite3.0.8.6.dylib:
    @executable_path/../SharedSupport/libsqlite3.0.8.6.dylib (compatibility version 9.0.0, current version 9.6.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

  • 问题
  • MyApp.app/Contents/MacOS/MyApp 不直接引用 dylib,所以我不能使用 install_name_tool 指向新的库位置。我相信该库是由 System.Data.Sqlite.dll 引用的。
  • 我想在启动器脚本中覆盖 DYLD_FALLBACK_LIBRARY_PATH 但 MonoMac 现在使用二进制启动器 (MyApp.app/Contents/MacOS/MyApp),而不是脚本,所以我不走运。

  • MonoMac 大神们能帮忙解决一个简单的解决方案吗?我已经断断续续地花了几个月的时间,试图让它发挥作用。

    并请提供确切的步骤 - 这个问题是关于细节的。

    最佳答案

    看看我对这个问题的回答:
    Setting path of the Native Library for DllImport on Mono for Mac

    二进制启动器来自 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 .
  • 计算托管程序集所在目录到 native 的相对路径.dll并在前面加上 @executable_path到它。

    例如,如果您的托管程序集位于Contents/MonoBundle/MyApp.exe和 native dllContents/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 field 。在 MonoDevelop 中右键单击文件,从上下文菜单中选择“快速属性”并启用“复制到输出目录”。这会将文件复制到 Contents/MonoBundle目录,所以它就在您的 MyApp.exe 旁边.
  • 使用 [DllImport ("sqlite")]在您的代码中引用它。

  • 当另一个库引用它时

    当另一个库时,例如 Mono.Data.Sqlite.dll引用它,它变得有点复杂。

    使用与上述相同的步骤,但您需要找出其他库在其 [DllImport] 中使用的名称。引用 native 库并将其放入 <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”来引用 native dll,所以您的 MyApp.exe.config文件将如下所示:
        <configuration>
    <dllmap dll="sqlite3" target="@executable_path/../SharedSupport/sqlite3.0.8.6.dylib" />
    </configuration>

    关于mono - 在 MonoMac 应用程序中包含自定义 dll 和 dylib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14536843/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com