【问题标题】:What goes on under the hood when the user chooses "Repair" on their .NET installation?当用户在他们的 .NET 安装中选择“修复”时,会发生什么?
【发布时间】:2015-01-28 23:22:49
【问题描述】:

特别是,我们创建了一个 .msi 安装程序,用于将程序集安装到 GAC,并在 msxml3.dll 上具有内置的 DoRegisterTypeLib 操作。但是(并且不知何故),错误的 msxml3.dll 版本(Microsoft 知道的 8.70.1104.0)仍然存在于某些最终用户的 PC 上。如果 msxml3.dll 是那个坏版本,那么 DoRegisterTypeLib 会失败(错误代码为 11)。我们告诉我们的最终用户“修复”他们的 .NET 安装,然后,一切正常。

再说一遍,这个“修复”有什么作用?它是否更新某些/任何 Microsoft .dll?

即使我们不应该在那个(或任何 .dll)上创建那个 DoRegsiterTypeLib,我仍然真的很想知道“修复 .NET”在幕后做了什么。任何人的任何见解都将不胜感激!

【问题讨论】:

  • 它重写了大量的注册表项。其中包括修复任何可能受到安装程序删除错误 DLL 或注册表错误影响的任何问题,这是 Microsoft 每天需要处理的类型。永远不要考虑自己做这件事,你不会做对的。由于依赖于 msxml3,您将自己暴露在如此糟糕的安装程序中,您需要迁移到 msxml6。
  • 几乎可以肯定你不应该做那个 DoRegisterTypeLib 调用。除了单独使用(例如)合并模块的潜在问题之外,如果条件不正确,您的自定义操作可能会在产品修复期间运行。如果您注册了一些不正确的 Dll 类型库,那么这只是一团糟,然后 NET 修复修复它,然后您的修复再次运行您的自定义操作。

标签: .net windows-installer msxml3


【解决方案1】:

它遍历每个组件并检查其 KeyPath 是否存在且正确。

它将注册 dll 和组件,并将丢失的损坏文件复制到 INSTALLDIR

您可以激活 LOG 进行修复 第一步是打开windows的日志记录 安装程序。您可以在运行 MSI 时执行此操作(假设您是 直接运行 MSI 文件,不使用控制面板)或使用 注册表设置以打开全局日志​​记录。看 http://support.microsoft.com/kb/223300 了解详情。

【讨论】:

  • 那我看看具体的相关注册表项。我们从命令行调用我们的 .msi 并尽可能多地打开日志记录,但对 .NET 修复本身进行日志记录是个好建议。如果可以的话,我会 +1...
  • 发布您的发现,这始终是表示感谢的好方法;)您以后随时可以投票
  • 实际上有一个更高级别的活动正在进行。 .NET Framework 不是单一的 MSI。它是一个 EXE 引导程序,可以根据您的操作系统和位数将多个包链接在一起。修复调用 EXE 修复,然后调用各种 MSI 的修复。它可能会或可能不会检查密钥文件。它可能只是执行 REINSTALL=ALL。
  • 更具体地说,修复通常使用 pocmus 的 REINSTALLMODE 运行,因此丢失或版本较低的文件将从 MSI 修复回原始版本。
  • 如果有人确实需要知道到底发生了什么(相对于学术问题),那么要问的人是 Heath Stewart 和 Aaron Stebner。他们的博客很容易找到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
相关资源
最近更新 更多