使用WiX的另一个项目的参考版本字符串

本文关键字:版本 字符串 参考 另一个 WiX 使用 项目 | 更新日期: 2023-09-27 18:09:05

现在,在我们的一个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);
    }
}

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

请注意,在这种情况下,产品版本与程序集版本不匹配。

使用WiX的另一个项目的参考版本字符串

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()中读取注册表项。我不确定这是否值得让应用变得更复杂,因为你现在已经有了简单、强大的解决方案。

我不确定你是否愿意像我的解决方案那样麻烦,但我想告诉你:

首先,应该将程序集版本存储在AssemblyInfo.cs文件中。这将允许在项目之间通过引用所有项目中的公共AssemblyInfo来共享版本(和其他特定于公司的信息)。可以通过将现有文件作为链接添加到项目中来实现。例如,我们所有的项目都有两个AssemblyInfo文件:一个是本地的,特定于项目的(GUID等…),另一个是公共的,包含版本信息和公司名称。

[assembly: AssemblyFileVersion("1.3.100.25")]
[assembly: AssemblyVersion("1.1.0.0")]

第二,如果您还没有这样做,那么将WIX版本从WXS文件中取出,并将其放入单独的WXI文件中。同样,这将允许单独编辑版本(和其他常量,如果需要的话),并在几个项目中引用它:

<?include ..'..'..'Common'WIX'Version.wxi ?>

然后,您将不得不为MSBuild编写一个构建任务,并将其合并为所有项目的预构建依赖项。在构建任务中,您可以从WXI文件中获取版本号并将其放入AssemblyInfo文件中,反之亦然。您甚至可以将版本数据存储在单独的XML中,并将其注入WXI和AssemblyInfo中。在c#中读写WXI和AssemblyInfo是一个简单的字符串操作,不要为反射和其他东西而烦恼。

这第三步是唯一必需的,也是最困难的。如果您有很多项目,或者使用自动构建,您可能应该做所有这些。