2016-05-23 53 views
15

我有一個使用Visual Studio 2015開發的C++應用程序,以及一個Wix安裝程序和一個Burn引導程序。以前版本的應用程序能夠使用Visual Studio合併模塊來安裝必要的先決條件,但在使用Visual Studio 2015時(看Redistributables for deploying C++ exe developed with Visual Studio 2015 on Windows 7),似乎這不是一個選項。Wix Burn vcredist

按照該鏈接中的建議,我們已經開始使用帶有重要=「是」的ExePackage安裝vcredist和Burn。這大部分效果很好 - 我們有幾個客戶由於vcredist的各種問題而導致安裝失敗。直到最近,這些錯誤都會導致安裝失敗。

在過去的幾天裏,由於安裝了新版本的可再發行版本,我們收到了一些安裝程序失敗的報告:vcredist失敗,錯誤代碼爲0x80070666,導致引導程序失敗。

我的問題是:

  1. 正在部署vcredist 「正確」 的方法來取? (假設我們需要一個exe安裝程序)
  2. 我們怎樣才能知道安裝了哪些版本的可再發行組件(不一定在引導程序中,此信息是否以某種用戶可讀的形式存儲)?
  3. 是否有我們應該分發的可再發行的更新版本? (目前使用14.0.23026)這是基於正在使用的Visual Studio版本進行編譯還是應該始終分發最新版本? (當前VS版本14.0.23107.0)
  4. 作爲最後的手段,是否有可能檢測從vcredist返回的錯誤代碼並允許該值確定安裝是否繼續或失敗?

回答

21
  1. 部署vcredist是一種適當的方法。

  2. 您可以使用FileSearch Element (Util Extension)來搜索其中一個vcredist文件並檢索其版本。但是,這種方法很複雜,因爲內置變量SystemFolderSystem64Folder的刻錄與Windows Installer中的類似變量相反。搜索VCl 4的實施例:

    <!-- Detect existing version of VC++ 2015 x64 libraries --> 
    <util:FileSearch Id="GetVC14X64Exists" Condition="VersionNT64" Variable="vc14x64Exists" Path="[SystemFolder]vcruntime140.dll" Result="exists"/> 
    <util:FileSearch Id="GetVC14X64Version" Condition="VersionNT64" Variable="vc14x64Version" Path="[SystemFolder]vcruntime140.dll" Result="version"/> 
    
    <!-- Detect existing version of VC++ 2015 x86 libraries --> 
    <util:FileSearch Id="GetVC14X86onX64Exists" Condition="VersionNT64" Variable="vc14x86Exists" Path="[System64Folder]vcruntime140.dll" Result="exists"/> 
    <util:FileSearch Id="GetVC14X86onX64Version" Condition="VersionNT64" Variable="vc14x86Version" Path="[System64Folder]vcruntime140.dll" Result="version"/> 
    <util:FileSearch Id="GetVC14X86onX86Exists" Condition="NOT VersionNT64" Variable="vc14x86Exists" Path="[SystemFolder]vcruntime140.dll" Result="exists"/> 
    <util:FileSearch Id="GetVC14X86onX86Version" Condition="NOT VersionNT64" Variable="vc14x86Version" Path="[SystemFolder]vcruntime140.dll" Result="version"/> 
    

    變量vc14x64Existsvc14x64Version然後可以在DetectCondition被用於制定出是否安裝VCl 4的64位的版本:

    DetectCondition="vc14x64Exists AND vc14x64Version &gt;= v14.0.nnnnn" 
    

    類似地DetectCondition爲VCl 4的32位版本:

    DetectCondition="vc14x86Exists AND vc14x86Version &gt;= v14.0.nnnnn" 
    

    注:在這兩種情況下,您都需要用您的安裝程序中包含的vcredist的內部版本號替換nnnnn

    編輯1:作爲替代,你可以使用升級代碼搜索作爲檢測概述here VC的Redist的存在。

    編輯2:在我編寫的安裝程序中,我通常不會嘗試檢測VC Redist的存在。相反,我讓VC Redist安裝程序運行,讓自己弄清楚是安裝,升級還是什麼也不做。

  3. 迄今爲止我已經找到了VCl 4 REDIST文件的三個版本:

    一)14.0.23026 - 下載從微軟的鏈接here

    b)14.0.23506 - 隨提供Visual Studio 2015更新1

    c)14.0.23918 - 提供了Visual Studio 2015 Update 2

    儘管vcredist的較新版本已隨Visual Studio更新發布,但Microsoft並未從其網站更新可下載的版本。

  4. 您可以使用<ExitCode Value="1638" Behavior="success"/>來告訴burn忽略已安裝的錯誤代碼0x80070666。請注意,1638 = 0x666。例如:

    <!-- Microsoft Visual C++ 2015 x86 libraries --> 
    <PackageGroup Id="VC14RedistX86"> 
        <ExePackage 
        Cache="no" 
        Compressed="yes" 
        PerMachine="yes" 
        Permanent="yes" 
        Vital="yes" 
        Name="Redist\vcredist14_x86.exe" 
        SourceFile="$(var.RedistPath)\VC14\vcredist_23918_x86.exe" 
        InstallCommand="/install /quiet /norestart"> 
    
        <!-- --> 
        <ExitCode Value="3010" Behavior="forceReboot"/> 
    
        <!-- Ignore "Newer version installed" error --> 
        <ExitCode Value="1638" Behavior="success"/> 
        </ExePackage> 
    </PackageGroup> 
    

我遇到了類似的問題,最近在那裏一個產品安裝我正在用錯誤0x80070666停止。問題是已安裝vcredist的較新版本。我最終使用的解決方案是:a)包含vcredist的最新版本(14.0.23918); b)添加<ExitCode Value="1638" Behavior="success"/>指令,告訴burn如果已經安裝了未來較新版本的vcredist,則不會拋出錯誤。

+0

太棒了!爲了澄清 - 迄今爲止我們的非正式測試沒有遇到任何問題,即針對針對舊版本編譯的可執行文件(即,我們尚未升級到Visual Studio 2015更新1或2)使用新版本的可再發行組件。這是保證是這種情況,還是我們需要升級Visual Studio之前,我們開始運送新的可再分發? – Runt8

+1

在我的測試中,我沒有發現運行vcredist早期版本的計算機上已安裝vcredist的新版本生成的產品的任何問題。但是,不能保證vcredist的未來版本不會破壞某些東西。我傾向於使用vcredist的最新版本,假設最新版本具有最新的錯誤和安全修補程序等。 – bradfordrg

+0

是否存在可以讀取的註冊表項,以確定當前安裝的版本並將其用作installcondition爲exepackage? 「InstallCondition」 http://wixtoolset.org/documentation/manual/v3/xsd/wix/exepackage.html – tollgen

2

檢測到您需要通過其UpgradeCode進行搜索的vcredist包的存在。
這將確保發現更新的版本。

在wix刻錄引導程序中使用util:ProductSearchUpgradeCode參數。 ,然後在DetectCondition中指定最低版本。

查看全部資料看這個回答:https://stackoverflow.com/a/35889484

+0

當前版本是通過燒錄包部署的,它們有不同的包ID。 'util:ProductSearch'目前 –