2016-10-01 7 views
1

Я получаю исключения при попытке использовать пользовательские разделы app.config в моей службе Windows. Я написал пользовательские разделы в других приложениях успешно, так что я уверен, что у меня есть механика, и что-то происходит, когда задействованы службы Windows. Я могу включить app.config Xml, если это необходимо.C# Служба Windows не может использовать GetSection() с настраиваемым ConfigurationSection

Первая попытка

У меня есть следующий код в конструкторе C# Windows службы:

int systemErrorWindowSeconds = 
    ServiceSettings.Current.ExceptionHandling.SystemErrorWindowSeconds; 

И ServiceSettings (важные биты) выглядит следующим образом:

public class ServiceSettings : ConfigurationSection 
{ 
    private static ServiceSettings settings; 

    static ServiceSettings() 
    { 
     var config = 
      ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

     settings = config.GetSection("serviceSettings") as ServiceSettings; 
    } 

    public static ServiceSettings Current { get { return settings; } } 

Когда Я пытаюсь получить доступ к ServiceSettings.Current Я получаю следующее исключение:

Application: BTR.Evolution.Service.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.Configuration.ConfigurationErrorsException 
    at System.Configuration.BaseConfigurationRecord.EvaluateOne(System.String[], System.Configuration.SectionInput, Boolean, System.Configuration.FactoryRecord, System.Configuration.SectionRecord, System.Object) 
    at System.Configuration.BaseConfigurationRecord.Evaluate(System.Configuration.FactoryRecord, System.Configuration.SectionRecord, System.Object, Boolean, Boolean, System.Object ByRef, System.Object ByRef) 
    at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(System.String, Boolean, Boolean, Boolean, Boolean, System.Object ByRef, System.Object ByRef) 
    at System.Configuration.Configuration.GetSection(System.String) 
    at BTR.Evolution.Service.ServiceSettings..cctor() Exception Info: System.TypeInitializationException 
    at BTR.Evolution.Service.ServiceSettings.get_Current() 
    at BTR.Evolution.Service.EvolutionService..ctor(System.String[]) 
    at BTR.Evolution.Service.Program.Main(System.String[]) 

Вторая попытка:

Я изменил свой класс ServiceSettings использовать GetSection как:

static ServiceSettings() 
{ 
    settings = ConfigurationManager.GetSection("serviceSettings") as ServiceSettings; 
} 

я получаю следующее исключение (в основном такой же, как и выше, но использует ConfigurationManager и еще несколько GetSectionRecursive звонков)

Application: BTR.Evolution.Service.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: 
    System.Configuration.ConfigurationErrorsException 
    at System.Configuration.BaseConfigurationRecord.EvaluateOne(System.String[], System.Configuration.SectionInput, Boolean, System.Configuration.FactoryRecord, System.Configuration.SectionRecord, System.Object) 
    at System.Configuration.BaseConfigurationRecord.Evaluate(System.Configuration.FactoryRecord, System.Configuration.SectionRecord, System.Object, Boolean, Boolean, System.Object ByRef, System.Object ByRef) 
    at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(System.String, Boolean, Boolean, Boolean, Boolean, System.Object ByRef, System.Object ByRef) 
    at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(System.String, Boolean, Boolean, Boolean, Boolean, System.Object ByRef, System.Object ByRef) 
    at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(System.String, Boolean, Boolean, Boolean, Boolean, System.Object ByRef, System.Object ByRef) 
    at System.Configuration.BaseConfigurationRecord.GetSection(System.String) 
    at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(System.String) 
    at System.Configuration.ConfigurationManager.GetSection(System.String) 
    at BTR.Evolution.Service.ServiceSettings..cctor() Exception Info: System.TypeInitializationException 
    at BTR.Evolution.Service.ServiceSettings.get_Current() 
    at BTR.Evolution.Service.EvolutionService..ctor(System.String[]) 
    at BTR.Evolution.Service.Program.Main(System.String[]) 

Третья попытка

Я изменил свой ServiceSettings конструктор попробовать:

var customConfig = 
    ConfigurationManager.OpenExeConfiguration(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); 

settings = customConfig.GetSection("serviceSettings") as ServiceSettings; 

И я получил следующее исключение. В основном, переменная настроек была назначена на null (отсутствие «диспетчера конфигурации»), поэтому вызывающий объект, использующий объект, получает нулевое исключение.

Application: BTR.Evolution.Service.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.NullReferenceException 
    at BTR.Evolution.Service.EvolutionService..ctor(System.String[]) 
    at BTR.Evolution.Service.Program.Main(System.String[]) 

Final Покушение

Я изменил свой ServiceSettings конструктор, чтобы попытаться использовать сборочный resovler.

Func<object, ResolveEventArgs, System.Reflection.Assembly> getAssembly = 
    (sender, args) => typeof(ServiceSettings).Assembly; 

var resolveHandler = new System.ResolveEventHandler(getAssembly); 

AppDomain.CurrentDomain.AssemblyResolve += resolveHandler; 

var customConfig = 
    ConfigurationManager.OpenExeConfiguration(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); 

settings = customConfig.GetSection("serviceSettings") as ServiceSettings; 

AppDomain.CurrentDomain.AssemblyResolve -= resolveHandler; 

Но я получил тот же результат, что и третья попытка.

Любые советы о том, как получить эту работу, будем очень благодарны. Дайте мне знать, если мне нужно предоставить дополнительную информацию.

+0

Монитор процесса, вероятно, будет полезным диагностическим инструментом, чтобы узнать, будет ли он работать.NET открывает правильный файл конфигурации, а если не то, что он делает неправильно. Вы можете загрузить его с веб-сайта Microsoft. –

+0

Катастрофа произошла ... мой компьютер разбился ... извините за задержку. Наконец вернулся к этому. Process Monitor показывает, что он попадает в правый файл, но он неправильно считывает применяемые настройки. Он имеет CREATE, READ, READ, CLOSE для файла C: \ BTR \ Source \ Evolution.Service \ BTR.Evolution.Service \ bin \ Debug \ BTR.Evolution.Service.exe.config, но любые изменения настроек, которые я там вставляю не читаются. Это то, что вы хотели, чтобы я подтвердил? – Terry

+1

Я не уверен, что я думал, точно, но хорошо знать, что он определенно читает файл, который вы ожидали от него. Вы пытались запустить тот же конструктор с тем же конфигурационным файлом, но как обычную программу, а не службу? Это может быть так просто, как синтаксическая ошибка в файле конфигурации. –

ответ

0

Хм, немного смущен. Я сделал новое консольное приложение, как предполагалось, используя тот же код и настройки, и он сработал. Так что повторно осмотрел мою службу Windows, и я пытался использовать собственный распознаватель сборок, чтобы найти файл/раздел конфигурации. Я предполагаю, что когда я писал службу изначально, у меня были проблемы, и я пробовал этот настраиваемый resolver (который все еще не работал). Вот когда я разместил этот вопрос. Но для этого я вернул только стандартный механизм ConfigurationManager.GetSection (второй метод сверху), чтобы получить пользовательский раздел, и он сработал. Не может это объяснить

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

  • Нет связанных вопросов^_^