System.EnterpriseServices.RegistrationHelper не выпускает файл

Мы разработали небольшую оснастку MMC, которая устанавливает различные компоненты приложения. В частности, он регистрирует сборки .NET в COM + с помощью System.EnterpriseServices.RegistrationHelper. Логика проста: сначала удалите существующую сборку, затем скопируйте новый файл, а затем установите новую сборку. Код выглядит так:

if (File.Exists(destination))
{
   try
    {
       new RegistrationHelper().UninstallAssembly(destination, ComPlusHelper.ApplicationName);
    }
    catch (Exception ex)
    {
        Log.LogError(...);
    }
}
File.Copy(source, destination, true);

Однако при вызове File.Copy возникает ошибка «Процесс не может получить доступ к файлу xxxx, потому что он используется другим процессом». Я провел день за чтением MSDN и поиском в Google, но не нашел решения.

У кого-нибудь есть предложения?


person rmamedov    schedule 17.11.2009    source источник


Ответы (1)


Если приложение COM + запущено, оно продолжит держать файл открытым. Каждый раз, когда вы хотите удалить компоненты, вы должны отключить и закрыть приложение при удалении компонента, а затем снова включить приложение.

Для этого вы должны использовать семейство интерфейсов ICOMAdminCatalog или ICOMAdminCatalog2. Любая поисковая система найдет множество примеров выполнения следующих задач на VBScript. Мне неизвестны какие-либо проекты оболочек .NET для администрирования COM +.

Логика, которую я считаю лучшей практикой:

  1. Отключить приложение
  2. Закройте приложение
  3. Отслеживайте и ждите, пока активные вызовы отключатся
  4. Удалить компонент
  5. Включите приложение

Вы также можете запустить приложение, но оно должно запуститься автоматически при следующем вызове приложения.

Каждый из этих шагов использует разные аспекты классов администрирования, и некоторые из них уже решены в виде индивидуальных ответов.

Организация

Прежде чем писать код администрирования COM +, вы должны понять иерархию системы. В Microsoft это хорошо задокументировано: http://msdn.microsoft.com/en-us/library/windows/desktop/ms687763%28v=vs.85%29.aspx

Отключение

Вам нужно будет получить приложение из коллекции приложений. Устанавливаемое свойство - IsEnabled. Не забудьте сохранить изменения после изменения свойства.

Выключение

Вот хороший ответ: Как перезапустить приложение COM + на удаленном сервере из .NET?

Вызвать ShutdownApplication для не запущенного приложения безопасно.

Мониторинг

Вам нужно будет найти приложение в коллекции ApplicationInstances. Если он не найден, значит, он, должно быть, отключился (или вообще никогда не работал). Если он обнаружен, перестаньте спать в течение приемлемого периода времени и снова найдите его в обновленном экземпляре коллекции.

Удалить / переустановить

Эта часть у вас уже решена.

Включение

Процесс включения такой же, как и при отключении приложения, но с другим значением свойства IsEnabled.

person hurcane    schedule 11.02.2013