System.EnterpriseServices.RegistrationHelper не выпускает файл - PullRequest
0 голосов
/ 17 ноября 2009

Мы разработали небольшую оснастку 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, но не смог найти решение.

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

1 Ответ

0 голосов
/ 11 февраля 2013

Если приложение 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. Если он не найден, значит, он отключился (или вообще никогда не работал). Если он найден, спите в течение приемлемого периода времени и ищите его снова в обновленном экземпляре коллекции.

Uninstall / Переустановка

Вы уже решили эту часть.

Включение

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

...