0

当我在 VS2010 中尝试在我的 WiX 安装程序项目中使用合并模块时收到来自 light.exe 的以下警告,我感到非常沮丧:

ICE80: This 64BitComponent F_AdaptersInGac.5AE08CC6_EB8E_4F10_AB7B_CEFD0CB0F832 
       uses 32BitDirectory GAC.5AE08CC6_EB8E_4F10_AB7B_CEFD0CB0F832

(对合并模块中的每个文件重复)。

合并模块和产品 WiX 文件都是同一个 VS2010 解决方案的一部分。合并模块和产品都包含一个<Package>指定 Platform="x64" 的元素。合并模块 .wxs 文件中的片段如下所示:

<Package Id="{5AE08CC6-EB8E-4F10-AB7B-CEFD0CB0F832}" InstallerVersion="200" Languages="1033" Manufacturer="Yoyodyne Propulsion Systems" Platform="x64" />
<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFiles64Folder">

    <!-- Assemblies that go in the GAC -->
    <Directory Id="GAC" SourceName="GAC">
       <Component Id="C_AdaptersInGac" Guid="{C1C7D6F8-197D-874E-79B9-EBFEBDDCB65A}" Win64="yes">
         <File Id="F_AdaptersInGac" Name="ERPLink.Adapters.SharePoint.dll" KeyPath="yes" Assembly=".net" Source="..\Internal\Adapters\Release\Contoso.Adapters.dll" />
      </Component>
    </Directory>
  </Directory>
</Directory>

由于我什至将组件元素放在ProgramFiles64Folder目录中,并且我已将平台标记为“x64”,为什么会出现此错误?还有哪些其他地方可以控制 WiX 包文件中目录的 64 位?

4

1 回答 1

0

合并模块应该有一个抽象,例如 MergeRedirectFolder,这样当您在安装程序中使用它们时,您可以使用 Directory 和 Merge 元素将 MergeRedirectFolder 与实际的 [ProgramFiles]Company\Product 目标相关联。

此外,如果这些文件打算进入 GAC,则有一个名为 GlobalAssemblyCache 的特殊文件夹标识符可以实现此目的。

以下内容对我有用:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <?define ComponentRules="OneToOne"?>
  <!-- SourceDir instructs IsWiX the location of the directory that contains files for this merge module -->
  <?define SourceDir="..\Deploy"?>
  <Module Id="StrongNameMM" Language="1033" Version="1.0.0.0">
    <Package Id="0085d1f6-e7cf-413e-ae3c-cd1a1e0afb1b" Manufacturer="StrongNameMM" InstallerVersion="200" Platform="x64" />
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="MergeRedirectFolder">
        <Component Id="owc457F6083DF7B557CCA84E132209AC321" Guid="9ab7d95e-7841-3ff9-ffac-87a6b7633636" Win64="yes">
          <File Id="owf457F6083DF7B557CCA84E132209AC321" Source="$(var.SourceDir)\ClassLibrary1.dll" KeyPath="yes" Assembly=".net"/>
        </Component>
      </Directory>
    </Directory>
  </Module>
</Wix>

然后在主安装程序中:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Fragment> 

    <FeatureGroup Id="features">
      <Feature Id="StrongName" Title="StrongName" Description="Installs all the files needed for StrongName" Level="1" AllowAdvertise="no" ConfigurableDirectory="INSTALLLOCATION">
        <MergeRef Id="StrongNameMM"/>
      </Feature>
    </FeatureGroup>

    <!-- Content -->
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFiles64Folder">
        <Directory Id="CompanyFolder" Name="My Company">
          <Directory Id="INSTALLLOCATION" Name="StrongName">
            <Merge Id="StrongNameMM" SourceFile="$(var.StrongNameMM.TargetPath)" DiskId="1" Language="1033"/>
          </Directory>
        </Directory>
      </Directory>
    </Directory>

  </Fragment>
</Wix>

最后:

 <Package InstallerVersion="301" Compressed="yes" InstallScope="perMachine" Platform="x64" />
于 2013-06-25T12:35:00.513 回答