2011-01-31 7 views
1

Я пытаюсь установить программу программно через C#, но у меня возникла проблема, с которой я не могу обойтись.Установка программного обеспечения Windows программно

После прочтения загрузок документации я нахожусь в том месте, где, как я полагаю, у Microsoft есть ошибка (но мы все знаем, что это не так).

Так вот Main моей заявки.

static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; 
    if (System.Environment.UserInteractive) 
    { 
     string parameter = string.Concat(args); 
     switch (parameter) 
     { 
      case "/install": 
       ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location }); 
       Console.Read(); 
       break; 
      case "/uninstall": 
       ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location }); 
       break; 
     } 
    } 
    else 
    { 
     ServiceBase.Run(new ProxyMonitor()); 
    } 
} 

При выполнении в УМК под правами администрирования, как так ProxyMonitor /install шаг в идет вниз к линии:

ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location }); 

, как ожидалось, а затем выпрыгивает в мой установки класса как так:

namespace Serco.Services.ProxyMonitor 
{ 
    [RunInstaller(true)] 
    public class ManagedInstallation : ServiceInstaller 
    { 
     public ManagedInstallation() 
     { 
      var ProcessInstaller = new ServiceProcessInstaller(); 
      var ServiceInstaller = new ServiceInstaller(); 

      //set the information and privileges 
      ProcessInstaller.Account  = ServiceConfiguration.AccountType; 
      ServiceInstaller.DisplayName = ServiceConfiguration.DisplayName; 
      ServiceInstaller.StartType  = ServiceConfiguration.StartType; 
      ServiceInstaller.Description = ServiceConfiguration.Description; 
      ServiceInstaller.ServiceName = ServiceConfiguration.ServiceName; 

      Installers.Add(ProcessInstaller); 
      Installers.Add(ServiceInstaller); 
     } 
    } 
} 

После проверки файла отладки я получаю следующее:

Installing assembly 'C:\Users\Robert\documents\visual studio 2010\Projects\ProxyMonitor\ProxyMonitor\bin\Debug\ProxyMonitor.exe'. 
Affected parameters are: 
    logtoconsole = 
    logfile = C:\Users\Robert\documents\visual studio 2010\Projects\ProxyMonitor\ProxyMonitor\bin\Debug\ProxyMonitor.InstallLog 
    assemblypath = C:\Users\Robert\documents\visual studio 2010\Projects\ProxyMonitor\ProxyMonitor\bin\Debug\ProxyMonitor.exe 
Installing service ... 
Creating EventLog source in log Application... 
Rolling back assembly 'C:\Users\Robert\documents\visual studio 2010\Projects\ProxyMonitor\ProxyMonitor\bin\Debug\ProxyMonitor.exe'. 
Affected parameters are: 
    logtoconsole = 
    logfile = C:\Users\Robert\documents\visual studio 2010\Projects\ProxyMonitor\ProxyMonitor\bin\Debug\ProxyMonitor.InstallLog 
    assemblypath = C:\Users\Robert\documents\visual studio 2010\Projects\ProxyMonitor\ProxyMonitor\bin\Debug\ProxyMonitor.exe 
Restoring event log to previous state for source . 

я получаю исключение, брошенное в следующем вызове:

ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location }); 

Заявив:

установка не удалась, и откат была выполнена. Необходимо указать значение для источника.

Любые идеи?


Обновление:

Конфигурация класс

namespace Serco.Services.ProxyMonitor 
{ 
    class ServiceConfiguration 
    { 
     public static string DisplayName 
     { 
      get { return "Serco Proxy Monitor"; } 
     } 

     public static string ServiceName 
     { 
      get { return "Serco Proxy Monitor"; } 
     } 

     public static string Description 
     { 
      get 
      { 
       return "Serco ProxyMonitor is a helper developed to manage the state of the proxy for the employess whilst of the internal network."; 
      } 
     } 

     public static ServiceStartMode StartType 
     { 
      get{return ServiceStartMode.Automatic;} 
     } 

     public static ServiceAccount AccountType 
     { 
      get{return ServiceAccount.LocalSystem;} 
     } 

     /*.. /Snip/ ..*/ 
    } 
} 
+0

Вы работаете с правами администратора? Кроме того, вероятно, это поможет, если вы создадите проект и установщик Windows, чтобы узнать, какой именно код сгенерирован, это будет то, что вы пытаетесь написать вручную, хотя, вероятно, организовано по-другому. –

+0

Я зарегистрировался как администратор, а также заявил, что я работал в режиме администратора, и я начал работать как проект Blank в VS 2010. – RobertPitt

ответ

2

Это выглядит как источник журнала является недействительным; вы уверены, что ServiceConfiguration.ServiceName определено и имеет значение?

+0

Да, я уверен, я добавил класс конфигурации в OP – RobertPitt

+0

. Это привело к правильному ответ, поэтому я буду отмечать его как правильно. – RobertPitt

4

Я понял это и думал, что я отправлю сообщение, другие могут иметь ту же проблему.

Это была комбинация из нескольких вещей, но плохо только быстро показать вам их:

public static string ServiceName 
{ 
    get { return "Serco Proxy Monitor"; } 
} 
  • бы стать return "SercoProxyMonitor"; из-за пространства
  • Убрано UnhandledException который затем показал более в стеке глубины следы
  • Необходимо иметь полные права администратора.

Я думаю, что главный вопрос заключается в том, что ServiceInstaller использовал ServiceName для создания и EventLogSource, а также были пробелы в EventLogSource он бросает истерику.

+0

Права администратора сделали это для меня. Tyvm –

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