2015-11-20 65 views
2

對不起了很久的問題時,但我必須把儘可能多的細節,我可以幫助你理解這個問題更好。的InstallShield內部錯誤2769 - 錯誤1001安裝

我使用的是2012年的InstallShield創建的MSI安裝程序,它正常運行在大多數計算機上,但一些我得到了通用1001錯誤並在單擊該差錯一切就OK了回滾。要解決問題,我跑了下面的代碼從安裝

Setup.exe /v"/l*v \"C:\log.dat\"" 

enter image description here

的調試日誌顯示錯誤2769自定義操作xxxx.install生成的調試日誌沒有關閉1個MSIHANDLES。

雖然谷歌搜索關於這個問題,我看到有這個確切的同樣的錯誤了很多人,大部分的建議下來到檢查你的自定義操作做,因爲它是產生這種錯誤的人。

這裏是我做了什麼排查和隔離到目前爲止這個問題:

  1. 開拓的InstallShield項目,並期待在MSI deubbger,我在日誌中發現的自定義動作的名稱是一部分自定義操作InstallShield用於在安裝過程中安裝Window Service。

enter image description here

  • 我看是如何安裝該服務,它原來是InstallShield將調用作爲.NET安裝類來安裝該服務的C#可執行在組件的設置下。
  • enter image description here

    按照什麼是.NET安裝程序類?您可以從InstallShield查看以下注釋。

    enter image description here

    由於擔心自己是不是正確與我的自定義操作代碼,我把一些調試日誌,並再次運行整個安裝過程,我仍然收到了同樣的錯誤,但我沒有看到記錄任何異常。該服務實際上創建成功,我甚至可以運行它,只要我不點擊確定1001錯誤,這將觸發回滾和卸載此服務。

    public ProjectInstaller() 
        { 
         try 
         { 
          using (StreamWriter w = File.AppendText("c:\\log.txt")) 
          { 
           Log("start installing", w); 
          } 
    
          InitializeComponent(); 
    
          using (StreamWriter w = File.AppendText("c:\\log.txt")) 
          { 
           Log("End Install", w); 
          } 
    
         } 
         catch (Exception ex) 
         { 
          using (StreamWriter w = File.AppendText("c:\\log.txt")) 
          { 
           Log(ex.Message, w); 
           Log(ex.StackTrace, w); 
          } 
         } 
        } 
    
        private void InitializeComponent() 
        { 
         this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller(); 
         this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller(); 
    
         // 
         // serviceProcessInstaller1 
         // 
         this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem; 
         this.serviceProcessInstaller1.Password = null; 
         this.serviceProcessInstaller1.Username = null; 
         // 
         // serviceInstaller1 
         // 
         this.serviceInstaller1.Description = "Healthcare Platform Service"; 
         this.serviceInstaller1.ServiceName = "psService"; 
         this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic; 
         // 
         // ProjectInstaller 
         // 
         this.Installers.AddRange(new System.Configuration.Install.Installer[] { 
         this.serviceProcessInstaller1, 
         this.serviceInstaller1}); 
    
        } 
    

    根據我到目前爲止的疑難解答,我不認爲錯誤是在自定義操作代碼中。但是,這真的讓我不知所措,因爲我不知道導致自定義操作失敗的原因。它看起來像是沒有收出MSI手感,但是這的確是一個黑盒子給我.....

    因此,任何知道這可能是什麼? 我怎樣才能進一步深入到弄清楚到底什麼地方出了錯與該客戶的行動_502E509F9B6F6675DFF9C310662BC1B5.install?

    下面是自定義操作順序。

    enter image description here enter image description here enter image description here enter image description here enter image description here

    *編輯: 我發現,談到了類似的錯誤我有link ...但是我驗證了我的自定義操作沒有任何參數和基於我詳細的調試日誌,我看到所有的路徑都正確解決。

    **編輯:添加自定義操作序列的屏幕截圖。

    +0

    我見過這個錯誤是因爲服務名已經存在。 – sgmoore

    +1

    不是在我的情況下,我驗證了服務不存在...我儘可能做sc刪除只是爲了檢查是否存在任何具有相同名稱的鬼服務 – Fylix

    回答

    0

    嗯,

    這是相當有趣的。我發現了一個微軟link大約事件源

    會談默認情況下,如果卸載軟件事件源將得到移除。由於某些原因,我看不到,我認爲它不會被刪除,因爲EventMessageFile指向的文件正被使用/卸載?

    所以讀完文章上面我去,並刪除了下 電腦\ HKEY_LOCAL_MACHINE \ SYSTEM手動發現\ CURRENTCONTROLSET \服務的註冊表\事件日誌\ MyProgramName

    安裝不再給我1001錯誤後刪除了上述註冊表中。它看起來像InstallShield試圖安裝一個窗口服務,但看着這個註冊表它認爲服務已經存在(即使它不是)。

    +0

    該註冊表鍵用於在事件記錄器中創建事件源。它與服務控制管理人員的角度來看是否存在服務無關。很可能安裝程序類的C#代碼編寫得很差,並且會對機器的狀態做出某些假設,並且無法捕獲和處理異常。我以前見過很多次。最好擺脫這一切。 –

    0

    我真的需要看看這是按順序排列的。如果這是推遲並且在安裝初始化之前或者在安裝完成之後,那可能是一個問題。

    +0

    我會發布在InstallShield的VMI中看到的序列調試器......根據我的理解,我們使用InstallShield提供的默認設置。正如我前面指出的那樣,此安裝在其他機器上運行良好 – Fylix

    2

    該錯誤是由於安裝程序類的基礎結構不起作用而導致的通用錯誤。這大多是爲Visual Studio安裝項目開發的黑盒子。它使用C++ Dll調用ManagedInstall然後加載框架版本,找到你的程序集,用反射實例化你的類,然後調用Install方法。 InstallUtilLib是特定於體系結構的,它與託管代碼和框架版本之間的不匹配會導致錯誤。如果這種情況只發生在一臺機器上,可能會導致這種不匹配,或者該機器在某種程度上會因爲該服務而中斷。

    這只是可能有所幫助的信息。但是,如果您有實際的InstallShield 2012,則根本不需要安裝程序類。它們是爲Visual Studio設置而創建的,幾乎不需要其他MSI構建工具,因爲它們內置了對MSI ServiceInstall和ServiceControl表的支持。

    +0

    謝謝菲爾,你的解釋是非常有幫助的,比我能從Flexera中挖掘出來的文件更清晰:)。您是對的,我繼承的項目使用.NET安裝程序類..但對於下一個構建版本,我將轉換爲使用InstallShield的ServiceInstall功能。 – Fylix

    1

    引用Jerry MaGuire ...停下來,你讓我在1001. InstallUtil管理自定義操作必須不惜一切代價避免。第一個操作是通過使用本地Windows安裝程序功能來消除對自定義操作的需求。如果自定義操作仍然需要,則第二個操作是使用Windows Installer XML(Wix)部署工具基礎(DTF)重構。將託管代碼與MSI集成是一種更好的模式。它與InstallShield非常協調。

    IMO,InstallShield應該從未如此簡單地連接InstallUtil自定義操作。毫無疑問,他們這樣做是爲了滿足客戶的要求,並能夠輕鬆遷移到InstallShield,但卻犧牲了質量標準。

    +0

    你正在向合唱團克里斯傳道,不幸的是,這是我繼承的那些項目之一,我別無選擇,只能處理它,至少對於後面的版本。 – Fylix