2012-06-28 3 views
1

У меня есть следующий код, но, хотя я могу получить доступ к свойству и получить значениеразвертывания: this.Context.Parameters не доступен в течение процесса установки

this.Context.Parameters["SERVICENAME"] 

в BeforeInstall те же возвращает свойство «» в OnCommitted.

Куда уходят эти данные, как они стираются, где я могу найти разбивку порядка каждого из этих методов и что передается где?

[RunInstaller(true)] 
    public partial class ProjectInstaller : System.Configuration.Install.Installer 
    { 

     public string ServiceName { get; protected set; } 

     /// <summary> 
     /// 
     /// </summary> 
     public ProjectInstaller() 
     { 
      InitializeComponent(); 
     } 

     /// <summary> 
     /// 
     /// </summary> 
     /// <param name="savedState"></param> 
     protected override void OnBeforeInstall(IDictionary savedState) 
     { 
      base.OnBeforeInstall(savedState); 
      this.ServiceName = this.Context.Parameters["SERVICENAME"].ToString(); 
      this.serviceInstaller1.ServiceName = this.ServiceName; 
      this.serviceInstaller1.DisplayName = this.ServiceName; 
     } 

     /// <summary> 
     ////
     /// </summary> 
     /// <param name="savedState"></param> 
     protected override void OnCommitted(IDictionary savedState) 
     { 
      base.OnCommitted(savedState); 
      string targetDirectory = Path.GetDirectoryName(Context.Parameters["AssemblyPath"]); ; 
      string path = System.IO.Path.Combine(targetDirectory, "Services.Win32.exe.config"); 
      System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument(); 
      xDoc.Load(path); 
      System.Xml.XmlNode node = xDoc.SelectSingleNode("/configuration/applicationSettings/Services.Win32.Properties.Settings/setting[@name='TaskManagerServiceName']/value"); 
      node.InnerText = (this.ServiceName); // here this.ServiceName is "" so was this.Context.Parameters[""SERVICENAME"] when i was using that 
      xDoc.Save(path); 
     } 

ответ

1

Самое простое, чистое и надежное решение состоит в том, чтобы не использовать специальные действия класса установщика для установки службы. Используйте встроенный установщик Windows в mechansim: таблицу ServiceInstall.

Проблема в том, что вы, вероятно, используете проекты развертывания Visual Studio, которые не раскрывают эту возможность. Нет проблем. Используйте XML установщика Windows для создания модуля объединения, который инкапсулирует компонент XE/Service. Затем добавьте этот модуль слияния в установщик VDPROJ.

Смотрите следующие статьи для идей о том, как подключить это вверх:

Augmenting InstallShield using Windows Installer XML - Certificates

Augmenting InstallShield using Windows Installer XML - Windows Services

Redemption of Visual Studio Deployment Projects

3

Я наткнулся на этот вопрос при попытке добавить дополнительный параметр к существующему развертыванию проект. Параметр был передан установщику, но не был видимым в Context.Parameters. Оказывается, что параметры, которые должны быть доступны, должны быть добавлены к «пользовательским действительным данным» этого пользовательского действия.

Вы можете достичь этого, щелкнув правой кнопкой мыши проект .vdproj и выбрав «Вид -> Пользовательские действия». Оттуда вы можете найти основные результаты своего пользовательского действия. При щелчке правой кнопкой мыши на основном выводе на требуемом этапе (установка, фиксация, откат или удаление) и выбор свойств вы можете редактировать «данные пользовательских действий» для этого шага. Вы можете найти формат этого свойства here.

Надеюсь, что это сэкономит время, так как мне потребовалось некоторое время, чтобы понять это.

Смежные вопросы