使用WiX从另一个项目引用版本字符串

时间:2013-04-12 14:44:44

标签: c# .net wix

目前,在我们的某个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);
    }
}

这看起来很笨重,我觉得不必在两个地方更新我们的产品版本。哪里是存储版本字符串信息的最佳位置,所以我只需要在一个地方更新它,只需从表单和安装程序中引用这些数据?

注意,在这种情况下,产品版本与装配版本不匹配。

2 个答案:

答案 0 :(得分:5)

C#没有像C / C ++和WiX工具集那样的预处理器,所以你不能做那件显而易见的事情并通过那条路线传递版本。如果产品版本与程序集文件版本匹配,则可以执行以下操作:

<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#中的简单字符串操作,不要用反射和东西来打扰自己。

这第三步是唯一需要的,也是最难的。如果您有很多项目或使用自动构建,那么您应该完成所有这些。