gpt4 book ai didi

c# - 我怎样才能说服 mkbundle 包含 MonoPosixHelper?

转载 作者:太空狗 更新时间:2023-10-29 23:23:19 35 4
gpt4 key购买 nike

我正在使用 mkbundle 并尝试创建一个使用 Isis2 的小程序 IdaTester 的嵌入式版本。该系统反过来使用依赖于 MonoPosixHelper 的 Mono 特性

我的问题是 mkbundle 无法识别依赖项,我最终得到一个仍需要动态链接到 ~/bin/lib/libMonoPosixHelper.so 的可执行文件,当我将此可执行文件移动到我所在的系统时会导致问题没有安装单声道。实际上,bundle 缺少它应该静态链接的东西之一。

我的可执行文件确实有效,但前提是我确保只在“正确位置”具有动态库的机器上运行它。这违背了嵌入式可执行文件的目的......我希望能够将这个程序作为一种服务器交给人们,他们可以把它放在任何地方并作为二进制文件启动,显然如果他们需要安装库才能工作,服务器并不是完全独立的!

我看到了如何强制 mkbundle 包含程序所依赖的任何 dll 文件,但是 MonoPosixHelper 并不作为 dll 存在;这是一个仅限 Linux 的库,仅作为共享库存在。有谁知道“强制”捆绑静态嵌入它的方法吗?

如果这有帮助,我的小编译脚本如下:

mcs -debug+ IdaTester.cs Isis.cs -r:System.dll -r:Microsoft.CSharp.dll -r:Mono.Posix.dll
mkbundle --static -o IdaTester IdaTester.exe --deps

然后我运行 IdaTester;这适用于可以找到 libMonoPosixHelper 库的平台,但如果在未安装 libMonoPosixHelper 的平台上运行,则在尝试动态加载该库时将在运行时失败...

最佳答案

需要随应用程序分发 libMonoPosixHelper.so 并更改 dll 映射以使其工作。

问题背景 - 库在运行时加载

libMonoPosixHelper 不是静态链接的,而是作为 P/Invoke 调用搜索和加载的,例如下面的示例:

    [DllImport ("MonoPosixHelper")]
static extern int zipClose (ZipHandle handle, string globalComment);

也就是说,它只在运行时请求,而不是编译时请求,因此不能提前链接。

修复它 - 分发 libMonoPosixHelper.so

需要四个步骤。

  1. 将 libMonoPosixHelper 复制到您将用于分发程序的目录。
  2. 更新 DllMap 配置文件以避免硬编码位置。
  3. 使用mkbundle嵌入配置文件
  4. 将带有 libMonoPosixHelper.so 的路径添加到安装机器上的 LD_LIBRARY_PATH。

执行每个:

<强>1。将 libMonoPosixHelper 复制到您将用于分发程序的目录。

libMonoPosixHelper 通常位于 lib 文件夹中,只需将其复制到您要从中制作压缩包的文件夹即可。

cp $MONO_ROOT/lib/libMonoPosixHelper.so ~/MY_PROGRAM/

<强>2。更新 DllMap 配置文件以避免硬编码位置。

这是避免硬编码路径问题的关键位。我们需要使用不指定路径的 mkbundle 嵌入配置文件。为此,首先找到单声道配置文件,并将其复制到本地目录

cp $MONO_ROOT/etc/mono/config ~/MY_PROGRAM/config

现在我们需要更改此文件以删除 dll 的特定路径,使用您喜欢的编辑器打开它并更改路径以避免特定前缀:

<dllmap dll="MonoPosixHelper" target="MACHINE_SPECIFIC/lib/libMonoPosixHelper.dylib" os="!windows" />

<dllmap dll="MonoPosixHelper" target="libMonoPosixHelper.dylib" os="!windows" />

<强>3。使用 mkbundle 嵌入配置文件

将以下选项添加到您的 mkbundle 命令以嵌入新编辑的配置文件:

   --config MY_PROGRAM/config

<强>4。将带有 libMonoPosixHelper.so 的路径添加到安装机器上的 LD_LIBRARY_PATH。

现在您可以压缩您的 mkbundled 可执行文件、libMonoPosixHelper.so 和任何其他文件以供分发。当解压缩并在机器上运行时,dlopen 现在将查找 libMonoPosixHelper.so 就像任何其他 dll 一样。因此,只需将包含您的 libMonoPosixHelper 分布式版本的任何目录添加到它们的 LD_LIBRARY_PATH 环境变量

关于c# - 我怎样才能说服 mkbundle 包含 MonoPosixHelper?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18489272/

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