F# resxc.exe BUG

我在研究如何把资源嵌入 F# 程序时, 从 F# 的示例中找到了答案 —- Samples101

示例的编译参数主要部分如下:

%FSC% --no-warn 62 -o samples101.exe SampleForm.resx sample.fs beginnersInLightSyntax.fs sampleform.fs program.fs

这其实是把 .resx 资源当作工程的一部分直接编译到 .exe 当中.

当我使用 FSharp-1.9.4.17 对其进行编译的时候, 我发现生成的 samples101.exe 文件尺寸有些不大对劲, 竟然有 323KB. 尝试使用 Reflector for .NET 打开生成的可执行文件, 我惊奇的发现, 文件内竟然嵌入了七个相同的资源.

查阅一些资料后明白, 原来在将 .resx 资源添加到工程中, 编译时会调用 resxc.exe 将 .resx 转化成 .resources 资源, 编译完成后又删除了中间过程产生的 .resources. 于是我试着使用 resxc.exe 手动生成 .resources, 发现生成的资源文件竟然比原有文件大了数倍. 看来问题就出现在 resxc.exe 身上了.

接下来的一切也证明了这一点, 使用 Reflector for .NET 打开 .resx 文件, 再另存为 .resources, 文件按照预期的尺寸生成了, 比原有文件稍小, 毕竟是相同的内容, 二进制的 .resources 文件当然要比十进制 XML 格式的 .resx 文件小一点才对.

把直接嵌入的方式改为使用参数嵌入 --resource SampleForm.resources, 文件尺寸也降至 119KB.

我考虑到了正在使用的 Win2k8 系统的特殊性, 又在一台只有 F# 安装包和 .NET 的 WinXP 系统的笔记本上试了一下, 资源还是被嵌入了七次. 或许这真的是一个 七次资源 BUG (7 Times Resources BUG)