Wix 实例转换动态 ProductName 和 Id
Wix Instance Transform Dynamic ProductName and Id
我有一个 Wix wxs 文件,我在其中配置了使用实例转换的多个实例。
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?define WixDemoWPFApp_TargetDir=$(var.WixDemoWPFApp.TargetDir)?>
<Product Id="*" Name="WixSetupWPFApp" Language="1033" Version="2.0.0.0" Manufacturer="Licence Owner"
UpgradeCode="ae4af8f5-9287-408a-b7bd-d2fdb89a8da7">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="Downgrade not allowed" />
<MediaTemplate />
<Property Id="INSTANCEID" Value="0" />
<InstanceTransforms Property="INSTANCEID">
<Instance Id="I01" ProductCode="{888F3620-F2AB-4C0B-A276-0A5AE9C0B6CB}" ProductName="WixDemo 3.7.4 Dev" />
<Instance Id="I02" ProductCode="{01D23E62-A369-43E1-914A-FA017B1EE822}" ProductName="WixDemo 3.7.4 Test" />
<Instance Id="I03" ProductCode="{00D804D7-0AD0-412C-805A-4D37FF74FFA3}" ProductName="WixDemo 3.7.5" />
<Instance Id="I04" ProductCode="{6C3E5B4E-BF7D-4E7E-A62A-B7DFB750F581}" ProductName="WixDemo 3.7.6" />
</InstanceTransforms>
<Feature Id="ProductFeature" Title="WixSetupWPFApp" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<SetDirectory Id="WINDOWSVOLUME" Value="[WindowsVolume]" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="WINDOWSVOLUME">
<Directory Id="WixDemo" Name="WixDemo">
<Directory Id="INSTALLLOCATION" Name="WixDemo" />
</Directory>
</Directory>
</Directory>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLLOCATION">
<Component Id="WixDemoWPFApp.exe" Guid="42907ee1-2bb2-4416-8d8f-cebc2bf53f09">
<File Id="WixDemoWPFApp.exe" Name="WixDemoWPFApp.exe" Source="$(var.WixDemoWPFApp_TargetDir)WixDemoWPFApp.exe" />
</Component>
<Component Id="WixDemoWPFApp.exe.config" Guid="ed8a9503-2eb1-4f49-b7f3-f027f542c93f">
<File Id="WixDemoWPFApp.exe.config" Name="WixDemoWPFApp.exe.config"
Source="$(var.WixDemoWPFApp_TargetDir)WixDemoWPFApp.exe.config" />
</Component>
<Component Id="WixDemoWPFApp.pdb" Guid="5bf6cd62-7bc7-42cd-839a-7b66d7e8a09a">
<File Id="WixDemoWPFApp.pdb" Name="WixDemoWPFApp.pdb" Source="$(var.WixDemoWPFApp_TargetDir)WixDemoWPFApp.pdb" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
我通过执行以下命令安装,
msiexec INSTALLLOCATION="D:\Wixtestinstance" /i WixSetupWPFApp.msi MSINEWINSTANCE=1 TRANSFORMS=":I01"
- 如何通过命令动态生成实例而不用
在 InstanceTransform 中初始化。
- 如果以上不可行能否动态传递ProductName
通过命令而不对其进行硬编码。
必须提前创建实例转换。虽然技术上没有什么可以阻止 bootstrap 在安装时调用 MSI 之前动态生成转换,但多个实际问题确实阻止了这一点。
- instance transform 必须声明一个 InstanceId 并更改 ProductCode。如果您不提前生成这些,您将无法静态地知道它们是什么,因此以后几乎不可能通过标准机制查询它们。
- 组件规则仍然适用,并且涉及实例转换使得其含义更难思考。即时执行此操作可防止为每个实例创建单独的组件,除非在转换中可能是动态的。
- ProductName must be changed by a transform。虽然这不会使您遇到与生成新 GUID 相同的识别问题,但不会对动态生成的任何转换进行签名。因此,使用它们将影响 Windows 安装程序显示的 UAC 提示(如果有)。
其中,只有数字签名问题很可能是无法克服的。但是其他顾虑所涵盖的潜在问题,真的很难搞定。
是 - 只需在您的 Wix 源文件中设置 ProductName
即可更改 ARP 产品名称。
我正在为多个实例执行此操作,在这些实例中,我根据 INSTANCENAME
属性 设置 ProductName 值,该值本身是由于 c# 自定义操作而设置的:
<Property Id ="INSTANCEID" Value ="_" Secure ="yes"/>
<Property Id ="INSTANCENAME" Secure ="yes"></Property>
<InstanceTransforms Property ="INSTANCEID">
<Instance Id ="I01" ProductCode ="*" UpgradeCode ="{GUID}" ProductName ="I01"/>
<Instance Id ="I02" ProductCode ="*" UpgradeCode ="{GUID}" ProductName ="IO2"/>
<Instance Id ="I03" ProductCode ="*" UpgradeCode ="{GUID}" ProductName ="IO3"/>
</InstanceTransforms>
<SetProperty Id ="ProductName" Before ="LaunchConditions" Value ="[INSTANCENAME]"></SetProperty>
在自定义操作中:
session["INSTANCENAME"] = "_" + session["INSTANCENAME"];
InstanceTransforms
中的 ProductName ="I01"
将被 SetProperty
调用替换。
是的,卸载对话框中不会显示此名称 - 但也许这样可以吗?对我来说最重要的是在ARP区域有一个像样的实例名称。
我有一个 Wix wxs 文件,我在其中配置了使用实例转换的多个实例。
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?define WixDemoWPFApp_TargetDir=$(var.WixDemoWPFApp.TargetDir)?>
<Product Id="*" Name="WixSetupWPFApp" Language="1033" Version="2.0.0.0" Manufacturer="Licence Owner"
UpgradeCode="ae4af8f5-9287-408a-b7bd-d2fdb89a8da7">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="Downgrade not allowed" />
<MediaTemplate />
<Property Id="INSTANCEID" Value="0" />
<InstanceTransforms Property="INSTANCEID">
<Instance Id="I01" ProductCode="{888F3620-F2AB-4C0B-A276-0A5AE9C0B6CB}" ProductName="WixDemo 3.7.4 Dev" />
<Instance Id="I02" ProductCode="{01D23E62-A369-43E1-914A-FA017B1EE822}" ProductName="WixDemo 3.7.4 Test" />
<Instance Id="I03" ProductCode="{00D804D7-0AD0-412C-805A-4D37FF74FFA3}" ProductName="WixDemo 3.7.5" />
<Instance Id="I04" ProductCode="{6C3E5B4E-BF7D-4E7E-A62A-B7DFB750F581}" ProductName="WixDemo 3.7.6" />
</InstanceTransforms>
<Feature Id="ProductFeature" Title="WixSetupWPFApp" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<SetDirectory Id="WINDOWSVOLUME" Value="[WindowsVolume]" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="WINDOWSVOLUME">
<Directory Id="WixDemo" Name="WixDemo">
<Directory Id="INSTALLLOCATION" Name="WixDemo" />
</Directory>
</Directory>
</Directory>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLLOCATION">
<Component Id="WixDemoWPFApp.exe" Guid="42907ee1-2bb2-4416-8d8f-cebc2bf53f09">
<File Id="WixDemoWPFApp.exe" Name="WixDemoWPFApp.exe" Source="$(var.WixDemoWPFApp_TargetDir)WixDemoWPFApp.exe" />
</Component>
<Component Id="WixDemoWPFApp.exe.config" Guid="ed8a9503-2eb1-4f49-b7f3-f027f542c93f">
<File Id="WixDemoWPFApp.exe.config" Name="WixDemoWPFApp.exe.config"
Source="$(var.WixDemoWPFApp_TargetDir)WixDemoWPFApp.exe.config" />
</Component>
<Component Id="WixDemoWPFApp.pdb" Guid="5bf6cd62-7bc7-42cd-839a-7b66d7e8a09a">
<File Id="WixDemoWPFApp.pdb" Name="WixDemoWPFApp.pdb" Source="$(var.WixDemoWPFApp_TargetDir)WixDemoWPFApp.pdb" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
我通过执行以下命令安装,
msiexec INSTALLLOCATION="D:\Wixtestinstance" /i WixSetupWPFApp.msi MSINEWINSTANCE=1 TRANSFORMS=":I01"
- 如何通过命令动态生成实例而不用 在 InstanceTransform 中初始化。
- 如果以上不可行能否动态传递ProductName 通过命令而不对其进行硬编码。
必须提前创建实例转换。虽然技术上没有什么可以阻止 bootstrap 在安装时调用 MSI 之前动态生成转换,但多个实际问题确实阻止了这一点。
- instance transform 必须声明一个 InstanceId 并更改 ProductCode。如果您不提前生成这些,您将无法静态地知道它们是什么,因此以后几乎不可能通过标准机制查询它们。
- 组件规则仍然适用,并且涉及实例转换使得其含义更难思考。即时执行此操作可防止为每个实例创建单独的组件,除非在转换中可能是动态的。
- ProductName must be changed by a transform。虽然这不会使您遇到与生成新 GUID 相同的识别问题,但不会对动态生成的任何转换进行签名。因此,使用它们将影响 Windows 安装程序显示的 UAC 提示(如果有)。
其中,只有数字签名问题很可能是无法克服的。但是其他顾虑所涵盖的潜在问题,真的很难搞定。
是 - 只需在您的 Wix 源文件中设置 ProductName
即可更改 ARP 产品名称。
我正在为多个实例执行此操作,在这些实例中,我根据 INSTANCENAME
属性 设置 ProductName 值,该值本身是由于 c# 自定义操作而设置的:
<Property Id ="INSTANCEID" Value ="_" Secure ="yes"/>
<Property Id ="INSTANCENAME" Secure ="yes"></Property>
<InstanceTransforms Property ="INSTANCEID">
<Instance Id ="I01" ProductCode ="*" UpgradeCode ="{GUID}" ProductName ="I01"/>
<Instance Id ="I02" ProductCode ="*" UpgradeCode ="{GUID}" ProductName ="IO2"/>
<Instance Id ="I03" ProductCode ="*" UpgradeCode ="{GUID}" ProductName ="IO3"/>
</InstanceTransforms>
<SetProperty Id ="ProductName" Before ="LaunchConditions" Value ="[INSTANCENAME]"></SetProperty>
在自定义操作中:
session["INSTANCENAME"] = "_" + session["INSTANCENAME"];
InstanceTransforms
中的 ProductName ="I01"
将被 SetProperty
调用替换。
是的,卸载对话框中不会显示此名称 - 但也许这样可以吗?对我来说最重要的是在ARP区域有一个像样的实例名称。