从安装程序帮助程序类中访问MSI属性

时间:2012-08-30 06:00:13

标签: .net-4.0 wix windows-installer

我有一个扩展System.Configuration.Install.Installer,它在我们的应用程序的安装时间运行。我需要访问MSI文件中设置的一些属性(例如INSTALLDIR,以及我需要检索的其他一些路径)。有没有办法从帮助程序集中访问MSI属性?

值得注意的是,我们的安装程序是使用WiX 3.5构建的。

提前感谢您提供任何帮助。

编辑这是我们班上的当前代码。

[RunInstaller(true)]
   public class MxServeInstaller : Installer
   {
      private ServiceInstaller myServiceInstaller;
      private ServiceProcessInstaller myServiceProcessInstaller;

      public MyProductInstaller()
      {
         this.myServiceInstaller = new ServiceInstaller();
         this.myServiceInstaller.StartType = ServiceStartMode.Automatic;
         this.myServiceInstaller.ServiceName = MyProduct.SERVICE_NAME;
         this.myServiceInstaller.Description = "Provides software copy protection and token pool management services for the Mx-Suite from Company";
         this.myServiceInstaller.ServicesDependedOn = new string[] { "Crypkey License" };

         Installers.Add(this.myServiceInstaller);

         this.myServiceProcessInstaller = new ServiceProcessInstaller();
         this.myServiceProcessInstaller.Account = ServiceAccount.LocalSystem;         
         Installers.Add(this.myServiceProcessInstaller);
      }

      public override void Install(System.Collections.IDictionary stateSaver)
      {
         base.Install(stateSaver);
         ServiceController controller = new ServiceController(MyProduct.SERVICE_NAME);
         try
         {
            controller.Start();
         }
         catch( Exception ex )
         {
            string source = "My-Product Installer";
            string log = "Application";
            if (!EventLog.SourceExists(source))
               EventLog.CreateEventSource(source, log);

            EventLog eventLog = new EventLog();
            eventLog.Source = source;
            eventLog.WriteEntry(string.Format("Failed to start My-Product!{1}", ex.Message), EventLogEntryType.Error);
         }
      }
   }

我计划添加的是AfterInstall的一个阶段,它至少需要知道安装程序中设置的INSTALLDIR属性。

1 个答案:

答案 0 :(得分:1)

安装程序类自定义操作不在进程中,并且无法直接访问MSI句柄以及任何相关的函数,如获取/设置属性和日志记录。

解决方案是使用Windows Installer XML部署工具基础自定义操作(google WiX DTF)。对于托管代码自定义操作,这是一个更好的模式,只需更改托管模型并为您提供一个能够与MSI通信的Session类。然后你的其余代码应该适合这个框。

但是,更多要点....我在自定义操作中看不到任何实际需要自定义操作的内容。您真正的问题是Visual Studio部署项目隐藏了MSI内置的创建和启动Windows服务的能力。

请参阅这些博客文章,了解如何创建使用EventSource扩展和ServiceInstall / ServiceControl元素的WiX合并模块,以完成所有这些工作,而无需任何自定义操作。这将创建一个合并模块,然后可以将其添加到Visual Studio部署项目中。

Redemption of Visual Studio Deployment Projects

Augmenting InstallShield using Windows Installer XML - Certificates

最后为什么这样做非常重要:

Zataoca: Custom actions are (generally) an admission of failure.