没有任何目录的WiX安装

use*_*128 3 directory wix

WiX 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>
Run Code Online (Sandbox Code Playgroud)

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

"找不到Component/@ Directory属性;它是必需的."

UPDATE

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

<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>
Run Code Online (Sandbox Code Playgroud)

Yan*_*nko 9

此行为的根源归结为Windows Installer体系结构.如您所知,WiX是一组用于创建Windows Installer程序包的工具,也就是说,它必须在某种程度上反映这项技术的关键概念,隐藏语法糖背后最奇怪和最荒谬的东西.而且它的工作非常出色,从版本到版本都得到了改进!

每个Windows Installer程序包都必须包含一个Directory表.来自MSDN:

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

相应的WiX元素是:

<Directory Id="TARGETDIR" Name="SourceDir">
  ...
</Directory>
Run Code Online (Sandbox Code Playgroud)

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