为什么在 WiX / MSI 设置中限制自定义操作的使用是个好主意?

2023-11-23

为什么在 WiX / MSI 设置中限制自定义操作的使用是个好主意?


部署是大多数开发的关键部分。请给此内容一个机会。我坚信,通过应用程序设计的微小改变,可以显着提高软件质量,使部署更符合逻辑、更可靠——这就是这个“答案”的全部内容——软件开发.


这是一个问答式的问题,从一个太长的答案中分离出来:如何避免 WiX/MSI 部署解决方案中的常见设计缺陷?.


Core:本质上,自定义操作很难正确执行,因为复杂性源于:

  • Sequencing-, Conditioning-(当它运行时 - 以什么安装模式:安装、修复、修改、卸载等...)以及Impersonation-issues(它运行的安全上下文)。
  • 其结果是总体poor debugability- 非常努力地测试所有排列。

应用程序启动: 解决方案?首选应用程序启动代码。您将获得熟悉的调试上下文,并且通常可以将代码保留在主应用程序源中 - 非常重要。对于以下情况,问题是相同的:设置中的许可(如果可以的话,把它拿出来)。


自定义操作调试:包含所有警告(您将阅读下面的简短“民间”版本 - 是的,您会的 - 绝地把戏)-尽可能使用内置结构- 以下是如何改进调试自定义操作的方法:

  • 自定义操作运行时失败的常见原因
  • Debugging Custom Actions
    • 对于本机代码/C++,只需将调试器附加到msiexec.exe
    • 高级安装程序的调试 C# 自定义操作视频教程

短版“民间”:

Overall:现代设置应该“声明”,而不是编码。 “思考 SQL 查询,而不是脚本”。应用您刚刚调用的经过充分测试的逻辑来完成工作。稍后会详细介绍。

  • Avoid custom actions if you can.
    • 他们会拧你的头(并谋杀你的少女身材)!
    • 说真的:他们是部署失败的首要原因.
    • 它们具有“阴谋复杂性“在您部署设置一段时间并且它处于“野外”状态后,事情经常会在没有警告的情况下意外中断。
    • 部署是一个过程- 你将不得不处理“过去的罪孽“对于每个新版本。在部署损坏后进行清理可能会成为一场真正的噩梦。每次迭代都会添加新的潜在错误源(我对失败的修复的修复,失败等......)。
    • 运行时要求 for 托管代码 and 脚本编写自定义操作非常容易出错(我认为尤其是.NET)。一个设置 - 如果有的话 - 应该具有“最小依赖性“ - 因为它用于直接安装依赖项并且应该运行在”任何机器" in "任何州" in "任何语言".
    • 除了使用内置 MSI 构造或 WiX 自定义功能之外,通常可以通过对应用程序设计进行微小更改来避免自定义操作这样就不再需要复杂的自定义操作(示例如下)。
  • Spend the time to find and review built-in MSI features and extensions from WiX, Installshield, Advanced Installer (and other vendor tools).
    • 这些扩展是由最好的部署专家制作,并且在大多数情况下经过数千人的测试(如果是内置 MSI 功能,则为数百万和数十亿)。
    • 您如何才能将其与您自己的专有代码相匹配?如果现有的解决方案足够好(通常是这样),那么您自己的代码就是完全增加了风险却没有任何收益。现成的解决方案甚至支持rollback- 众所周知,这是一个被忽视且难以实现的功能 - 这实际上是设计所需要的。
    • 换句话说:当您使用现有的解决方案时,您不仅借用了实现,而且最重要的是借用了QA, UAT and testing当您使用扩展时。这可以节省数周的工作时间 and 对部署稳定性有很大贡献.
    • 所需要的只是花一些时间搜索和阅读已有的内容,而不是使用您自己的代码来快速启动。哎呀,甚至你自己的经理也可能参与搜索……在梦想世界中。
    • 设置通常不应该被编码,而应该被声明!(想想 SQL)。这就是 Windows Installer 的全部内容:您声明要安装的内容,然后安装程序引擎本身会处理顺序。如果做得正确,就会产生效益。
  • 确实就是这样。如果你敢的话,请继续阅读!这里是龙在严肃的咆哮之中。至关重要的是:现实生活体验处理设置开发以及在企业环境中大规模部署此类设置。常见问题变得更加清晰——它们更容易识别。您可能会被真正必须解决的问题所困扰 - 您觉得自己永远无法预见(进行企业包装和重新包装,您会发现单个包装可能会出现多少问题 - 可能需要几天的时间才能击败它们)有时会成形)。
  • 请记住,这并不像听起来那么糟糕:部署通常是一种低地位的技术努力,但却是引人注目的失败。错误确实显示。有人会对此负责,而支持者也会真正感受到这一点。
  • 开发过程中的调试很困难,但对于部署来说,有时几乎是不可能的,因为您通常无法访问问题系统,并且每个问题系统将处于完全不同的状态。
  • 实话说:未能将软件正确部署给最终用户可能几乎是软件开发中最昂贵的错误 - 没有人能见证您的解决方案的伟大 - 并且它会影响销售、支持、营销和进一步的解决方案开发.
  • 部署不当肯定会毁掉产品。很遗憾良好的部署不足以挽救产品.

充实的咆哮版本:-)

如上所述本节是从范围更广的现有答案中分离出来的: 如何避免 WiX/MSI 部署解决方案中的常见设计缺陷?(旨在帮助开发人员做出更好的部署决策的答案)。

  1. 错误或不必要地使用自定义操作.

自定义操作的使用可能会导致大量部署问题 - 其中大多数都非常严重。如果您的设置无法完成或崩溃,则很可能是错误的自定义操作造成的。

因此显而易见的解决方案是尽可能限制您对自定义操作的使用。自定义操作(通常)是“黑盒子“(隐藏代码)而大多数 MSI 都具有很大的透明度。MSI 格式可以轻松查看(COM结构的存储文件),并且 MSI 文件所做的一切本质上都可以从其 MSI 数据库文件中推断出来 - 除了编译的自定义操作(脚本自定义操作仍然是白盒 - 您可以看到发生了什么,除非它们被混淆)。

In this 恶意软件时代,这些黑匣子自定义操作(以更高的权限运行)可能会在多种方面受到不满。它们不仅仅是稳定性和可靠性问题,而且是全面的安全问题。

6.1 自定义操作的过度使用

  • 请原谅下面列出的“小事”。其中很多可能是平庸的,但也许可以使用列出的参数为自己提供理由,以避免自定义操作并致力于更好的解决方案 - 通常涉及更智能的应用程序启动顺序和应用程序自配置。相信我们,应用程序编码将比处理 Windows 安装程序的复杂调节、排序和模拟自定义操作更有趣。

  • 下面的内容已经更新了很多次,部分内容有点乱序或到处重复。时间允许的情况下将进行清理。

  • 开发人员擅长编码 - 因此恕我直言 - 您倾向于过度使用自定义操作做一些更好的事情内置 MSI 功能 or 现成的 MSI 扩展解决方案例如 WiX 中可用于高级功能的功能,例如XML 文件更新, IIS, COM+, 防火墙规则, 驱动安装, 自定义许可对于磁盘和注册表项,修改NT权限等等...这种支持也存在于商业工具中,例如Installshield和Advanced Installer。

  • 还可以将自定义操作中完成的许多操作作为应用程序的启动顺序。最好的例子是初始化用户数据并将设置文件复制到每个用户配置文件。这里有一个关于这个问题的小总结:从管理员配置文件中在当前用户配置文件上创建文件夹和文件.

  • 这是显而易见的,但很多时候,由于不了解通过现成解决方案“开箱即用”的可用内容,因此使用了自定义操作。这种事经常发生在我们所有人身上,不是吗?总有一些更聪明的方法可以让你避免很多悲伤?无论如何,总的来说——尽管有时你正在开辟新天地。不要在您的设置中开辟新天地 - 除非绝对必要!将其保存以供您的应用程序使用。

  • 我想强调的是这些内置的 Windows Installer 解决方案以及 WiX 和商业工具的扩展是由现有的最佳部署专家编写的。此外,更重要的是,它们的内置 MSI 功能已被数千、数百万人(甚至数十亿人)使用和测试。你真的认为你可以做得更好吗?这个故事的寓意是:选择你的战斗并利用你出色的编码技能来解决新问题,并且让部署尽可能简单。使用已经有效的方法,不要重新发明轮子。部署中有太多的未知数,太多无法控制的变量——你正在处理“任何机器" in "任何州“并且在”任何语言". 请参阅此处的部署复杂性部分如果您想要示例(在页面下方一点),只需简短转储一下当您的包命中目标系统时其状态可能有所不同的所有方式。每个变量都是自定义代码的新熊陷阱 - 来自操作系统版本, to 应用地产 to 恶意软件情况. 这个清单还在不断地增加。正如链接内容中的结论所示:“部署是一个简单的概念,具有复杂的变量组合,可能会导致最神秘的错误 - 包括开发人员最喜欢的错误:间歇性错误。众所周知,此类错误的严重性怎么强调都不为过,因为它们通常无法正确调试。"

  • 某些高级的事情必须在您的设置中完成 - 因为它们需要提升的权利并且您的应用程序在运行时不应请求此操作。这就是设置的目的,先进的、提升的系统配置 - 所以接受这种复杂性,但使用现成的解决方案!不要推出自己的脚本和解决方案,而使用内置的、经过良好测试的东西。你的脚本在韩国能正确运行吗?您的自定义操作是否会被您从未有时间测试脚本的主要反恶意软件解决方案阻止?您是否有时间编写自己的检查来检查计算机上是否安装了某个必备运行时 - 该运行时适用于所有区域设置和所有操作系统版本?这里出现错误的可能性是惊人的 - and 有时无法正确测试。你们有阿拉伯语、中文、韩语或日语的测试机吗?也许你会。但是您有终端服务器可供测试吗?韩国终端服务器怎么样?您是否使用 MSI 广告测试了您的设置?为了使高级系统管理功能发挥作用,您必须使您的设置尽可能简单和标准. 我想说,在你自己写任何东西之前,先花几天时间寻找现成的解决方案。请记住,使用现成的解决方案,您不仅仅是借用他们的代码,更重要的是借用其创建者的 QA、测试和 UAT - 您几乎永远不会希望重复这些。

  • 真实世界测试是唯一重要的标准——没有替代品。不要承受这个痛苦的世界!通过 Windows 更新部署的 Windows 中的微小更改和您的自定义操作会以多种方式中断。选择更好的战斗来发挥你的技能。如果你反对设计,Windows 安装程序就会反击。

  • 部署过程中发生了很多事情,这使得它变得复杂——而不是像我们想要的那样愚蠢(只需复制一些该死的文件),你的斗争是让它尽可能简单,但不能更简单。以下是部署任务列表,显示了为什么很难让您的包“足够愚蠢”:安装程序的好处和真正目的是什么?尽可能只使用现成的结构 - 这是第一个轻松的胜利。您所需要做的就是稍微阅读和搜索一下。

  • 最后我要补充一点,所有自定义操作都应该支持回滚如果安装失败,将系统恢复到原始状态。在现实世界中,这几乎从未在临时自定义操作中完成(根据我的经验)。相信我,处理起来很复杂 - 我害怕“回滚”这个词,就像我在 C++ 中实现 MSI 回滚后,西伯利亚哈士奇害怕“洗澡”这个词一样。这不是我经历过的最有趣的事情,但它最终工作正常。如果您希望您的设置没有太多依赖项,那么 C++ 是最佳选择,而且众所周知,处理起来并不简单。现成的解决方案支持开箱即用的回滚 - 只需一点阅读和搜索即可轻松实现它们。是的,复杂,但你的基础更坚实。至关重要的是:一旦日本机器上发生了不起眼的错误,我们可以寻求社区修复,或者第三方供应商需要对其进行排序。

  • 经过所有这些“一般观察”,在纯粹的技术层面上,Windows Installer 中的自定义操作在以下方面非常复杂:执行, 调度, 调理 and rollback,因此应该在绝对必要时使用(通常用于早期采用者的东西)。进一步的复杂性是运行时要求- 例如对特定版本的 .NET 运行时、PowerShell 或 Installscript 运行时的依赖性(Installshield 的脚本语言 - 它具有运行时依赖性,但这现在已基本解决,它曾经是一个问题)。

  • 错误来自缺少运行时要求可能是一个巨大的毛团需要处理 - 对于零增益。由于这个原因我只使用最小依赖 C++ dll or 安装脚本进行自定义操作时。碰巧我使用VBScript or JavaScript for 用户界面序列中的只读自定义操作。这些只是检索数据,不会对系统进行任何更改。这些是唯一不易出错的自定义操作类型。然而,它们应该设置为在不检查退出代码的情况下运行(以防止它们在正在运行的设置中触发回滚或中止 - 通常在主要升级模式下)。

  • 另外:Windows Installer 拥有自己的脚本运行时引擎,因此您知道活动脚本(VBScript、Javascript 等)可以运行,除非您的目标系统实际上已损坏(正常系统上不会缺少运行时)。这与托管代码自定义操作- 此时目标系统完全有可能没有 .NET 运行时(2018 年 1 月)。现在,这种情况将来会发生变化,因为 .NET 成为 Windows 中真正内置且必需的功能(或者由 Windows Installer 本身托管的某些最小版本)。托管自定义操作代码仍然存在因奇怪原因而失败的问题 - 例如使用了错误的 .NET 版本运行它,或者加载的 CLR 版本错误以及被利用等等……我在这里的经验有限,但我认为问题很严重。不过,我认为最终我们都会编写托管代码自定义操作。不过,我仍然会使用 C++ 进行全球分发场景。

  • Powershell 脚本对于自定义操作尤其复杂因为它们显然耗尽了进程并且无法访问 MSI 的会话对象(来源:MSI 专家 Chris Painter)。 Powershell 还需要安装 .NET 框架。我永远不会使用 Powershell 脚本进行自定义操作 - 甚至不会用于内部、公司部署。你的来电。作为一个“样本”,这里是该领域的一位专家陈述他的观点(老化的博客项目,但如果你问我的话仍然相关):不要使用托管代码来编写自定义操作!

  • 我试着写一个不同自定义操作类型的优缺点总结。坦白说,我对此不太满意,但事实是:使用 WIX,Windows Installer 在 Windows 10 上失败,但在 Windows 7 上失败。我有什么不满意的?推荐 JavaScript 的原因之一是——我很少使用它,尽管它是一种比 VBScript 更好的语言——特别是在错误处理方面——但我在使用 MSI 和 Javascript 时遇到了很多问题。这可能是键盘和椅子之间存在的问题:-),但我认为 JavaScript 也存在一些真正的问题。尽量避免复杂的脚本使用。对于像检索属性这样的简单事情,它们似乎对我来说工作正常。然而,该领域的专家对脚本自定义操作却是无情的:不要使用 vbscript/jscript 来编写自定义操作!(亚伦·斯特布纳),VBScript(和 Jscript)MSI CustomActions 很糟糕(Rob Mensching - WiX 仁慈)。

  • 我还要补充一点,自定义操作的复杂性是“愚蠢,阴谋复杂“处理这些事情并不有趣。它会咬你。陷阱。你会在适当的时候发现你所犯的所有错误——当你继续前进时(然后你需要做一些解释)——它们通常不会是立即显而易见(升级、修补、卸载时突然出现问题,您的自定义操作在修复过程中运行错误,因为它没有正确调节并清除了某些注册表设置,静默安装无法正常工作 - 它使安装不完整,因为自定义操作仅存在于用户界面序列中,Windows XP 上存在您从未测试过自定义操作代码的运行时错误,目标系统上存在您未屏蔽的损坏内容,有人打电话给您并告诉您您的软件包没有无法与活动目录一起使用,您的软件包无法发布广告,它在所有韩国和日本系统上都会失败,自我修复会触发运行时警告并拒绝普通用户的访问,等等...)。您将没有时间修复一旦它击中你,你就可能不得不继续使用不合标准的解决方案来让自己领先于下一个障碍。不,我自己并没有经历过这一切。事实上,我在修复用于企业部署的第三方供应商 MSI 文件时发现了大部分问题。当您查看、比较、审查数百个软件包并将其调整为大规模部署的企业标准时,您确实会发现很多潜在的错误源。老实说,除了最简单的软件包之外,所有软件包都存在严重的缺点和错误。显然,您会看到几年前进行此类供应商设置时做错了什么。猜猜排名第一的是什么?当内置构造可用时过度使用自定义操作。

  • 除此之外,部署固有的复杂性及其要求在任何机​​器、任何地方、任何状态下工作,还存在以下问题:MSI 技术边缘反模式。 MSI 技术的某些部分由于人们对其知之甚少,并且有时在实际使用中很脆弱而导致重复部署问题。这个答案中有一个简短的总结(向底部):如何更好地利用 MSI 文件(以及一个列表MSI 非常重要的企业利益 - and 现实世界包中常见技术问题的随机转储)。特别是后一个链接在我写完之后让我觉得不太理想。接受它的本质:混乱的、现实世界的建议,没有太多其他的东西。它发现了太多的问题,却没有在某些地方显示出太多的修复措施。

  • 软件的很大一部分支持电话往往来自部署过程中发现的问题。正如故事所说:“...未能正确安装您的优秀软件可能会导致失败最昂贵的错误从事软件开发。你永远不可能希望出售一个无法测试的软件“(来自上面链接的答案之一)。此类问题的背后往往是不良的自定义操作。

  • 我认为我们看到的最常见的不必要的自定义操作用途:

    • 您通过自定义操作安装 Windows 服务。使用内置构造在 MSI 本身中可以更好地完成此操作。

    • 您可以通过自定义操作将 .NET 程序集安装到 GAC。 Windows Installer 本身完全支持这一点,无需一行(有风险的)代码。

    • 您运行自定义 .NET 程序集安装程序类。这些将用于开发和测试only。他们应该never作为部署的一部分运行。相反,您的 MSI 应该使用内置构造来部署和注册您的程序集。

    • 您可以通过自己的 MSI 中的自定义操作来运行先决条件设置和运行时安装程序。这应该完全不同地完成。您需要的是一个可以按顺序启动您的设置及其先决条件的引导程序。商业部署工具,例如高级安装程序 and 安装盾有这方面的功能,但是免费框架,例如WiX 通过其刻录功能提供支持,还有免费的 GUI 应用程序,例如DOTNet安装程序(未经我测试)具有这些功能。

    • 在这种特殊情况下,请相信我的话:通过自定义操作运行嵌入式设置最终会失败- 通常相当立即。 MSI 在调度、模拟、事务、回滚和整体运行时架构方面过于复杂,无法实现这一点。根据设计,一次只能运行一个 MSI 事务,这使得事情变得非常复杂。过去,您可以将嵌入的 MSI 文件作为 MSI 中的一个概念来运行,但这已被弃用 - 它无法正常工作。您必须按顺序运行每个设置。正确的顺序。有引导程序/链式程序可用,允许您定义这样的安装顺序。这是一个描述其中一些问题的答案(不要让问题标题让您失望 - 它是关于引导程序/链式程序和其他部署注意事项):Wix - 如何在没有 UI 的情况下运行/安装应用程序.

6.2 自定义操作替代方案

  • WiX 和其他工具(例如 Installshield 和 Advanced Installer)中的现成解决方案经过尝试和测试,最重要的是还实施适当的回滚支持- 自定义操作实现中几乎总是缺少该功能 - 即使在其他良好的供应商 MSI 设置中也是如此。回滚是 MSI 的一项非常重要的功能。您无法与在各种环境中积极使用和测试的大型用户社区提供的质量相竞争。利用这些功能。

  • 除了使用内置 MSI 构造或 WiX 自定义功能之外,通常可以通过对应用程序设计进行微小更改来避免自定义操作,从而不再需要复杂的自定义操作. I see 许可作为如何简化部署以提高可靠性的示例。

    • 这是非常重要的一点,也是经常被忽视的一点。有时,一些高质量的编码时间或几天以及一些高质量的 UAT/QA 时间可以防止长期部署问题的存在。再多的支持时间也无法解决您可能产生的最糟糕的部署问题。

    • 这个答案提供了一个关于部署的总体复杂性: Windows Installer 和 WiX 的创建(朝向底部)。部署是一个复杂的“交付过程”,存在几个严峻的挑战:1)部署错误的累积性, 2)正确调试的难度, and 3) 影响全球目标机器的外部因素和变量的范围几乎不受限制- 结论是部署必须尽可能简单才能可靠。有太多的干扰因素让您成为开发人员最喜欢的:间歇性错误。建议使用上面的链接以获得更详细的解释。

6.3 高级自定义操作问题(超出运行时故障)

  • 一个非常常见的自定义操作问题是它们的计划不正确并尝试从“非提升”即时模式操作修改系统。这些是高级 MSI 设计缺陷对于看到其他工作设置的人来说,无法立即识别。

  • 切勿在 InstallExecuteSequence 中的 InstallFinalize 之后插入立即模式自定义操作尝试修改系统(读/写)的 MSI。如果您的设置是通过 SCCM 等部署系统以静默模式部署的,这些操作将永远不会运行(同样,我上次检查过)。

  • 切勿尝试使用从设置 GUI 激活的即时模式自定义操作来更改系统。这似乎适用于管理员用户,但即时模式自定义操作不会提升,因此普通用户将无法在没有错误的情况下运行它们。此外,当安装程序在静默模式下运行时,从 MSI GUI 对系统所做的任何更改都将永远不会完成(然后会跳过整个 GUI 序列)。这是一个非常严重的MSI设计缺陷:静默安装和交互安装会导致不同的结果。这个问题在关于静默安装的第 10 节以及这个答案中都提到过:如何避免 WiX/MSI 部署解决方案中的常见设计缺陷?。静默安装是企业部署软件的一项重要功能。在能够控制其部署的公司中,所有部署都是静默完成的。你的设置 GUI 根本就没见过。我能想到的只有少数例外,例如某些可以交互方式完成的服务器部署,但所有桌面和客户端软件都是静默部署的。不支持正确的静默安装因此是一个可怕的缺乏 and 设计缺陷您的 MSI 设置。请注意这个建议。这对于企业接受您的软件至关重要 - 我建议将某些软件从标准系统中剔除,因为它的部署对于系统来说非常危险,我们只是不想处理它。虚拟化 and 沙箱 (APP-V- 虚拟包 - 或完整的虚拟机)今天之所以如此大,正是因为这些问题(行为不当的应用程序和设置).

  • 对系统进行更改的所有自定义操作都必须插入到安装序列的“事务处理部分”中。此 Windows Installer 事务(认为是数据库事务提交)在标准操作之间运行安装初始化 and 安装完成 in the 安装执行序列并以更高的权限运行。对系统的所有更改都将在该事务中进行 - 其他任何内容都是错误的(但不幸的是很常见)。此处插入的所有自定义操作都应该实现相应的回滚自定义操作,这应该撤消对系统所做的任何更改,以防安装失败并回滚。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 WiX / MSI 设置中限制自定义操作的使用是个好主意? 的相关文章

  • 使用“Any CPU”而不是“X86”编译wix项目

    当我编译一个wix项目 并且wix通过MSbuild启动所有现有项目的编译时 我可以使用 任何CPU 而不是 X86 或 64位 吗 如果没有 我如何使用 任何CPU 编译项目 如果您的问题是是否可以编译 WIXPROJAny CPU那么答
  • WiX - 安装 Windows 服务以在 x64 模式下运行

    我正在使用 WiX 3 5 及其 ServiceInstall 标签安装 Windows 服务
  • 用于配置编辑的 wix 自定义对话框

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

    我有兴趣了解 WiX 如何捆绑使用 Burn 创建的 EXE 文件 我知道创建一个自解压 EXE 文件非常简单 我已经完成了一百万次了WinRAR http en wikipedia org wiki WinRAR EXE 文件解压到哪个目
  • Installshield 在次要升级时不更新相关 DLL

    我目前正在使用 InstallShield 部署 NET Winforms 应用程序 我是 InstallShield 的新手 不太喜欢学习过程 Winforms 应用程序具有三个相关的 DLL 这些 DLL 在次要升级期间不会更新 例如
  • Wix - 自定义安装目录

    我使用的是 Wix 3 x 用户应该能够选择目标目录 我的Setup wxs目前是这样的 http pastebin com uH1EjbDQ http pastebin com uH1EjbDQ 询问用户自定义目标目录的最简单方法是什么
  • WIX 目标文件由 LFN 系统上的两个不同组件安装在 [ProgramFilesFolder] 中:这会破坏组件引用计数

    我正在使用 WIX 通过 TFS MSBuild 生成 msi 破坏构建的错误 不仅仅是警告 是 ICE30 The target file eiycriw9 exe MyApp exe is installed in ProgramFil
  • 是否有其他方法可以访问延迟自定义操作中的会话详细信息?

    我有一个自定义操作 需要获取以下值才能将某些部分从安装文件夹复制到 VS2010 文件夹 VS2010目录路径 VS2010DEVENV财产 安装路径 INSTALLLOCATION财产 为了提供足够的权限 我将自定义操作设置为Execut
  • 捕获数据包后会发生什么?

    我一直在阅读关于网卡捕获数据包后会发生什么的内容 我读得越多 我就越困惑 首先 我读过传统上 在网卡捕获数据包后 它会被复制到内核空间中的一个内存块 然后复制到用户空间 供随后处理数据包数据的任何应用程序使用 然后我读到了 DMA 其中 N
  • 如何在自定义操作期间移动进度条

    在安装程序中运行自定义操作时 没有进度条 我们正在使用立即 C 管理代码自定义操作 运行自定义操作时是否有其他方法显示进度 预先致谢 维卢 使用 ProgressText 元素 模板 属性是放置标记以反映进度的地方 例如 请参阅标准 Ins
  • 如何禁用恢复 Visual Studio 安装程序项目丢失的文件?

    我创建了一个使用来自暴雪 API 服务的图像的程序 我为该程序创建了一个安装程序 并将图像放置在 用户的应用程序数据文件夹 中 安装非常好 图像被解压到文件夹 AppData Roaming MyApp 中 如果需要删除图像 程序将从暴雪服
  • 让 WiX Bootstrapper 用于 .NET 4.0 的引导

    我一直在寻找让我的引导程序能够安装 NET 4 0 和我自己的应用程序 我查看了几个博客和教程 但无法让它发挥作用 我在 Stack Overflow 问题中读到在 WiX 中启动 调用引导程序 https stackoverflow co
  • 在 WiX 中轻量运行时,DefaultDir 无效

    我只是想做一个安装程序 将一些文件移动到程序文件中 设置开始菜单链接 并出现在要卸载的添加 删除程序中 目前我很乐意点击开始菜单链接 因为这看起来相对简单 需要注意的是 我特别希望可以通过脚本构建它without任何类型的全局安装 这意味着
  • WiX - 提交多个属性以推迟自定义操作

    我的 WiX 安装程序在处理延迟 立即自定义操作时遇到问题 请原谅我的英语 我想将用户输入的一些属性交给延迟的自定义操作 我知道我需要立即自定义操作和 CustomActionData 来执行此操作 我就是这样实现的 二进制
  • 如何引导 SQL Server 2008 Express SP1?

    我正在尝试将 SQL Server 2008 Express SP1 引导到我的应用程序中 之前我使用 Wise for Windows 来执行必备安装 但 Wise 尚不支持 Windows Installer 4 5 我现在尝试将 Vi
  • Wix 安装结束后添加多个复选框

    我的 C 应用程序有一个设置 在设置结束时 我添加了一个建议启动应用程序的复选框 效果很好 但我无法添加第二个复选框来提议启动可选安装程序 有我的代码
  • WiX 自定义操作项目 - BadImageFormatException

    我正在开发我的第一个自定义操作 但无法加载生成的 CA dll 文件 这是最简单的过程和结果 我创建了一个自定义操作项目并保留所有默认值 该类看起来像这样 using Microsoft Deployment WindowsInstalle
  • 为什么我的应用程序会触发另一个应用程序的安装程序?

    当使用旧版 VB6 应用程序并在该应用程序中打开某些特定表单时 会弹出属于 Microsoft Navision 安装在同一台计算机上 的 Windows Installer 如附图所示 每次都会发生这种情况 但仅限于这台机器 VB6应用程
  • 如何与静默安装的 msi 交互? (进度数据并取消)

    由于某种原因 我们正在提供带有我们自己的安装 GUI 的产品 这意味着我们将在后台静默运行 msi 安装 通过使用 MSI API MsiInstallProduct 我可以静默安装该产品 但我不知道如何获取此安装的进度数据以及如何取消它
  • 安装引导程序如何检测是否安装了先决条件?

    试图解决这个问题 https stackoverflow com questions 2591384 bootstrapper setup exe says net 3 5 not found but launching msi direc

随机推荐