9

我的 WiX 安装程序(Wix 3.10、MSI 4.5)MajorUpgrade用于更新。要安装的文件是heat.exe在预构建中收集的。当前(旧)msi 文件包含一个文件nlog.dll(随 NuGet 包一起提供v4.1.0),其文件版本为4.1.0.0,产品版本为4.1.0,上次写入时间为2015-09-01.

由于 nlog 团队遇到了一些严重的命名问题,他们发布了一个更新的 NuGet 包v4.1.1,其中包含一个更新nlog.dll ,其文件版本降低回,4.0.0.0而其产品版本提高到4.1.1,最后写入时间为2015-09-14.

现在我遇到了 Robbie 在这里所做的相关问题:wix major upgrade not installed all files:当我安装新的 msi 包并执行主要升级时,当前nlog.dll(根据其文件版本较新,但较旧根据其文件日期和产品版本)正在被删除,但nlog.dll没有安装新的。

但是,使用Schedule="afterInstallExecute"orSchedule="afterInstallFinalize"按照建议不会对我有用。与 Robbie 的情况不同,它不会删除较新的文件并且不安装较旧的文件,而是不会覆盖当前文件,而是将其保留在原处。

长话短说,我希望我的安装程序简单地安装它附带的所有文件,而不管任何文件/产品/程序集版本控制的东西。在某些情况下,需要用旧文件替换新文件。你不能告诉安装引擎忽略文件版本/日期吗?如果没有,我有什么选择?

4

2 回答 2

11

您可以将 REINSTALLMODE 属性设置为 AMUS 而不是 OMUS。这将影响全局的所有组件。

另一个技巧是使用“版本谎言”。这是您使用更高版本创作文件元素的地方。使用热量会使这变得困难,因为现在您必须在编译 XML 之前对其进行转换。

当然,真正的解决方案是打击 nlog 团队。但根据我多年来从他们那里看到的情况,这永远不会发生。也许您只是使用资源编辑器来破解 DLL 并“修复”版本#。那是假设您不需要它的强命名。不过,这对我来说感觉很脏,可能是 CM 的噩梦。

或者只是转储nlog。:)

于 2015-09-16T11:21:54.177 回答
0

如果这是一次重大升级,并且您希望在安装新产品之前卸载所有内容,则将 RemoveExistingProducts 安排在 InstallInitialize 或 InstallValidate 之后。那首先进行卸载。

我不知道您是否遇到“不允许安装...”问题,但如果您遇到了,并且还有其他 Dll 客户端(它与其他已安装的产品共享),那么我会看看是否Dll 支持私有副本,因此您可以拥有自己的产品私有副本。如果它与其他产品共享,我不会使用版本谎言 - 我会使用 Visual Studio“打开为文件”打开 Dll 并更改版本!将其设为您的最新共享版本,以便安装它的每个软件包都可以使用它。

如果它没有与其他产品共享并且您只是遇到了 MSI 怪癖,那么请制作您自己的升级元素并在 CostInitialize 之前安排 RemoveExistingProducts,这就是决定不安装的原因。这可行,但它在 MigrateFeatureStates 之前,因此您将在主要升级中失去功能迁移。

于 2015-09-16T17:54:41.663 回答