1

我有一个扩展 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 属性。

4

1 回答 1

1

安装程序类自定义操作超出进程,无法直接访问 MSI 句柄和任何相关功能,例如获取/设置属性和日志记录。

解决方案是改用 Windows Installer XML Deployment Tools Foundation 自定义操作 (google WiX DTF)。对于托管代码自定义操作来说,这是一种更好的模式,并且会简单地更改托管模型并为您提供一个 Session 类以便能够与 MSI 对话。然后,您的其余代码应该适合该框。

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

See these blog articles for ideas on how to create a WiX merge module that uses the EventSource extension and ServiceInstall / ServiceControl elements to do all this work without any custom actions at all. This creates a merge module that can then be added to your Visual Studio Deployment project.

Redemption of Visual Studio Deployment Projects

Augmenting InstallShield using Windows Installer XML - Certificates

and finally why it's important that you do this:

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

于 2012-08-30T14:30:42.120 回答