Вопрос

Есть ли способ выпустить объект, к которому обращались с использованием позднего связывания (т.е. Activator.CreateInstance() Метод)?

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

Когда приложение впервые запускается, я могу удалить эти сборки из папки перевода без каких -либо ошибок. Однако, как только я обработаю документ через приложение (и связан с одной из сборников перевода с использованием позднего связывания), я больше не могу удалять сборки перевода. На этом этапе я получаю сообщение об ошибке, в котором говорится, что файл «используется другим приложением».

Есть ли способ «освободить» объект позднего борьбы в моем приложении, как только я закончу его использовать?

Это было полезно?

Решение

Как только сборка загружена в домен приложения, она останется до тех пор, пока домен приложения не отключится.

Чтобы обойти эту загрузку сборки в свой собственный домен приложения, например:

AppDomain app = AppDomain.CreateDomain("PlugInDomain");
ObjectHandle objectHandle = app.CreateInstanceFrom(assemblyPath, 
             "MyNamespace.MyComponent");
MyComponent component = (MyComponent) objectHandle.Unwrap();

// do stuff

// Now kill app domain, assembly can be overwritten after this.
AppDomain.Unload(app);

Другие советы

После того, как сборка загружается в исполняющий приложение, ее нельзя выгрузить (независимо от того, создает ли она с помощью отражения с Activator.createInstance).

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

Есть множество примеров, но вот один:http://www.dotnet247.com/247reference/msgs/28/142174.aspx.

Поскольку управление временем срока службы вторичных приложений может быть болью, в качестве альтернативы, если вы используете ASP .NET и хотите загрузить много динамических сборок, вы можете проверить, когда ваше текущее приложение становится насыщенным динамически нагруженным сборочным AppDomain.CurrentDomain.AssemblyLoaded Событие и сохранение подсчета, а затем запрашивая среду хостинга, переработайте текущее приложение, когда он попадает в критическое число (скажем, 500) как:

HostingEnvironment.InitiateShutdown();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top