2016-12-12 131 views
0

我對我的C#項目使用wix。我有一個安裝程序的引導程序。該引導程序安裝:使用wix安裝軟件包

  • SQL服務器2014
  • CLR類型2014
  • 系統管理對象2014 (三個來自微軟的站點)
  • 我的應用程序

我的問題是系統2014年的管理對象取決於CLR類型2014.當我的安裝程序正在執行時,安裝了SQL服務器,然後CLR類型爲2014,安裝時必須安裝System Management Object 2014 I有一個錯誤消息「需要CLR類型」。如果我取消設置並重新啓動,它工作正常。

如何編寫我的Bundle.wxs來檢測以前的安裝(或重新啓動安裝程序)?

有我的代碼:

<!-- SQL CLR Types --> 
<util:RegistrySearch Root="HKLM" 
        Key="SOFTWARE\Microsoft\Microsoft SQL Server 2014 Redist\SQL Server System CLR Types\CurrentVersion" 
        Value="Version" 
        Variable="CLRTypesx86"/> 
<util:RegistrySearch Root="HKLM" 
        Key="SOFTWARE\Microsoft\Microsoft SQL Server 2014 Redist\SQL Server System CLR Types\CurrentVersion" 
        Value="Version" 
        Variable="CLRTypesx64" 
        Win64="yes"/> 

<!-- System Managment Objects --> 
<util:RegistrySearch Root="HKLM" 
        Key="SOFTWARE\Microsoft\Microsoft SQL Server\SharedManagementObjects\CurrentVersion" 
        Value="Version" 
        Variable="SMO2014x86"/> 
<util:RegistrySearch Root="HKLM" 
        Key="SOFTWARE\Microsoft\Microsoft SQL Server\SharedManagementObjects\CurrentVersion" 
        Value="Version" 
        Variable="SMO2014x64" 
        Win64="yes"/> 

<!-- Install SQL CLR Types --> 
<PackageGroup Id="SQLCLRTypes"> 
    <MsiPackage Id="SQLCLRTypesx86" 
       SourceFile=".\Resources\SQLSysClrTypes2014x86.msi" 
       ForcePerMachine="yes" 
       Cache="no" 
       Compressed="no" 
       DownloadUrl="https://download.microsoft.com/download/1/3/0/13089488-91FC-4E22-AD68-5BE58BD5C014/ENU/x86/SQLSysClrTypes.msi" 
       Permanent="no" 
       Vital="yes"     
       InstallCondition="NOT VersionNT64 AND NOT CLRTypesx86" /> 
    <MsiPackage Id="SQLCLRTypesx64" 
       SourceFile=".\Resources\SQLSysClrTypes2014x64.msi" 
       ForcePerMachine="yes" 
       Cache="no" 
       Compressed="no" 
       DownloadUrl="https://download.microsoft.com/download/1/3/0/13089488-91FC-4E22-AD68-5BE58BD5C014/ENU/x64/SQLSysClrTypes.msi" 
       Permanent="no" 
       Vital="yes" 
       InstallCondition="VersionNT64 AND NOT CLRTypesx64" /> 
</PackageGroup> 

<!-- Install System Managment Objects --> 
<PackageGroup Id="SMO2014"> 
    <MsiPackage Id="SharedManagementObjects2014x86" 
       SourceFile=".\Resources\SharedManagementObjects_x86.msi" 
       ForcePerMachine="yes" 
       Cache="no" 
       Compressed="no" 
       DownloadUrl="https://download.microsoft.com/download/1/3/0/13089488-91FC-4E22-AD68-5BE58BD5C014/ENU/x86/SharedManagementObjects.msi" 
       Permanent="yes" 
       Vital="yes" 
       InstallCondition="NOT VersionNT64 AND NOT SMO2014x86" /> 
    <MsiPackage Id="SharedManagementObjects2014x64" 
       SourceFile=".\Resources\SharedManagementObjects_x64.msi" 
       ForcePerMachine="yes" 
       Cache="no" 
       Compressed="no" 
       DownloadUrl="https://download.microsoft.com/download/1/3/0/13089488-91FC-4E22-AD68-5BE58BD5C014/ENU/x64/SharedManagementObjects.msi" 
       Permanent="yes" 
       Vital="yes" 
       InstallCondition="VersionNT64 AND NOT SMO2014x64" /> 
</PackageGroup> 
+0

SQLCLRTypes安裝是否在執行後請求重新引導?引導程序日誌應該提及是否是。日誌行如下所示:'應用執行包:SQLCLRTypesx64,結果:0x0 [或其他值],重新啓動:必需' –

+0

SQLCLRTypes不需要重新啓動,但SMO2014需要它。看起來安裝程序在安裝過程中並未刷新已安裝的軟件包。第一次運行:安裝了1- SQLCLRTypes 2- SMO2014有錯誤「缺少SQLCLRTypes」。如果我退出安裝程序並重新啓動:1- SQLCLRTypes存在,因此未安裝SMO2014安裝 –

+0

我高度懷疑SQLCRLTypes請求重新啓動,因爲SMO2014無法安裝,但可以在重新啓動後進行。僅僅因爲在安裝SQLCLRTYpes之後引導程序不重新啓動並不意味着它不需要重新啓動。引導程序的默認行爲是阻止重新啓動,直到安裝完所有程序包。您需要查看日誌並驗證SQLCLRTypes不需要重新啓動。如果確實如此,那麼我們可以強制引導程序重新啓動,然後繼續。 –

回答

1

如果您SQLCLRTypes安裝時需要重新啓動時它會通知的引導器應用,一個是需要的,但引導程序引擎將決定指出,需要重新啓動,然後繼續與安裝其他包直到安裝結束,然後最後一頁將顯示重新啓動頁面,而不是結束頁面,並將有一個重新啓動按鈕。

引導程序還支持在安裝過程中重新啓動,然後在計算機重新啓動後繼續安裝(如有必要)。我們可以使用這個函數,因爲下游軟件包依賴於SQLCLRTypes,並且直到由於最有可能使用的文件而重啓時纔會完全存在。

由於您使用的是C#,我假設您使用託管引導程序。

您需要向每個包完成後引發的OnExecutePackageComplete事件添加一個處理程序。

它可能會是這個樣子

private void ExecutePackageComplete(object sender, ExecutePackageCompleteEventArgs args) 
{ 
    if (e.Restart == ApplyRestart.RestartRequired && (e.PackageId == "SQLCLRTypesx86" || e.PackageId == "SQLCLRTypesx64")) 
    { 
     e.Result = Result.Restart 
    } 
} 

這將導致你的引導程序安裝SQLCLRTypes,而不是繼續嘗試安裝SMO後顯示重啓頁面。一旦機器重新啓動,安裝程序將自動重新啓動並恢復停止。您可能希望用一些額外的文本指出,當SQLCLRTypes需要重新啓動時,安裝將在引導程序的重新啓動頁面上重新啓動後恢復。