2015-11-20 37 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