从 PackageID 获取显示名称

2023-11-22

查看 Wix Standard Bootstrapper 应用程序的源代码,似乎每个包都有一个显示名称财产:

pPackage->sczDisplayName

但是,WiX 安装项目中使用的 BootstrapperCore dll 没有此属性。有什么方法可以从托管代码的捆绑包中提取此属性吗?


我移植了Bal将代码转换为 C#,尝试使其与 C++ 代码完全相同:

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Xml;
using System.Xml.XPath;

public class BootstrapperApplicationData
{
    public const string defaultFileName = "BootstrapperApplicationData.xml";
    public const string xmlNamespace = 
        "http://schemas.microsoft.com/wix/2010/BootstrapperApplicationData";

    private static DirectoryInfo defaultFolder;
    public static DirectoryInfo DefaultFolder
    {
        get
        {
            if (defaultFolder == null)
            {
                defaultFolder = (new FileInfo(Assembly.GetExecutingAssembly().Location)).Directory;
            }
            return defaultFolder;
        }
    }

    private static FileInfo defaultFile;
    public static FileInfo DefaultFile
    {
        get
        {
            if (defaultFile == null)
            {
                defaultFile = new FileInfo(Path.Combine(DefaultFolder.FullName, defaultFileName));
            }
            return defaultFile;
        }
    }

    public FileInfo DataFile { get; protected set; }
    public Bundle Data { get; protected set; }

    public BootstrapperApplicationData() : this(DefaultFile) { }

    public BootstrapperApplicationData(FileInfo fiBootstrapperApplicationData)
    {
        DataFile = fiBootstrapperApplicationData;
        using (FileStream fs = DataFile.OpenRead())
        {
            Data = ParseBundleFromStream(fs);
        }
    }

    public static Bundle ParseBundleFromStream(Stream stream)
    {
        XPathDocument manifest = new XPathDocument(stream);
        XPathNavigator root = manifest.CreateNavigator();
        return ParseBundleFromXml(root);
    }

    public static Bundle ParseBundleFromXml(XPathNavigator root)
    {
        Bundle bundle = new Bundle();

        XmlNamespaceManager namespaceManager = new XmlNamespaceManager(root.NameTable);
        namespaceManager.AddNamespace("p", xmlNamespace);
        XPathNavigator bundleNode = root.SelectSingleNode("/p:BootstrapperApplicationData/p:WixBundleProperties", namespaceManager);

        if (bundleNode == null)
        {
            throw new Exception("Failed to select bundle information");
        }

        bool? perMachine = GetYesNoAttribute(bundleNode, "PerMachine");
        if (perMachine.HasValue)
        {
            bundle.PerMachine = perMachine.Value;
        }

        string name = GetAttribute(bundleNode, "DisplayName");
        if (name != null)
        {
            bundle.Name = name;
        }

        string logVariable = GetAttribute(bundleNode, "LogPathVariable");
        if (logVariable != null)
        {
            bundle.LogVariable = logVariable;
        }
        else
        {
            //wix would actually debug "Failed to select bundle information" and return with E_NOTFOUND, but I think it's a (harmless) bug
        }

        Package[] packages = ParsePackagesFromXml(root);
        bundle.Packages = packages;

        return bundle;
    }

    public static Package[] ParsePackagesFromXml(XPathNavigator root)
    {
        List<Package> packages = new List<Package>();

        XmlNamespaceManager namespaceManager = new XmlNamespaceManager(root.NameTable);
        namespaceManager.AddNamespace("p", xmlNamespace);
        XPathNodeIterator nodes = root.Select("/p:BootstrapperApplicationData/p:WixPackageProperties", namespaceManager);

        foreach (XPathNavigator node in nodes)
        {
            Package package = new Package();

            string id = GetAttribute(node, "Package");
            if (id == null)
            {
                throw new Exception("Failed to get package identifier for package");
            }
            package.Id = id;

            string displayName = GetAttribute(node, "DisplayName");
            if (displayName != null)
            {
                package.DisplayName = displayName;
            }

            string description = GetAttribute(node, "Description");
            if (description != null)
            {
                package.Description = description;
            }

            PackageType? packageType = GetPackageTypeAttribute(node, "PackageType");
            if (!packageType.HasValue)
            {
                throw new Exception("Failed to get package type for package");
            }
            package.Type = packageType.Value;

            bool? permanent = GetYesNoAttribute(node, "Permanent");
            if (!permanent.HasValue)
            {
                throw new Exception("Failed to get permanent settings for package");
            }
            package.Permanent = permanent.Value;

            bool? vital = GetYesNoAttribute(node, "Vital");
            if (!vital.HasValue)
            {
                throw new Exception("Failed to get vital setting for package");
            }
            package.Vital = vital.Value;

            bool? displayInternalUI = GetYesNoAttribute(node, "DisplayInternalUI");
            if (!displayInternalUI.HasValue)
            {
                throw new Exception("Failed to get DisplayInternalUI setting for package");
            }
            package.DisplayInternalUI = displayInternalUI.Value;

            string productCode = GetAttribute(node, "ProductCode");
            if (productCode != null)
            {
                package.ProductCode = productCode;
            }

            string upgradeCode = GetAttribute(node, "UpgradeCode");
            if (upgradeCode != null)
            {
                package.UpgradeCode = upgradeCode;
            }

            string version = GetAttribute(node, "Version");
            if (version != null)
            {
                package.Version = version;
            }

            packages.Add(package);
        }

        return packages.ToArray();
    }

    public static string GetAttribute(XPathNavigator node, string attributeName)
    {
        XPathNavigator attribute = node.SelectSingleNode("@" + attributeName);

        if (attribute == null)
        {
            return null;
        }

        return attribute.Value;
    }

    public static bool? GetYesNoAttribute(XPathNavigator node, string attributeName)
    {
        string attributeValue = GetAttribute(node, attributeName);

        if (attributeValue == null)
        {
            return null;
        }

        return attributeValue.Equals("yes", StringComparison.InvariantCulture);
    }

    public static PackageType? GetPackageTypeAttribute(XPathNavigator node, string attributeName)
    {
        string attributeValue = GetAttribute(node, attributeName);

        if (attributeValue == null)
        {
            return null;
        }

        if (attributeValue.Equals("Exe", StringComparison.InvariantCulture))
        {
            return PackageType.EXE;
        }
        else if (attributeValue.Equals("Msi", StringComparison.InvariantCulture))
        {
            return PackageType.MSI;
        }
        else if (attributeValue.Equals("Msp", StringComparison.InvariantCulture))
        {
            return PackageType.MSP;
        }
        else if (attributeValue.Equals("Msu", StringComparison.InvariantCulture))
        {
            return PackageType.MSU;
        }
        else
        {
            return 0;
        }
    }

    public enum PackageType
    {
        EXE,
        MSI,
        MSP,
        MSU,
    }

    public class Package
    {
        public string Id;
        public string DisplayName;
        public string Description;
        public PackageType Type;
        public bool Permanent;
        public bool Vital;
        public bool DisplayInternalUI;

        //not available until WiX 3.9.421.0
        public string ProductCode;
        public string UpgradeCode;
        public string Version;
    }

    public class Bundle
    {
        public bool PerMachine;
        public string Name;
        public string LogVariable;
        public Package[] Packages;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 PackageID 获取显示名称 的相关文章

  • 为什么卸载时我的服务没有被删除? (维克斯)

    即使重新启动后 即使可执行文件消失 服务仍然存在 我使用的是 WIX 版本 3 0 5419 0
  • 如何使用 WiX 安装和启动 Windows 服务

    我尝试在 Wix 中使用下面的代码 但是在安装时 安装程 序在 正在启动服务 状态下冻结了大约 3 分钟 然后我收到此消息 Service Jobservice 无法启动 请验证您是否有足够的权限来启动系统服务 我的代码有什么错误吗 并且可
  • 在wix中,使用vbscript,如何写入日志文件?

    我正在自定义操作中尝试以下操作 Session Log GetOfficeBitness Session Property OfficeBitness 我收到错误 错误 1720 此 Windows Installer 程序包有问题 A 无
  • 如何在 Wix 自定义对话框的文本框中输入值?

    我有一个带有类型编辑控件的 Wix 对话框 这是服务所依赖的服务器的 uri 如何在输入值之前禁用 下一步 按钮 以下是我们曾经使用的一些 旧 生产代码的摘录
  • 当自动为 WIX 安装程序收集文件时,我的目录结构有多灵活?

    请原谅我的无知 我一直在阅读一些书 但还没有准备好尝试任何东西 目前 我们有一个 wxs 文件 该文件无法轻松维护 每当从 SVN 提交 删除新文件时 都会手动添加 删除所有文件 由于在创建新文件和更新 wxs 安装文件之间发生了失误 我们
  • 如何使用自定义操作在 WiX 中运行脚本 - 最简单的示例?

    WiX新手问题 我该怎么办1 将一次性 shell 脚本与安装程序一起复制到 temp e g
  • WIX MSI 软件包卸载

    我正在使用 WIX 作为安装程序包 当我通过双击原始 msi 包卸载该包时 一切都很好 当我从控制面板卸载时 它会给我一个最小的用户界面卸载 我已在 MSI 中写入一个自定义操作 询问用户是否要卸载某些数据库等 最小 UI 卸载时不会发生这
  • 用于配置编辑的 wix 自定义对话框

    你好 我正在尝试使用 wix v3 为我的应用程序设置 msi 我对这项任务有疑问 我需要一个用户输入 该输入将存储在我的应用程序的配置文件中 例如 我需要一个用于 sql 连接字符串的对话框 并且用户输入将写入应用程序配置文件中 我尝试用
  • Burn in WiX 3.6 如何将 MSI 文件捆绑到 .exe 中?

    我有兴趣了解 WiX 如何捆绑使用 Burn 创建的 EXE 文件 我知道创建一个自解压 EXE 文件非常简单 我已经完成了一百万次了WinRAR http en wikipedia org wiki WinRAR EXE 文件解压到哪个目
  • 将构建参数传递给 .wxs 文件以动态构建 wix 安装程序

    我是一名学生开发人员 我已经为我现在工作的公司构建了几个安装程序 所以我对WIX还是比较熟悉的 我们最近决定拥有一个构建服务器来自动构建我们的解决方案 它构建调试和发布以及混淆 和非混淆 项目 你真的不需要理解这些 您需要了解的是 我有相同
  • WiX:数字签名 BootStrapper 项目

    我有一个项目 我为其构建了 WiX msi 文件 我还有一个 WiX 引导程序 exe 文件 用于检查 C 2005 是否存在 如果未找到则安装它 然后安装 msi 软件包 我的项目包括作为 msm 文件的 Crystal Reports
  • Wix 4 收获目录的解释?

    我正在尝试学习 Wix 4 0 来为我正在开发的应用程序创建安装程序 构建我的应用程序后 我在一个文件夹中有一堆文件 我想将它们安装到程序文件中 我已经读到收获功能允许我简化此过程并为整个目录创建组件映射 但我不确定这是什么example
  • 无法使用wix工具集创建postgresql数据库

    我正在尝试使用 Wix ToolSet 在 PostgreSQL 中创建数据库 但总是收到错误 错误 2147467259 无法创建 SQL 数据库 pontow 错误详细信息 未知错误 当我尝试创建数据库或错误 无法连接到 SQL 数据库
  • WiX Installer:获取正在升级的产品版本

    在从版本 X 到版本 Y 的主要升级过程中 我需要一个属性 变量来表明版本 X 正在升级 当使用 WiX Installer 构建的安装程序对产品进行主要升级时 是否有办法获取正在升级的版本号 假设您使用 WiX Majorupgrade
  • WIX Heat.exe 命令参数 -var 不接受空格?

    我有这个使用所有不变路径的 WIX 命令 并且它不需要系统环境 与此示例不同 http weblogs sqlteam com mladenp archive 2010 02 23 WiX 3 Tutorial Generate filed
  • 安装引导程序如何检测是否安装了先决条件?

    试图解决这个问题 https stackoverflow com questions 2591384 bootstrapper setup exe says net 3 5 not found but launching msi direc
  • 安装后如何执行Wix自定义操作?

    我正在使用 Wix3 将 WCF 服务安装到 IIS 安装完成后如何使用我的自定义操作 c 函数 即我需要打开已安装的 web config 文件并将主机名替换为真实的主机名 有任何想法吗 您可以安排在之后安装完成 http wix sou
  • 在 Azure DevOps 中为 Wix MSI 文件生成 GUID

    我正在为 Web 服务器应用程序和 Sitecore 前端应用程序设置 Wix 安装程序 我的问题并非特定于 Web 服务器或 Sitecore 我的问题是 Wix 以及如何使用它进行持续交付 1 Wix 需要每个文件和产品本身的 GUID
  • 如何在 WiX 中启动 PowerShell 并正确访问 Windows 注册表?

    Update 有趣的是 如果我运行 32 位 powershell 来运行脚本 它会给我同样的错误 看起来32位powershell无法访问64位注册表树 我尝试使用WixQuietExec64但它给出了同样的错误 我还尝试提供 power
  • WIX 捆绑包创建

    我尝试创建一个包含 exe 的 MSI 使用 WIX 中的捆绑选项 这样做时出现错误 有人可以帮我解决这个问题吗 下面是代码

随机推荐

  • 使用 grunt 运行 Angular.js 时如何修复错误“请设置环境变量 CHROME_BIN”

    我正在尝试使用 AngularJS 进行单元测试 我已经安装了 Bower 和 grunt 所以我应该能够进行测试 但是 当我从终端 在我的例子中是 Git Bash 运行 grunt test 时 我收到错误 请设置环境变量 CHROME
  • .NET 垃圾收集器 - 它的线程优先级是什么?

    我发现了一些很棒的文章 Maoni 里克特 1 里氏 2 给出了关于 GC 的理论和实践的许多细节 但我找不到任何说明 GC 的线程优先级是如何设置的 我发现的最接近的是这个 它指出 Finalizer 线程 以高优先级与应用程序异步运行
  • 从 RecyclerView EditText 获取值?

    我对recyclerView感到震惊 这里的名称和余额字段来自两个不同的数组 我需要的是 这里每一行都有一个 EditText 字段 我需要访问每行上的每个 EditText 并从中获取值 并且总计显示在 Total textView 上
  • 在哪里可以找到适用于 32 位 Windows 的 JDK? [关闭]

    Closed 这个问题是无关 目前不接受答案 在我的一生中 我似乎找不到适用于 32 位 Windows 机器的 Java SE JDK 的工作版本 甲骨文把它放在哪里了 谢谢 内森 访问 Oracle 网站 您要查找的是 x86 而不是
  • 可观察的堆栈和队列

    我正在寻找一个INotifyCollectionChanged实施Stack and Queue 我可以自己动手 但我不想重新发明轮子 我遇到了同样的问题 想将我的解决方案分享给其他人 希望这对某人有帮助 public class Obse
  • 自动聚焦于 EditorFor

    我想在我的应用程序中自动聚焦于编辑器 但我似乎无法做到这一点 我已成功在文本框上使用自动对焦 但我想使用编辑器来保持应用程序的外观通用 任何对此问题的解决方案将不胜感激 谢谢 我的尝试 Html EditorFor model gt mod
  • 如何衡量休眠性能?

    如何衡量休眠状态下的性能 我想知道hibernate执行一个查询需要多少时间 JProfiler 7 1 有一个 JPA Hibernate 探针 http www ej technologies com products jprofile
  • 函数参数中的 PHP 标志是什么?

    我注意到 PHP 中的一些函数使用flags作为参数 是什么让它们独特而不是普通的字符串参数 我之所以这么问 是因为我想在自己的自定义函数上使用它们 但很好奇这样做的过程是什么 Edit 总结一下 什么时候最好创建带有标志的自定义函数以及什
  • 在 python 中将 OAuth2 与 gdata 上的服务帐户结合使用

    我想用data photos service PhotosService从 Picasa 推送和拉取照片 我从 Google 控制台获得了一个服务密钥文件 XXXXXXXX privatekey p12 现在正在尝试使用该密钥对 googl
  • 为什么将数组添加到 number 会返回字符串? [复制]

    这个问题在这里已经有答案了 var array 1 2 4 array 1 gives 1 2 41 谁能解释这种行为 谁能解释这种行为 这个答案试图解释这种行为从规格的角度来看 As per spec 在运行时评估期间 两个表达式 左和右
  • HMACSHA1.ComputeHash() 线程安全问题

    我问自己 在 ASP NET 页面的代码隐藏中使用包含 HMACSHA1 实例的静态 共享 变量是否会很危险 问题是 在同一 ASP NET 页面上处理多个同时请求时 所有 ASP NET 工作进程线程将使用相同的 HMACSHA1 实例
  • Mysql计数频率

    我检查过类似的问题 但它对我的精确问题没有帮助 所以 我的桌子是这样的 id age 1 30 2 36 3 30 4 52 5 52 6 30 7 36 etc 我需要计算年龄的频率 age freq 30 2 36 3 52 2 我怎样
  • 如何使用 Jacoco 和多个模块在 Jenkins 中实现代码覆盖率?

    我的代码结构如下 events消息其他代码功能测试 在 jacoco 的构建脚本中 首先它必须复制所有类并使用该类目录来运行该工具 您能否在此处描述目标目录的步骤 我的意思是如何提及运行代码覆盖率的目录 构建后 每个文件夹都有自己的目标文件
  • 从 NSArray 获取 NSIndexSet

    NSArray 有一些有用的方法来查找指定索引的对象 To find objects by indexes id objectAtIndex NSUInteger index NSArray objectsAtIndexes NSIndex
  • UITextInputMode.activeInputModes() 在 Swift 2 中崩溃

    我想在 Swift 2 中获得 UITextInputMode 但是UITextInputMode activeInputModes 崩溃 let x UITextInputMode activeInputModes crash here
  • OpenERP fields.function() 解释[重复]

    这个问题在这里已经有答案了 我从 stock py 文件和行号 163 中获取了此代码 complete name fields function complete name type char size 256 string Locati
  • 如果每个列表视图有多个文本视图,如何设置适配器?

    我有多个TextViewmy 中的每个列表项ListView 我学会了写一个正确的getView我相信的方法 但我不知道如何使用setAdapter调用该方法 private static String project proj1 proj
  • 单击时删除 html 图像上的蓝色突出显示

    我正在 Android 中制作一个自定义应用程序 我正在显示一个 html 页面 div 内有一个 img 标签 div class press img src but png width 150 height 62 border 0 di
  • 数组删除重复元素

    我有一个未排序的数组 删除元素 如果存在 的所有重复项的最佳方法是什么 e g a 1 5 2 6 8 9 1 1 10 3 2 4 1 3 11 3 所以在该操作之后数组应该看起来像 a 1 5 2 6 8 9 10 3 4 11 检查每
  • 从 PackageID 获取显示名称

    查看 Wix Standard Bootstrapper 应用程序的源代码 似乎每个包都有一个显示名称财产 pPackage gt sczDisplayName 但是 WiX 安装项目中使用的 BootstrapperCore dll 没有