1

我有版本 1.0.0 和 V2.0.0 的产品 A,每个版本都使用 WiX 文件关联与文件类型 xyz(到可执行 product.exe)相关联。安装产品 A V1.0.0 时,会关联文件扩展名 xyz。接下来,我安装 Product A V2.0.0,现在文件 xyz 与 Product A V2.0.0 相关联。如果首先安装 2.0.0 和更高版本的 V1.0.0,文件关联将按预期覆盖,反之亦然。

如果我卸载 V2.0.0,则删除 2.0.0 的文件关联,并且不会恢复 V1.0.0 的关联,反之亦然。

如何使用 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="&quot;%1&quot; &quot;1.0.0&quot;" 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="&quot;%1&quot; &quot;2.0.0&quot;" TargetFile="wpfFile"/>
                 </Extension>
               </ProgId>
             </Component> 
        </ComponentGroup>
    </Fragment>
</Wix>

唯一的区别在于 ProgId 的 Id wrt 文件关联。

4

1 回答 1

0

更改文件关联以在其标题中包含版本号:xyz1、xyz2 等...仅当您希望产品可以并排安装时才执行此操作。这避免了您的产品之间的干扰。另一种方法是通过在卸载时运行的自定义操作来注册您的文件关联,该操作将查找您的其他安装。如果你问我,非常笨重且容易出错。我的世界中的经验法则:总是选择依赖应用程序和设置设计中的微小变化来避免增加风险的定制解决方案。如果您可以可靠地避免读/写自定义操作,那么这始终是对可靠性和简单性的正确要求。

我更喜欢避免并行安装,因为很少会主动维护一个软件的两个版本。例外可能是向公众发布的主要版本 - 换句话说,版本 1、2、3 等......我不会把每个构建的新关联都搞砸这样说。

如果要并行安装,则必须更改并行安装的组件的所有组件 guid,并为未并行安装的共享文件使用适当的合并模块或 wix 包含(通常COM 服务器等每台机器只能安装一次)。这是为了让引用计数正常工作。也许这个答案值得快速阅读:Change my component GUID in wix? . 或者更好的是,依靠链接帖子中描述的自动生成的 guid。

也许也看看这个:

于 2015-05-02T17:54:09.667 回答