2

「Bundle.wxs」には、「InstallConditions」を含む「MsiPackages」の「チェーン」があります。ユーザーがインストール/アップグレードするパッケージを決定するために、それらにあるプロパティを表示したいと思います。

たとえば、チェーン内のすべての MSI の「Property」テーブルでプロパティ「ProductName」と「ProductVersion」を読み取り、チェーン内のすべての MSI のチェックボックスの横にあるユーザーに表示したいと考えています。チェックボックスは、「InstallConditions」で使用される書き込み変数に接続されています。

しかし問題は、「適用」ステップの前に MSI ファイルにアクセスできないように見えることです。これらは、この手順の前に Bootstrapper Application EXE から抽出されません。したがって、私の質問は、これらの値をプログラムでロードして、適用ステップの前にユーザーに表示する方法はありますか? 変数を使用して自分で値を入力することもできますが、この情報は既に MSI にあるため、効率が悪いようです。

これを行う方法はありますか?助けてくれてありがとう。

<Bundle>

    <Variable Name="InstallProduct1" Type="string" Value="true" />
    <Variable Name="ProductName1" Type="string" Value="My Product 1"/> <!-- Better way? -->
    <Variable Name="ProductVersion1" Type="version" Value="1.2.3.4"/> <!-- Better way? -->

    <Chain>
              <MsiPackage SourceFile="my_product_1.msi"
                          InstallCondition="InstallProduct1">
              </MsiPackage>
    </Chain>

</Bundle>
4

1 に答える 1

4

WiX は BootstrapperApplicationData.xml ファイルを生成します。このファイルには、exe のビルドに使用される多くの情報が含まれており、実行時に利用可能なファイルに含まれています。そのメタデータにアクセスするために、実行時にそのファイルを解析できます。ファイルはすべてのアセンブリと .msi ファイルと共にランダムな名前の一時フォルダーに配置されるため、ファイルがどこに保存されるかを事前に知ることはできないため、アセンブリのパスを使用してファイルを見つける必要があります。その後、XML を解析してメタデータを取得できます。

ここに追加の詳細を記載したブログ投稿があります: https://www.wrightfully.com/part-3-of-writing-your-own-net-based-installer-with-wix-context-data/

私の場合、「」の代わりにタグを使用しているため、利用可能な情報の一部があなたのためにそこにない可能性があるため、経験が異なる場合があります. その場しのぎのインストーラーをデバッグ モードで実行し、ブレークポイントを設定して XML の内容を検査し、使用可能なものの完全なリストを取得することをお勧めします。

ManagedBootstrapperApplication (c#) でファイルからデータを取得する方法の例を次に示します。注: この例では、私のドメイン オブジェクトは MBAPrereqPackage、BundlePackage、および PackageFeature であり、それぞれがコンストラクターで XML ノード オブジェクトを取得し、さらにデータをオブジェクトのプロパティに解析します。

const  XNamespace ManifestNamespace = ( XNamespace) “http://schemas.microsoft.com/wix/2010/BootstrapperApplicationData” ;

public void Initialize()
{

    //
    // parse the ApplicationData to find included packages and features
    //
    var bundleManifestData = this.ApplicationData;
    var bundleDisplayName = bundleManifestData 
                              .Element(ManifestNamespace + “WixBundleProperties“ )
                              .Attribute( “DisplayName“)
                              .Value;

    var mbaPrereqs = bundleManifestData.Descendants(ManifestNamespace + “WixMbaPrereqInformation“)
                                       .Select(x => new MBAPrereqPackage(x))
                                       .ToList();

    //
    //exclude the MBA prereq packages, such as the .Net 4 installer
    //
    var pkgs = bundleManifestData.Descendants(ManifestNamespace + “WixPackageProperties“)
                                 .Select(x => new BundlePackage(x))
                                 .Where(pkg => !mbaPrereqs.Any(preReq => preReq.PackageId == pkg.Id));

    //
    // Add the packages to a collection of BundlePackages
    //
    BundlePackages.AddRange(pkgs);

    //
    // check for features and associate them with their parent packages
    //
    var featureNodes = bundleManifestData.Descendants(ManifestNamespace + “WixPackageFeatureInfo“);
    foreach ( var featureNode in featureNodes)
    {
       var feature = new PackageFeature(featureNode);
       var parentPkg = BundlePackages.First(pkg => pkg.Id == feature.PackageId);
       parentPkg.AllFeatures.Add(feature);
       feature.Package = parentPkg;
    }
}

/// 
/// Fetch BootstrapperApplicationData.xml and parse into XDocument.
/// 
public XElement ApplicationData
{
    get
    {
        var workingFolder = Path.GetDirectoryName(this.GetType().Assembly.Location);
        var bootstrapperDataFilePath = Path.Combine(workingFolder, “BootstrapperApplicationData.xml”);

        using (var reader = new StreamReader(bootstrapperDataFilePath))
        {
            var xml = reader.ReadToEnd();
            var xDoc = XDocument.Parse(xml);
            return xDoc.Element(ManifestNamespace + “BootstrapperApplicationData“);                   
        }
    }
}
于 2013-11-07T12:58:01.403 に答える