尝试让多个实例工作,如何让 ProductName 变量成为基于实例的目录名称?下面的代码片段出现在完整的代码中。
<Directory Id="ProductName">
我使用以下链接作为指南:
https://sklyarenko.net/posts/revisited-multiple-instance-and-patches
我尝试过以下方法:
msiexec /i MultiInstance.msi MSINEWINSTANCE=1 TRANSFORMS=":I02"
msiexec /i MultiInstance.msi MSINEWINSTANCE=1 TRANSFORMS=":I03"
它只是被复制到相同的文件夹结构。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?define ConsoleApp1_TargetDir=$(var.ConsoleApp1.TargetDir)?>
<Product Id="*" Name="SetupProject1" Language="1033" Version="1.0.0.0" Manufacturer="Tester" UpgradeCode="4ca5374e-c85c-4d75-8ca3-bfdcc63a6605">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate EmbedCab="yes" />
<Feature Id="ProductFeature" Title="SetupProject1" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
<Property Id="INSTANCEID" Value="WhereDoesValueShowUp" Admin="yes" />
<InstanceTransforms Property="INSTANCEID">
<Instance Id="I01" ProductCode="{3E3B77E8-B74A-4BD0-A426-DF48C47AF188}" ProductName="My Product 01"/>
<Instance Id="I02" ProductCode="{17D21A60-4DAF-4640-8271-52FAF88435C7}" ProductName="My Product 02"/>
<Instance Id="I03" ProductCode="{2240F420-9892-45EF-9809-326095D6AFE4}" ProductName="My Product 03"/>
</InstanceTransforms>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="ProductName">
<Directory Id="INSTALLFOLDER" Name="SetupProject1" />
</Directory>
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<Component Id="ConsoleApp1.runtimeconfig.json" Guid="7933cc56-e6ee-42be-9022-ec4eee3b2ad7" MultiInstance="yes">
<File Id="ConsoleApp1.runtimeconfig.json" Name="ConsoleApp1.runtimeconfig.json" Source="$(var.ConsoleApp1_TargetDir)ConsoleApp1.runtimeconfig.json" KeyPath="yes" />
</Component>
<Component Id="ConsoleApp1.dll" Guid="75ed96b5-a187-46aa-9def-69e475f06bd7" MultiInstance="yes">
<File Id="ConsoleApp1.dll" Name="ConsoleApp1.dll" Source="$(var.ConsoleApp1_TargetDir)ConsoleApp1.dll" KeyPath="yes" />
</Component>
<Component Id="ConsoleApp1.exe" Guid="{F4665DAB-DD96-4A06-9E0E-D58765F4A3B9}" MultiInstance="yes">
<File Id="ConsoleApp1.exe" Name="ConsoleApp1.exe" Source="$(var.ConsoleApp1_TargetDir)ConsoleApp1.exe" KeyPath="yes" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
要根据实例的
ProductName
动态设置目录名称,您可以在 Instance
部分中使用 SetName
元素的 InstanceTransforms
属性。以下是如何修改 WiX XML 代码来获得此名称:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?define ConsoleApp1_TargetDir=$(var.ConsoleApp1.TargetDir)?>
<Product Id="*" Name="SetupProject1" Language="1033" Version="1.0.0.0" Manufacturer="Tester" UpgradeCode="4ca5374e-c85c-4d75-8ca3-bfdcc63a6605">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate EmbedCab="yes" />
<Feature Id="ProductFeature" Title="SetupProject1" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
<Property Id="INSTANCEID" Value="WhereDoesValueShowUp" Admin="yes" />
<InstanceTransforms Property="INSTANCEID">
<Instance Id="I01" ProductCode="{3E3B77E8-B74A-4BD0-A426-DF48C47AF188}" ProductName="My Product 01" SetName="ProductName" />
<Instance Id="I02" ProductCode="{17D21A60-4DAF-4640-8271-52FAF88435C7}" ProductName="My Product 02" SetName="ProductName" />
<Instance Id="I03" ProductCode="{2240F420-9892-45EF-9809-326095D6AFE4}" ProductName="My Product 03" SetName="ProductName" />
</InstanceTransforms>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="ProductName" Name="[ProductName]">
<Directory Id="INSTALLFOLDER" Name="SetupProject1" />
</Directory>
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<Component Id="ConsoleApp1.runtimeconfig.json" Guid="7933cc56-e6ee-42be-9022-ec4eee3b2ad7" MultiInstance="yes">
<File Id="ConsoleApp1.runtimeconfig.json" Name="ConsoleApp1.runtimeconfig.json" Source="$(var.ConsoleApp1_TargetDir)ConsoleApp1.runtimeconfig.json" KeyPath="yes" />
</Component>
<Component Id="ConsoleApp1.dll" Guid="75ed96b5-a187-46aa-9def-69e475f06bd7" MultiInstance="yes">
<File Id="ConsoleApp1.dll" Name="ConsoleApp1.dll" Source="$(var.ConsoleApp1_TargetDir)ConsoleApp1.dll" KeyPath="yes" />
</Component>
通过此修改,将根据
ProductName
元素中指定的实例的 ProductName
属性动态设置 Instance
目录。