Выпуск позднего объекта в C # - PullRequest
2 голосов
/ 13 октября 2010

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

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

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

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

Ответы [ 2 ]

1 голос
/ 13 октября 2010

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

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

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);
0 голосов
/ 13 октября 2010

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

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

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

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

HostingEnvironment.InitiateShutdown();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...