正确编写和编译的 .NET 2.0 程序集可能确实依赖于 .NET 2.0、3.0 或 3.5 (CLR 2.0) 或 .NET 4.0 / 4.5 (CLR 4.0)。因此,说您需要 .NET 2.0 或更高版本可能更准确。
也就是说,合并模块只是其中的一部分。你如何选择设计这个表达式取决于你,这是我考虑的一种方式。
安装 .NET 不是合并模块的工作。事实上,它不可能是由于 Windows 安装程序互斥锁强制每台机器执行一个执行序列。这意味着这也不是 MSI 的工作。这就是引导程序和链接程序的用武之地。
MSI可以做的是仔细检查chainer是否完成了它的工作。此表达式可以在 MSI 或合并模块中编写。
您首先编写一个 AppSearch / Reglocator 来检测 .NET。WiX NetFx 扩展有一些内置属性,您可以参考这些属性来简化此操作。
现在您创作了 LaunchCondition。但是,对于 WiX,合并模块中不存在 Condition 元素。这是因为 MSDN 说 MergeModules 不应该使用 LaunchCondition 表。相反,您创作了一个 Type 19 错误自定义操作并在表中对其进行排序。
现在您可能希望在此检查上设置一个条件,以允许 MSI 覆盖该检查。(不是 DOTNETFRAME20FOUND 也不是 IGNOREDOTNETFRAME20)。事实上,您可能希望将所有这些放在一个合并模块( REQUIRESDOTNETFRAME20.msm )中,并由多个共享相同依赖项的合并模块引用它(不要重复自己)。
在我的上一份工作中,我们进行了产品线开发,这意味着数千个合并模块以不同的组合组合在一起以创建数十种产品。我们在独特的模块中表达了所有这些,并且通常在产品层而不是服务系列/组件层创建关联。有时,如果这是一个不寻常的依赖关系,我们会这样做。