2011-01-17 2 views
6

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

Можно ли отслеживать изменения конфигурационного файла с помощью FileSystemWatcher и запускать новый экземпляр приложения, закрывая текущий?

что-то вроде:

var file = new FileInfo(AppDomain.CurrentDomain. 
SetupInformation.ConfigurationFile); 

    var watcher = new FileSystemWatch(file.Directory.FullName) 
         { 
          Filter = "...", 
          NotifyFilter = NotifyFilter.LastWrite } 
        ); 

    watcher.Changed += .. // Process.Start(..), current process shutdown 
    watcher.EnableRaisingEvents = true; 

ответ

2

Вы можете запустить фактическую логику приложения в отдельном AppDomain. Первоначальный (или по умолчанию) AppDomain будет использоваться только для (a) запуска потока с помощью наблюдателя файловой системы и (b) запуска логики приложения в отдельном AppDomain. Ключ состоит в том, что при создании AppDomain вы можете передать путь к файлу конфигурации.

Когда вы определяете изменение в файле конфигурации, вы останавливаете свою логику приложения (что бы это ни значило в вашем случае - и это действительно сложная часть!) И выгрузите приложение AppDomain, а затем перезапустите его, в котором будет использоваться обновленный Файл конфигурации.

1

Стандартная конфигурация Применения .NET не позволяет динамические обновлений, насколько я знаю. Но если бы я был вами, я бы предпочел написать свой собственный класс конфигурации приложения, который читает xml или любой другой конфиг, следит за изменениями этого конфигурационного файла, и если что-то изменится, мой собственный класс будет динамически перезагружать конфигурационный файл. Если это возможно, оно должно быть намного более элегантным, чем убийство и запуск новых процессов.

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

+0

Спасибо Matten, но мой собственный файл конфигурации не поможет мне, поскольку я хочу закрыть приложение (освободите все ресурсы, которые у него есть, а не только для обновления данных конфигурации) –

1

Я не уверен в Asp.net, но, возможно, вы можете загрузить свое приложение в другой AppDomain и при изменении конфигурации Перезагрузите домен. Это будет в основном повторная инициализация вашего приложения новыми настройками.

Вот как можно это сделать:

  AppDomainSetup setup = new AppDomainSetup() 
      { 
       ApplicationBase = AppDomain.CurrentDomain.BaseDirectory, 
       // ... maybe more options can go here, inspect the class and see your options 
      }; 

      domain = AppDomain.CreateDomain("MyDomainName", null, setup); 
      domain.UnhandledException += new UnhandledExceptionEventHandler(domain_UnhandledException); 
      MyApplication app = (MyApplication)domain.CreateInstanceFromAndUnwrap("assemblyfilename.dll", "The_Type_Name.MyApplication"); 
      app.Launch(); 
1

Когда отладчик помнит, что Visual Studio запускает XXX.vshost.exe, а не XXX.exe, поэтому вам нужно смотреть другой файл при отладке.

FileSystemWatch - это простой бит, вам нужно использовать 2-й домен приложения для запуска вашего основного приложения или приложения «launcher» или получить приложение для вызова Process.Start() самостоятельно, когда ему нужно перезапуск. Проверка ошибок - это то, что делает это трудным ...

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