Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Directory 不带任何目录的WiX安装_Directory_Wix - Fatal编程技术网

Directory 不带任何目录的WiX安装

Directory 不带任何目录的WiX安装,directory,wix,Directory,Wix,WIX3.5。我的安装项目只执行以下操作: 创建具有值的注册表项 安装两个证书 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"&

WIX3.5。我的安装项目只执行以下操作:

  • 创建具有值的注册表项
  • 安装两个证书
  • 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文件夹中创建任何目录,但是如果我编译项目时没有目录元素(在我的例子中,组件元素紧跟在二进制元素之后),它将失败,并出现以下错误:

    “未找到组件/@目录属性;它是必需的。”

    更新

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


    如果将组件元素直接放在产品下,则必须在组件元素上设置自己的目录属性,因为它是必需的

    从文档:

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


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

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

    每个Windows Installer软件包必须包含一个
    目录
    表。发件人:

    目录表必须指定一个具有 目录列值等于TARGETDIR属性

    相应的WiX元素是:

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

    所以,它一定是在你的WiX创作。如果您不打算在安装中包含任何目录/文件,您可以将组件放在这个根
    目录
    元素下。

    那么,这个目录元素是什么意思呢?实际上,我的安装中不需要目录。WiX不能创建没有目录的组件,这只是某种传统或WiX的特殊内部逻辑的问题吗?WiX只是Windows Installer上的声明性包装,它必须遵守Windows Installer api规定的规则。
    <Directory Id="TARGETDIR" Name="SourceDir">
      ...
    </Directory>