0

对我来说,合并 .Net 二进制文件以便我只剩下一个可执行文件始终是一个既有趣又重要的功能。根据我的阅读,有以下三种方法:

  1. 合并

    • 真正合并程序集。相当于创建一个 .csproj 并拉入所有源代码。
  2. 福迪·科斯图拉

    • 将程序集分开,但仅将它们的文件作为资源包含并相应地弯曲分辨率。
  3. .Net Core 3+ PublishSingleFile / Warp

    • 据我了解,这些方法是相似的。在第一次执行时将文件提取到临时目录,然后正常运行它们。

虽然主题非常相关,有时确实重叠,但我不打算混淆单个文件、独立部署和修剪——我主要考虑的是单个文件部分。

我认为这三种方法中的任何一种都有其自身的优点和缺点,没有一种是“最佳”方式。

  1. 合并

    • + 似乎是“合并”最自然的选择
    • + 不需要运行时加载,如果一切都在那里并且工作正常,那就是它;一旦图像在内存中,我们就完成了
    • - 每次加载所有内容可能会导致启动性能下降,这与桌面应用程序相关
    • - 内部结构发生了很大变化,程序集名称发生了变化,可能库内部结构更多地涉及应用程序代码等;我猜这可能会导致难以调试的错误,在最坏的情况下会出现在生产中。它只是改变了开发人员可能认为理所当然的事情(即他们的程序集的名称)。
    • - 可能不是概念性的,但不支持 .Net Core => dealbreaker
  2. 福迪·科斯图拉

    • + 为依赖项启用压缩
    • + 更少的内部变化,可能导致更少的不可预见的情况
    • + 可能需要操作系统来加载完整的图像,但不需要 CLR 来一次加载库,因此可能会提高启动性能
    • - 每次都需要解压缩依赖;可能是 CPU 方面的性能损失,可能是 IO 方面的性能优势
  3. 自提取

    • + 也压缩了
    • + 一旦代码被提取并运行,唯一的区别就是它的位置。因此,lib 开发人员甚至仍然可以在磁盘等上找到他们的程序集,我猜这使得运行时差异最小。
    • - 第一次启动可能需要一些明显的时间,并且是相当 IO 密集型的,一种安装。
    • + 后续运行的行为类似于非单文件部署,与其他两个相比具有各自的(劣势)优势。
    • - 带有一些不平凡的问题。何时更新提取的文件?谁删除了提取文件的旧版本?如果磁盘已满/...怎么办?
    • - 执行不再无副作用。
    • - 所需磁盘空间的两倍以上。

在我个人显然不是详尽且非科学的经验中,(3)有时有一些粗糙的边缘并表现出奇怪的行为,而(2)在我一直使用它的几年里工作得非常好(尽管比较框架与核心)。但这可能是由于(3)的实施非常新或我的误解。

我发布这个问题的目的是(a)更好地理解这一点,(b)理解微软为什么选择(3)。所以,会很棒

  • 如果我错过了三者之间的差异以指出它们(请随时编辑问题以将内容保存在一个地方)。
  • 如果我做出错误的假设来指出它们。
  • 如果总体上有更多选择,或者我对其中一个概念有误以指出它们
  • 如果有关于推理的内容,为什么微软选择(3)作为更好的方式(这可能会加深我对利弊的理解)来为我指明正确的方向。

虽然我知道很难与框架功能竞争,但我有点难过Costura 处于维护模式,因为我认为它比框架方法具有优势,使第二个选项成为可行的选择。因此,我问这个问题的原因之一是了解(3)是否有任何严重的优势,而不是(2)我忽略了。

4

0 回答 0