C# Избегайте блокировки файла при Assembly.Load

Моя ситуация;

Я разрабатываю приложение-плагин, основанное на динамической загрузке сборок плагинов, более чем один пользователь может запускать приложение, размещенное на сервере. Приложение автоматически обновляет сборки плагинов с моего сервера обновлений в реальном времени при запуске. Таким образом, файлы плагина (и его вспомогательные библиотеки DLL) не должны быть заблокированы в файловой системе.

 byte[] assemblyBytes = File.ReadAllBytes("asm-path");
 var assembly = Assembly.Load(assemblyBytes);

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

назвать файлы, скажем так;

  • APP.Exe — мое базовое приложение;
  • PL1.dll — мой первый плагин, APP.exe загружает его в новый домен приложения.
  • PL2.dll — мой второй плагин, APP.exe загружает его в новый домен приложения.
  • PL1_S.dll — это статическая эталонная dll для плагина PL1.dll, загруженная в PL1 AppDomain.
  • PL_COMMON — это статическая эталонная dll для плагинов PL1 и PL2, загружаемая доменами приложений PL1 и PL2.

PL1_S и PL_COMMON также не должны быть заблокированы в файле, как сборки PL1 и PL2.

Есть идеи, как это решить?


person Ender KARADAG    schedule 29.01.2014    source источник


Ответы (1)


Для этого уже встроена функциональность, используемая, например. АСП.Нет. См. теневое копирование сборок:

Теневое копирование позволяет обновлять сборки, используемые в домене приложения, без разгрузки домена приложения. Это особенно полезно для приложений, которые должны быть доступны постоянно, например для сайтов ASP.NET.

Так что просто включите это через AppDomainSetup.ShadowCopyFiles при создании AppDomain

person Damien_The_Unbeliever    schedule 29.01.2014