3

维克斯 3.5。我的安装项目除了:

  1. 创建具有值的注册表项;
  2. 安装两个证书。

可以在没有任何“目录”元素的情况下构建 WiX 项目吗?

这是我的 WiX 项目中的 XML 代码:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension">
  <Product
        Id="GUID"
        Name="SetupProject1" Language="1033" Version="1.0.0.0"
        Manufacturer="SetupProject1" UpgradeCode="GUID">
    <Package InstallerVersion="200" Compressed="yes" Languages="1033" SummaryCodepage="1252" />

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

    <Binary Id="testRootCABinaryStream"
            SourceFile="D:\testRootCA.cer" />
    <Binary Id="testSigningBinaryStream"
            SourceFile="D:\testSigning.cer" />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLLOCATION" Name="SetupProject1">
          <Component Id="RegistrySetting" Guid="GUID">
            <iis:Certificate Id="testRootCA"
                             BinaryKey="testRootCABinaryStream"
                             Name="Test Root CA Certificate"
                             Overwrite="yes"
                             Request="no"
                             StoreLocation="localMachine"
                             StoreName="root"/>
            <iis:Certificate Id="testSigning"
                             BinaryKey="testSigningBinaryStream"
                             Name="Test Signing Certificate"
                             Overwrite="yes"
                             Request="no"
                             StoreLocation="localMachine"
                             StoreName="trustedPublisher"/>
            <RegistryValue Root="HKLM" Key="Software\Microsoft\Silverlight"
                           Name="AllowElevatedTrustAppsInBrowser"
                           Type="integer" Value="00000001" KeyPath="yes" />
          </Component>
        </Directory>
      </Directory>
    </Directory>

    <Feature Id="Complete" Title="SetupProject1" Level="1">
      <ComponentRef Id="RegistrySetting" />
      <ComponentGroupRef Id="Product.Generated" />
    </Feature>
  </Product>
</Wix>

实际上,这段代码不会在 Program Files 文件夹中创建任何目录,但是如果我在没有 Directory 元素的情况下编译我的项目(在我的例子中,Component 元素紧跟在 Binary 元素之后)它会失败并出现以下错误:

“未找到 Component/@Directory 属性;它是必需的。”

更新

感谢严的详细解答。现在我在目录部分的代码片段看起来像(现在更正确了):

<Directory Id="TARGETDIR" Name="SourceDir" />

<DirectoryRef Id="TARGETDIR">
  <Component  Id="CompleteInstallation" Guid="Guid">
    <iis:Certificate Id="testRootCA"
                     BinaryKey="testRootCABinaryStream"
                     Name="Test Root CA Certificate"
                     Overwrite="yes"
                     Request="no"
                     StoreLocation="localMachine"
                     StoreName="root"/>
    <iis:Certificate Id="testSigning"
                     BinaryKey="testSigningBinaryStream"
                     Name="Test Signing Certificate"
                     Overwrite="yes"
                     Request="no"
                     StoreLocation="localMachine"
                     StoreName="trustedPublisher"/>
    <RemoveFolder Id="ProgramMenuDir" On="uninstall"/>
    <RegistryKey Root="HKLM" Key="Software\Microsoft\Silverlight">
      <RegistryValue Name="AllowElevatedTrustAppsInBrowser"
                     Type="integer" Value="00000001" KeyPath="yes" />
    </RegistryKey>
  </Component>
</DirectoryRef>
4

2 回答 2

11

此行为的根源可归结为 Windows Installer 体系结构。如您所知,WiX 是一套创建 Windows Installer 包的工具,也就是说,它必须在一定程度上反映这项技术的关键概念,将最奇怪和最荒谬的东西隐藏在语法糖后面。它在这项工作上做得非常好,从一个版本到另一个版本都在改进!

每个 Windows 安装程序包都必须包含一个Directory表。来自MSDN

Directory 表必须指定一个根目录,其 Directory 列值等于 TARGETDIR 属性。

对应的 WiX 元素是:

<Directory Id="TARGETDIR" Name="SourceDir">
  ...
</Directory>

因此,它必须在您的 WiX 创作中。如果您不打算在安装中包含任何目录/文件,则可以将组件放在此根Directory元素的正下方。

于 2012-08-23T06:58:29.833 回答
2

如果您将其直接放在 Product 下,则必须在 Component 元素上设置您自己的 Directory 属性,因为它是必需的。

从文档:

设置组件的目录。如果此元素嵌套在 Directory 元素下,则此值默认为父 Directory/@Id 的值。

事实证明,在 Windows Installer 参考中指出,组件需要有一个 directory_ 属性,该属性指向目录表中的记录,或者通过从AppSearch获得的值。如果 AppSearch 为空,我不确定这将如何解决。

于 2012-08-22T12:20:42.250 回答