使用 Delphi 构建大于 100MB 的 exe 是否有任何风险?

Is there any risk in having an exe larger than 100MB built with Delphi?

我的 Delphi win32 VCL 应用程序 被部署为一个大的 exe。该应用程序是一个客户端服务器应用程序,带有连接到 SQL 服务器.

的胖客户端

这很方便(更新共享文件夹中的一个文件就足够了,应用程序也更新了——当然数据库架构也会更新)。

因为我在每个版本中都使用了很多 "fat" 第三方组件,例如 ReportBuilderDevExpress,所以 exe 文件的大小增加主要是因为那些组件变得越来越大。

在 dpr 中,我设置了这些标志以确保从共享文件夹或可移动设备启动 exe 时,它​​始终加载到内存中(并避免奇怪的连接错误):

{$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP}
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}

如果 exe 是使用 Release Build Configuration 构建的,则普通 exe 通常会减少大约 50% 的大小(与 Debug Build Configuration 相比)。但是因为我使用 EurekaLog,所以使用 Build 而不是 Debug 来构建只是略微减小了大小。

目前我的 exe 是 115MB(使用 "Build" 构建配置和 EurekaLog 构建)。

有人体验过吗?是否有建议不要超过的已知限制?

以下是近年来规模的增长情况:

2014 年:76MB

2015 年:82MB

2016 年:90MB

2017: 97MB

2018: 115MB

因为我最近超过了 100MB 的限制,我开始担心了。

我知道可以使用运行时包进行构建,但我的问题集中在尽可能保持单个大 exe 方法上。

我记得 cnPack 有一个使用清洁器的功能,我以前试过。这可能会帮助我删除一些未使用的单元,从而减少 exe 的大小,但无论如何这无法阻止让我超过 100MB 的趋势。

谢谢。

我问了 EurekaLog,他们回答说:

The size of your EXE after EurekaLog processing is mostly determined by the size of your MAP file. Other things that affect the size of the EXE include the EurekaLog options you select, such as memory checks, Senders, JCL support, Etc.

You can reduce the size of the EXE somewhat by selecting the EL Compression option. Keep in mind that compression can affect startup time, since the debug information needs to be decompressed when you launch the EXE.

You can further reduce the MAP file size by turning off debug information in parts of your program that you don't need to stack trace after a crash. Large component libraries like DevExpress would be a good start.

Last, you may have other compiler options like range checking turned on/off in tandem with EurekaLog. Some compiler options can contribute to EXE size.

You can use our EurekaLog PE Analyzer to view details on debug information size, Compression, Etc.

所以当用户 Ville Krumlinde 说调试信息是原因时,他是对的。所以要回答这个问题,拥有一个大的 exe 没有问题,要减少 exe 的大小,必须使用 Release Build Configuration,要使用 Eureka Log,应该尝试减少映射文件的大小,在上面的引用中,大多数提示都有.

您可以使用 "Store all names externally" option 将一些调试信息卸载到外部文件,但您的可执行文件将不再是 self-contained。