3

WiX3.5。私のインストールプロジェクトは、次のこと以外は何もしません。

  1. 値を持つレジストリキーを作成します。
  2. 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属性が見つかりませんでした。必須です。」

アップデート

詳細な回答をくれた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>
4

2 に答える 2

11

この動作のルーツは、Windows インストーラ アーキテクチャにまでさかのぼります。ご存知のように、WiX は Windows インストーラー パッケージを作成するための一連のツールです。つまり、このテクノロジの主要な概念をある程度反映する必要があり、最も奇妙でばかげたものを構文糖衣の背後に隠します。そして、バージョンごとに改善されており、この仕事を驚くほどうまく行っています!

各 Windows インストーラー パッケージにはDirectoryテーブルが含まれている必要があります。MSDNから:

Directory テーブルでは、Directory 列の値が TARGETDIR プロパティと等しい単一のルート ディレクトリを指定する必要があります。

対応する WiX 要素は次のとおりです。

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

そのため、WiX オーサリングに含まれている必要があります。インストールにディレクトリ/ファイルを含める予定がない場合は、このルートDirectory要素のすぐ下にコンポーネントを配置できます。

于 2012-08-23T06:58:29.833 に答える
2

Component 要素に Directory 属性 your self を設定する必要があるため、Product の直下に配置する必要があります。

ドキュメントから:

コンポーネントのディレクトリを設定します。この要素が Directory 要素の下にネストされている場合、この値はデフォルトで親の Directory/@Id の値になります。

結局のところ、Windows インストーラーのリファレンスでは、コンポーネントには、ディレクトリ テーブル内のレコードを指す directory_ 属性、またはAppSearchから取得した値を指定する必要があると記載されています。AppSearch が空の場合、これがどのように機能するかはわかりません。

于 2012-08-22T12:20:42.250 に答える