Я получаю исключения при попытке использовать пользовательские разделы 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;
Но я получил тот же результат, что и третья попытка.
Любые советы о том, как получить эту работу, будем очень благодарны. Дайте мне знать, если мне нужно предоставить дополнительную информацию.
Монитор процесса, вероятно, будет полезным диагностическим инструментом, чтобы узнать, будет ли он работать.NET открывает правильный файл конфигурации, а если не то, что он делает неправильно. Вы можете загрузить его с веб-сайта Microsoft. –
Катастрофа произошла ... мой компьютер разбился ... извините за задержку. Наконец вернулся к этому. Process Monitor показывает, что он попадает в правый файл, но он неправильно считывает применяемые настройки. Он имеет CREATE, READ, READ, CLOSE для файла C: \ BTR \ Source \ Evolution.Service \ BTR.Evolution.Service \ bin \ Debug \ BTR.Evolution.Service.exe.config, но любые изменения настроек, которые я там вставляю не читаются. Это то, что вы хотели, чтобы я подтвердил? – Terry
Я не уверен, что я думал, точно, но хорошо знать, что он определенно читает файл, который вы ожидали от него. Вы пытались запустить тот же конструктор с тем же конфигурационным файлом, но как обычную программу, а не службу? Это может быть так просто, как синтаксическая ошибка в файле конфигурации. –