【问题标题】:Packing an exe + dll into one executable (not .NET) [duplicate]将exe + dll打包成一个可执行文件(不是.NET)[重复]
【发布时间】:2010-09-25 02:48:29
【问题描述】:

可能重复:
How can a C++ windows dll be merged into a C# application exe?

是否有人知道可以将多个 DLL 和一个 .EXE 打包到一个可执行文件中的程序。这里我说的不是 .NET 案例,我说的是通用 DLL,其中一些是我用 C++ 生成的,还有一些是我无法控制的外部 DLL。

我的具体案例是一个用py2exe打包的python程序,我想通过打包来“隐藏”另一个DLL。这个问题很笼统。

看过的东西:

  • ILMerge:特定于 .NET
  • NETZ:特定于 .NET
  • UPX: 做了 DLL 压缩而不是多 DLL + EXE 打包
  • FileJoiner
几乎明白了。它可以将可执行文件 + 任何内容打包到一个 exe 中,但是当打开时,它将为每个打包的文件启动默认打开器。因此,如果用户用户 dll 依赖安装,它将启动它(因为这是默认的 dll 打开器)。

也许这不可能?


答案总结:

DLL 的打开是由操作系统管理的,因此将 DLL 打包成可执行文件意味着在某些时候,它们需要被提取到操作系统可以找到它们的地方。没有灵丹妙药。

所以,我想要的是不可能的。

除非……

我们更改了操作系统中的某些内容。感谢 Conrad 将我指向 ThinInstall,它虚拟化了应用程序和操作系统加载机制。使用 ThinInstall,可以将所有内容打包在一个 exe 中(DLL、注册表设置等)。

【问题讨论】:

  • 你也可以使用 boxedapppacker - 类似于 thinstall。
  • 或使用 BoxedApp SDK - 用于虚拟化文件和注册表的开发人员库
  • 我不认为这是重复的,因为源应用程序不像所谓的重复问题那样在 C# 中。还有另一种免费且简单的解决方案。 (至少它适用于我的简单项目。)See this answer on Superuser

标签: dll


【解决方案1】:

看看BoxedApp。祝你好运!

【讨论】:

  • 与 ThinApp 和 Evalaze 不同,BoxedApp 不会增加 14MB 的应用程序大小,只会增加几 MB。哪个好。 -- 四年前我在这里评论说它不适用于 UPX 打包的 EXE 文件,但作者写信说我应该使用“在虚拟环境中运行”(我不知道以前是否有该选项与否)——这奏效了。当我尝试使用打包的 Qt 应用程序时,我遇到了其他一些麻烦。但正如作者就评论所写的那样,如果您遇到问题,他愿意参与。因此,如果您可以使用商业解决方案,这可能对您有用。
  • BoxedApp 还对注册表进行了一些虚拟化。是否可以在没有任何其他功能的情况下合并 exe+dll?
【解决方案2】:

看看 Thinstall ThinApp

【讨论】:

  • 链接似乎不再有效
  • @bigb:被VMWare收购:en.wikipedia.org/wiki/VMware_ThinApp
  • 它可以工作...但是对于考虑使用此选项的任何人,ThinApp 都会将您的应用程序与名为 TSASurrogate.exe 的东西打包在一起,在 5.1 版中它是 14 兆字节。在我看到的情况下,程序的大小增加了一倍多。
【解决方案3】:

试试PowerpackerEvalaze 是另一个免费的虚拟化解决方案。 Enigma Virtual Box免费版

【讨论】:

  • Enigma Virtual Box 为我工作
  • Enigma Virtual Box 工作正常。其余链接似乎已失效。
【解决方案4】:

如果可执行文件静态链接到 DLL,即没有调用 LoadLibrary,那么我认为没有任何机制可以将 DLL 打包到可执行文件中,因为 DLL 加载是由 OS 应用程序加载器完成的在调用“main”函数之前。据我所知,解决这个问题的唯一方法是将exe和dll放入另一个exe中。这个包装的exe将真正的exe和dll解压到一个临时文件夹中并启动exe,当exe退出时删除文件。

如果您调用LoadLibrary/Ex 来加载dll,请在调用LoadLibrary/Ex 之前将dll 从exe 资源中提取到一个文件中。

真正的问题是LoadLibrary 函数在加载库时会修复大量地址,并且仅在从文件加载时才有效。

【讨论】:

  • 我想问题是'是否可以编写一个从 DLL 中获取代码的链接器,就像从 LIB 文件中获取代码并将其添加到正在链接的 EXE 中一样?跨度>
  • 包装器 .EXE 是我使用的方法。显然,现在您需要考虑一下将所有内容解压缩到哪里 - 不要假设您可以解压缩到 \program files\... 而无需以管理员身份运行
【解决方案5】:

您可以将 DLL 作为二进制资源添加到您的 EXE 中。在启动时,您的 EXE 可以将资源解压缩到一个临时文件夹中,并LoadLibrary() 生成 DLL。

【讨论】:

    【解决方案6】:

    你看过我的廉价实用清单吗?

    应该有几种便宜(即相当便宜)的工具 将非网络应用程序的 DLL 链接在一起,例如:

    1.) Molebox Pro(欧盟 100) 2.) BitArt 的 Fusion(160 美元) 3.) VB 包装(100 美元) 4.) PE 套装(30 美元)

    此外,在“www.oreans.com”上,您可能会发现 欧盟 320 的面向保护的程序包, 正如他们声称的那样,可以链接 Win32 或“.Net”文件 一起;然而,当我向他们询问具体的 场景,我会使用他们的“XBundler For Win32/.NET”以打包一个“.Net”EXE,然后 会尝试在Windos 98(没有框架)上运行它, 他们说这行不通。 :-(

    EXE 崇拜者

    【讨论】:

      【解决方案7】:

      您可以使用 valgrid、thinstall 或 boxedapp.... 我更喜欢后者。

      【讨论】:

        【解决方案8】:

        MoleBox Pro 完全符合您的要求,但它是共享软件,除非您购买完整版,否则打包的可执行文件将在启动时显示一个对话框,内容类似于“此文件由 MoleBox 的试用版打包,请不要分发它”

        您可以在这里下载:link

        很遗憾,我一直无法找到完全令人满意且免费的解决方案

        【讨论】:

        • 请注意MoleBox was open-sourced。但在撰写本文时,自其发布(2017 年 8 月)以来,它还没有通过任何添加的提交进行维护。
        【解决方案9】:

        有人告诉我可以请求一个共享对象链接到另一个共享对象,从而在 Linux 中将它们合并为一个

        但它不适用于 Windows 本机 dll,我遇到的一件事是我们可以使用链接器将所有 obj 链接在一起,而不管它们最初属于哪个项目。当然,它们需要有类似的链接选项。

        【讨论】:

          猜你喜欢
          • 2011-11-25
          • 2020-07-12
          • 2013-06-15
          • 1970-01-01
          • 2019-11-10
          • 1970-01-01
          • 2020-11-13
          • 2019-12-06
          相关资源
          最近更新 更多