2016-09-20 77 views
1

遇到版本號問題。WiX錯誤確定以前的軟件包版本

我們曾經爲我們的客戶端安裝程序使用Installshield。自從切換到WiX之後,我們已經「修復」了一些東西,比如版本編號方案。我們過去使用x.x.x-y,但是WiX不允許「 - 」成爲版本#的一部分。

當我嘗試更新使用「虛線」版本號的舊安裝的產品,安裝停止(它甚至大幹快前)與:

[09A4:1908][2016-09-20T09:20:34]e000: Error 0x80070057: Failed to convert version: 5.3.0-7 to DWORD64 for ProductCode: {...} 
[09A4:1908][2016-09-20T09:20:34]e151: Detect failed for package: Client_MSI, error: 0x80070057 

該錯誤在導致發動機不能觸發OnDetectMsiFeature,但是,發動機確實出現了認識,不知何故,約特點:

[09A4:1908][2016-09-20T09:20:34]i000: WixWPF: Enter Method: OnDetectPackageComplete 
[09A4:1908][2016-09-20T09:20:34]i000: WixWPF: Leaving Method: OnDetectPackageComplete 
[09A4:1908][2016-09-20T09:20:34]i101: Detected package: NetFx40Web, state: Present, cached: None 
[09A4:1908][2016-09-20T09:20:34]i101: Detected package: vcredist2015x64, state: Present, cached: Complete 
[09A4:1908][2016-09-20T09:20:34]i101: Detected package: vcredist2015x86, state: Present, cached: None 
[09A4:1908][2016-09-20T09:20:34]i101: Detected package: Client_MSI, state: Unknown, cached: None 
[09A4:1908][2016-09-20T09:20:34]i104: Detected package: Client_MSI, feature: FeatureA, state: Unknown 
[09A4:1908][2016-09-20T09:20:34]i104: Detected package: Client_MSI, feature: FeatureB, state: Unknown 
... 
[09A4:1908][2016-09-20T09:20:34]i000: WixWPF: Enter Method: OnDetectComplete 

UPDATE

我跟蹤了dutil \ fileutil.cpp版本號的問題。我將444行的支票更改爲:

while (wzPartEnd < wzEnd && ((L'.' != *wzPartEnd) 
         && (L'-' != *wzPartEnd))) 

以接受「 - 」作爲版本分隔符。現在,新的引導程序加載,但狀態檢測有問題。當它「看到」包裝和功能時,它將「全部」視爲「缺席」。

[0280:1050][2016-09-20T12:36:05]i103: Detected related package: {...}, scope: PerMachine, version: 5.3.0.7, language: 0 operation: MajorUpgrade 
[0280:1050][2016-09-20T12:36:05]i000: WixWPF: Enter Method: OnDetectRelatedMsiPackage 
[0280:1050][2016-09-20T12:36:05]i000: WixWPF: Leaving Method: OnDetectRelatedMsiPackage 
[0280:1050][2016-09-20T12:36:05]i000: WixWPF: Enter Method: OnDetectMsiFeature 
[0280:1050][2016-09-20T12:40:42]i000: WixWPF: Leaving Method: OnDetectMsiFeature 
... 
[0280:1050][2016-09-20T12:41:04]i000: WixWPF: Enter Method: OnDetectPackageComplete 
[0280:1050][2016-09-20T12:41:07]i000: WixWPF: Leaving Method: OnDetectPackageComplete 
[0280:1050][2016-09-20T12:41:07]i101: Detected package: NetFx40Web, state: Present, cached: None 
[0280:1050][2016-09-20T12:41:07]i101: Detected package: vcredist2015x64, state: Present, cached: Complete 
[0280:1050][2016-09-20T12:41:07]i101: Detected package: vcredist2015x86, state: Present, cached: None 
[0280:1050][2016-09-20T12:41:07]i101: Detected package: Client_MSI, state: Absent, cached: None 
[0280:1050][2016-09-20T12:41:07]i104: Detected package: Client_MSI, feature: LunaClient, state: Absent 
[0280:1050][2016-09-20T12:41:07]i104: Detected package: Client_MSI, feature: FeatureB, state: Absent 

所以,我的新問題是:

  1. 爲什麼老包和功能選擇列表中的所有標記爲不存在?
  2. 我可以從此恢復嗎?

回答

0

更新了一個月後,我得到它的工作。我發現我需要掛鉤另一個事件,DetectRelatedMsiPackage。我發現this issue and associated code,該海報還跟分享和我能夠適應我的需要,具體如下:

public override void OnDetectRelatedMsiPackage(WPFBootstrapperEventArgs<Wix.DetectRelatedMsiPackageEventArgs> e) 
{ 
    var existingPackageProductCode = e.Arguments.ProductCode; 
    var existingPackageId = e.Arguments.PackageId; 

    if (existingPackageId != HSMClientPackageID) 
    { 
     return; 
    } 

    InstallData.RelatedOperation = e.Arguments.Operation; 
    if (InstallData.RelatedOperation == Wix.RelatedOperation.MajorUpgrade) 
    { 
     //requires reference to WiX Toolset\SDK\Microsoft.Deployment.WindowsInstaller.dll 
     var installedPackage = new ProductInstallation(existingPackageProductCode); 
     if (!installedPackage.IsInstalled) 
     { 
      //Log(string.Format("Migrating Package {0}, which is not installed, so marking it and it's features as Absent", existingPackageId)); 
      _packageStates[existingPackageId] = Wix.PackageState.Absent; 
     } 
     else 
     { 
      //Log(string.Format("Migrating features for MajorUpgrade of Package {0}", existingPackageId)); 

      _packageStates[existingPackageId] = Wix.PackageState.Present; 

      foreach (var currentInstallFeature in installedPackage.Features) 
      { 
       switch (currentInstallFeature.State) 
       { 
        case InstallState.Local: 
         //Log(string.Format("Migrating feature {1} of Package {0} - marking as Present", existingPackageId, currentInstallFeature.FeatureName)); 
         _featureStates[currentInstallFeature.FeatureName] = Wix.FeatureState.Local; 
         break; 
        case InstallState.Absent: 
         //Log(string.Format("Migrating feature {1} of Package {0} - marking as Absent", existingPackageId, currentInstallFeature.FeatureName)); 
         _featureStates[currentInstallFeature.FeatureName] = Wix.FeatureState.Absent; 
         break; 
        default: 
         //Log(string.Format("Migrating feature {1} of Package {0} - marking as Unknown", existingPackageId, currentInstallFeature.FeatureName)); 
         _featureStates[currentInstallFeature.FeatureName] = Wix.FeatureState.Unknown; 
         break; 
       } 
      } 
     } 
    } 
} 
+1

莫非[這](http://stackoverflow.com/a/17559524/3625900 )是原始代碼? –

+0

是的,我相信就是這樣! – Jon