问题描述
在我的WIX项目中,我确实从我的应用程序的.exe文件中读取了BuildVersion变量。可以说目前是其1.0.0.0。总体思路是允许用户在单个PC上安装多个版本的应用程序。有两个问题:
-
如何使用名称的版本信息创建.msi输出文件?例如Application_v1.0.msi。老实说,我什至不知道从哪里开始。
-
如何在“开始”菜单和“程序”文件中为每个版本创建单独的文件夹?想法是在开始菜单和程序文件中都具有类似于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