目前,在我们的某个WiX安装程序中,我们明确定义了产品版本字符串,如下所示:
<?define ProductVersion="1.2.3"?>
我们在另一个表单的标题中也使用相同的版本号,下面是一个非常简单的示例,说明如何应用:
public partial class frmMain : Form
{
// assume the designer code is all properly generated
private const string VERSION = "1.2.3";
public frmMain()
{
InitializeComponent();
this.Text += string.Format(" v{0}", VERSION);
}
}
这看起来很笨重,我觉得不必在两个地方更新我们的产品版本。哪里是存储版本字符串信息的最佳位置,所以我只需要在一个地方更新它,只需从表单和安装程序中引用这些数据?
注意,在这种情况下,产品版本与装配版本不匹配。
答案 0 :(得分:5)
<Product Version='!(bind.fileVersion.FileIdOfAssembly)'>
如果文件版本匹配,这将是理想的。如果没有,那么剩下的唯一选择是在安装时写一些东西并在运行时读取它。例如:
<RegistryValue Root='HKLM'
Path='SOFTWARE\!(bind.property.Manufacturer)\!(bind.property.ProductName)'
Name='Version' Value='!(bind.property.ProductVersion)' Type='string' />
然后在你的frmMain()中读取该注册表项。不确定它是否值得应用程序的额外复杂性,因为您现在拥有简单,强大的解决方案。
答案 1 :(得分:1)
我不确定您是否愿意经历我的解决方案所需的麻烦,但现在就是这样:
首先,您应该将程序集版本存储在AssemblyInfo.cs文件中。这将允许在项目之间共享版本(以及其他公司特定的信息),只需在所有项目中引用通用的AssemblyInfo即可。您可以通过将现有文件作为链接添加到项目来实现。例如,我们所有的项目都有两个AssemblyInfo文件:一个是本地文件,一个是项目特定的(GUID等等),另一个是常见的,带有版本信息和公司名称。
[assembly: AssemblyFileVersion("1.3.100.25")]
[assembly: AssemblyVersion("1.1.0.0")]
其次,如果您还没有这样做,请从WXS文件中取出WIX版本并将其放入单独的WXI文件中。同样,这将允许单独编辑版本(和其他常量,如果需要),并在几个项目中引用它:
<?include ..\..\..\Common\WIX\Version.wxi ?>
然后,您将必须为MSBuild编写构建任务,并将其作为所有项目的预构建依赖项合并。在构建任务中,您可以从WXI文件中获取版本号并将其放入AssemblyInfo文件中,反之亦然。您甚至可以将版本数据存储在单独的XML中,并将其注入WXI和AssemblyInfo。读写WXI和AssemblyInfo是C#中的简单字符串操作,不要用反射和东西来打扰自己。
这第三步是唯一需要的,也是最难的。如果您有很多项目或使用自动构建,那么您应该完成所有这些。