i具有使用WIX文件关联的File Type XYZ(可执行product.exe)的版本1.0.0和v2.0.0的产品。当产品安装v1.0.0时,则关联文件扩展名xyz。接下来,我安装了产品v2.0.0,现在文件xyz与产品a v2.0.0关联。如果首先安装了2.0.0,则文件关联被覆盖为预期,反之亦然。
。如果我卸载了v2.0.0,则删除了2.0.0的文件关联,并且v1.0.0的关联未恢复,并且vice-vices-vice-vice-vices。
如何使用Wix自动恢复以上版本的文件关联?请在下面查看我的Wix代码,并建议任何可能的更正。
产品A V1.0.0 Wix 3.8代码:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="PUT-GUID-HERE" Name="Product A 1.0" Language="1033" Version="1.0.0.0" Manufacturer="Microsoft" UpgradeCode="PUT-GUID-HERE">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
<Feature Id="ProductFeature" Title="Product A 1.0" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="Product A 1.0" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
<Component Id="ProductComponent" Guid="PUT-GUID-HERE">
<File Id="openBox" Source="D:open-box.ico" />
<File Id="wpfFile" Source="D:product.exe" />
<ProgId Advertise="no" Description="My WPF File" Icon="openBox" Id="xyzFileAssociation_1_0">
<Extension Id="xyz" ContentType="application/xyz">
<Verb Id="open" Command="open with my app" Argument=""%1" "1.0.0"" TargetFile="wpfFile"/>
</Extension>
</ProgId>
</Component>
</ComponentGroup>
</Fragment>
</Wix>
产品A v2.0.0 Wix 3.8代码:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="PUT-GUID-HERE" Name="Product A 2.0" Language="1033" Version="2.0.0.0" Manufacturer="Microsoft" UpgradeCode="PUT-GUID-HERE">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
<Feature Id="ProductFeature" Title="Product A 2.0" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="Product A 2.0" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
<Component Id="ProductComponent" Guid="PUT-GUID-HERE">
<File Id="openBox" Source="D:open-box.ico" />
<File Id="wpfFile" Source="D:product.exe" />
<ProgId Advertise="no" Description="My WPF File" Icon="openBox" Id="xyzFileAssociation_2_0">
<Extension Id="xyz" ContentType="application/xyz">
<Verb Id="open" Command="open with my app" Argument=""%1" "2.0.0"" TargetFile="wpfFile"/>
</Extension>
</ProgId>
</Component>
</ComponentGroup>
</Fragment>
</Wix>
唯一的区别是Progid的ID W.R.T文件关联。
更改文件协会以包含版本编号作为其标题的一部分:xyz1,xyz2等...仅当您希望可以安装产品时才这样做并排。这避免了您的产品之间的干扰。替代方案是通过在卸载上运行的自定义操作注册您的文件协会,该操作将寻找其他安装。如果您问我,很容易笨拙和错误。我的世界中的经验法则:始终选择依靠应用程序和设置设计中的微小变化,以避免具有增加风险的自定义解决方案。如果您可以可靠地避免阅读/编写自定义操作,这始终是可靠性和简单性的正确呼吁。
我更喜欢避免并排安装,因为很少有两个版本的软件可以积极维护。例外可能是向公众发布的主要版本 - 换句话说,版本1、2、3等...我不会与每个构建的新关联搞乱。
如果要并排安装,则必须更改并排安装的组件的所有组件GUID,并使用适当的合并模块或WIX包含的共享文件包含未与之一起安装的共享文件侧面(通常是COM服务器之类的,只能安装一次每机器)。这是为了使参考计数正确工作。也许这个答案值得快速阅读:在Wix中更改我的组件GUID。或者更好的是,依靠链接的帖子中所述的自动生成的GUID。
也许也可以看一下:
- MSI参考计数:两个产品安装相同的MSIS
- 如何将WXI文件包括在WXS中?