2017-07-24 108 views
1

我有一个WIX安装程序,我在其中安装我的程序和.NET Core 1.0.5。 .NET Core安静模式下安装:如果已安装,跳过MSI

<ExePackage InstallCommand="/q" Id = "DotNetCore.Setup" SourceFile="..\DotNetCore\DotNetCore.exe" /> 

在干净的系统上,安装程序正常运行。如果我尝试重新安装它,我会重新启动。可能是.NET安装程序检测到已经安装并自行触发了修复功能。如果已经安装了.NET Core安装,有什么办法可以跳过?

我试图寻找的命令行参数,但似乎没有任何有用的

回答

2

ExePackage元素具有DetectCondition属性。这意味着您可以指定一个条件,如果条件评估为false,则将安装该包。您可以将其与util:RegistrySearch元素结合使用,该元素可用于搜索注册表以检测.NET Core是否已安装。

为了执行注册表搜索,首先需要找到每当安装.NET时都存在的注册表项。

查找你的注册表中的 “HKLM \ SOFTWARE \微软\的Windows \ CurrentVersion \卸载\”, (或 “HKLM \ SOFTWARE \ WOW6432Node \微软\的Windows \ CurrentVersion \卸载\” 在64位机)键,然后找到对应于.NET Core的子键 - 该键应该具有“DisplayName”的值,该值应该是“.NET Core”或类似的值。

正确的键一旦找到,应该有一个名称,它是一个十六进制字符的字符串 - 这是对应于.NET Core程序的GUID之一。然后,您可以使用下面的代码,使安装程序来搜索该键的存在:

<util:RegistrySearch Id="VCRedistTest32" Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{YOUR_GUID_HERE}" Result="exists" Variable="DOTNETPresent" Win64="no"/> 

(使用Win64中=“是”,而不是对64位注册表)

然后可以使用对于ExePackage如下:

<ExePackage InstallCommand="/q" Id = "DotNetCore.Setup" SourceFile="..\DotNetCore\DotNetCore.exe" DetectCondition="DOTNETPresent"/> 

不要忘记UTIL扩展添加到顶级的WiX元素参考

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> 
2

您需要使用DetectCondition属性和注册表搜索,在情况下安装.NET核心分配财产。

ExePackage Element - DetectCondition

“,其确定包是否存在于目标系统上的一个状态。这种情况可以使用内置在由搜索返回的变量和变量。该条件是必要的,因为Windows不提供的方法来检测ExePackage的存在,Burn使用这个条件来确定在捆绑操作期间如何处理这个包;例如,如果这个条件是错误的或者被省略并且正在安装bundle,Burn会安装这个包。

+0

啊,非常感谢!你是否能够提供条件来确定是否安装了.net内核?我甚至可以避免检测条件,如果我可以强制安装“安装” –

+0

您需要安装后检查注册表。一个完整的例子哟可以在这里检查https://www.firegiant.com/wix/tutorial/net-and-net/bootstrapping/ –