2017-07-24 110 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/ –