WIX Toolset-MSI名称和安装文件夹中的应用程序版本

问题描述

在我的WIX项目中,我确实从我的应用程序的.exe文件中读取了BuildVersion变量。可以说目前是其1.0.0.0。总体思路是允许用户在单个PC上安装多个版本的应用程序。有两个问题:

  1. 如何使用名称的版本信息创建.msi输出文件?例如Application_v1.0.msi。老实说,我什至不知道从哪里开始。

  2. 如何在“开始”菜单和“程序”文件中为每个版本创建单独的文件夹?想法是在开始菜单和程序文件中都具有类似于Application / v1-0(v2-0,v3-1 ..generaly v [major]-[minor])的结构。

到目前为止,根据第2点,我尝试了一些“简单”的操作,例如在本地化文件中:

<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization">
<String Id="ProductNameFolder">MyApp\[BuildVersion]</String>

然后在我确实具有“目录”部分的文件中:

<Directory Id="TARGETDIR" Name="SourceDir">

        <!-- Shortcut folder is a Start Menu Folder-->
        <Directory Id="ProgramMenuFolder">
            <Directory Id="InstallProgramMenuFolder" Name="!(loc.ProductNameFolder)" />
        </Directory>

        <?if $(var.Platform)=x86 ?>
        <!-- Program Files folder-->
        <Directory Id="ProgramFilesFolder">
            <Directory Id="INSTALLFOLDER" Name="!(loc.ProductNameFolder)" />
        </Directory>
        <?else?>
        <!-- Program Files (64 bit) folder-->
        <Directory Id="ProgramFiles64Folder">
            <Directory Id="INSTALLFOLDER" Name="!(loc.ProductNameFolder)" />
        </Directory>
        <?endif?>

    </Directory>

但是,当我尝试在使用loc.ProductNameFolder的任何地方创建错误消息Invalid DefaultDir string时。

我在“目录”部分也尝试过类似的操作:

<Directory Id="InstallProgramMenuFolder" Name="!(loc.ProductNameFolder)\$(var.BuildVersion)" />

但这确实给了我类似以下错误The Directory/@Name attribute's value '!(loc.PoductNameFolder)\1.0.0.0',is not a valid long name because it contains illegal characters

一般的想法是使用类似v [major]-[minor]的文件名称,但是一开始我尝试使用简单的version = folder name概念。到目前为止,我也不知道如何将Version转换为v [major]-[minor]。

我正在使用WIX Toolset 3.11.2和Visual Studio 2019 Extension。

解决方法

我自己针对第1点的“部分”解决方案-安装文件的版本:

卸载项目,在BeforeBuild部分添加如下内容:

获取版本号:

<GetAssemblyIdentity AssemblyFiles="..\src\MyApp\bin\Debug\MyApp.exe">
  <Output TaskParameter="Assemblies" ItemName="AssemblyVersion" />
</GetAssemblyIdentity>

创建具有以下版本的自定义.msi名称:

<CreateProperty Value="MyAppInstaller_v%(AssemblyVersion.Version)">
    <Output TaskParameter="Value" PropertyName="TargetName" />
</CreateProperty>

结果是您将获得类似MyAppInstaller_v1.0.0.0的信息。仍然我需要将其转换为MyAppInstaller_v1.0