c # Закрытие экземпляра сборки - PullRequest
4 голосов
/ 04 августа 2011

Когда я использую метод Assembly.LoadFile, у меня нет внешнего доступа к файлу, который был загружен в сборку, пока моя программа не будет закрыта.С другой стороны, StreamReader позволяет мне закрыть поток, когда я закончу использовать его, используя метод StreamReader.Close().

Есть ли способ сделать то же самое при использовании Assembly.Load?

Спасибо,

Эван

Ответы [ 5 ]

6 голосов
/ 04 августа 2011

Нет, так задумано.

Если вы хотите «разгрузить» сборку, вы должны загрузить ее в отдельный домен приложений.

Если вы просто хотите освободить файл, вы можете сначала загрузить его в byte[] и использовать (устарел) метод Assembly.Load(byte[] rawAssemly).

3 голосов
/ 04 августа 2011

Загрузите сборку в новый домен приложения, используя AppDomain.CreateDomain(), и используйте его с новым экземпляром класса AppDomainSetup со свойством теневого копирования, установленным в значение true. http://msdn.microsoft.com/en-us/library/ms404279.aspx

Это скопирует сборки, которые будут загружены в каталог, и вместо этого загрузит копии, оставив оригиналы разблокированными. Используйте AppDomain.Unload(domain), если вы хотите очистить, когда закончите сборку.

В качестве альтернативы вы можете использовать Assembly.Load(File.ReadAllBytes("path")).

1 голос
/ 04 августа 2011

Вы можете прочитать файл DLL в byte[] (вызов File.ReadAllBytes), затем вызвать Assembly.Load с байтовым массивом.

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

1 голос
/ 04 августа 2011

Вы можете загрузить сборку в отдельный домен приложений, а затем выгрузить домен приложений - это единственный способ.

0 голосов
/ 04 августа 2011

Это невозможно. Смотрите этот пост в стеке потока. Смотрите эту статью .

Для решения @BrokenGlass см. здесь .

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