这个状况是有针对性的,所以请注意图片,此问题也会发生在 VS2008 ,只是用 VS2005 为范本来说。
主要的问题是你用的编译程序语系与你开发的语系不同,例如用繁中版开发英文版软件,大部分的 状况都能正确显示英文,但却会发生当你安装你的软件在没有指定必要系统组件时,在散布免责声明 (EULA) 时发生乱码,例如没有 .Net framework 2.0 时,如下图。
这个问题是由 setup.exe 产生的,直接执行 setup.msi 则不会有此问题,如下图。
探究此问题的成因是,setup.exe 是由下面数个部分组成:
1. 基底二进制文件,$(BootStrapper)/Engine/setup.bin
2. 语系资源,$(BootStrapper)/Engine/$(lang)/setup.xml
3. 产品信息,$(BootStrapper)/Packages/$(Product)/product.xml
4. 封装信息,$(BootStrapper)/Packages/$(Product)/$(lang)/package.xml
5. 散布授权免责声明,$(BootStrapper)/Packages/$(Product)/$(lang)/eula.txt
其中 $(BootStrapper):
VS2005: C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/BootStrapper
VS2008: C:/Program Files/Microsoft SDKs/Windows/v6.0A/Bootstrapper
因此要解决乱码的问题很单纯,把:
$(BootStrapper)/Packages/DotNetFX/zh-CHT/eula.txt
换成英文版的 eula.txt 即可。
英文版的 eula.txt 哪里来?将:
$(BootStrapper)/Packages/DotNetFX/dotnetfx.exe
用 WinRAR 解压缩后,可得到各语系版本的 eula.langid.txt ,比较中文版 eula.1028.txt 与 eula.txt 的差异,只有差在少第三、四行,且 eula.txt 使用 UTF-8 格式,eula.1028.txt 使用 Unicode 格式:
MICROSOFT WINDOWS INSTALLER 2.0
MICROSOFT WINDOWS INSTALLER 3.1
跟最后少个句号,所以我们把英文版的 eula.1033.txt 插入三、四行,另存成 UTF-8 格式,并取代:
$(BootStrapper)/Packages/DotNetFX/zh-CHT/eula.txt
重新编译后可得下图:
即可解决乱码问题。如果是其他语系或必要系统组件,也可依此方式修改。我找过微软没提供不同 语系版本的 eula.txt 可下载,如果你真的要完全一字不错,你可能要安装不同版本的 Visual Studio 来取得,我自己选择从 .Net framework 2.0 Runtime 里面的 eula 来改。
另外考虑到经常性的需求,我是建议保存原始的 eula.txt ,更名为 eula.1028.txt ,等到需要哪个语系的 eula.txt 时,直接复制一个来取代 eula.txt 即可,如下图。
标准的封装部署项目,只能用此方法来处理,ClickOnce 项目可自定义 xml 的设定,指定 eula.txt ,会比这个方法简单,不需要动到软件源目录,可依需求选用。
参考信息:
http://msdn.microsoft.com/zh-tw/library/aa730839(en-us).aspx
http://msdn.microsoft.com/en-us/magazine/cc163899.aspx
下载参考:
我自制的 eula.1033.txt (压缩成 ZIP)