невозможно удалить dll после использования Assembly.LoadFrom
От: fewl  
Дата: 24.06.08 11:45
Оценка:
Доброго времени суток! Нужно во время работы приложения заменять dll-ки, не останавливая его работы. Как только делаю Assembly.LoadFrom() система не даёт удалить файл, даже если я очищаю весь массив сборок:

Array.Resize(ref MU_assembles, MU_assembles.Length + 1); //MU_assembles — массив сборок
MU_assembles[MU_assembles.Length — 1] = Assembly.LoadFrom("units//munit_01-0.0.dll");
Array.Clear(MU_assembles, 0, MU_assembles.Length); //Даже после этого файл не удаляется

Подскажите, пожалуйста, как сделать так, чтобы dll-ку можно было заменить, не закрывая приложения.
Re: невозможно удалить dll после использования Assembly.Load
От: arkhivania  
Дата: 24.06.08 11:56
Оценка:
Здравствуйте, fewl, Вы писали:

F>Подскажите, пожалуйста, как сделать так, чтобы dll-ку можно было заменить, не закрывая приложения.


Всё зависит от задачи.
Вариант
1) Запускать новый AppDomain — в нём делать всё что нужно, выгружать AppDomain и после этого можете удалять сборки
2) Assembly.Load(byte[]) здесь думаю всё понятно
Re: невозможно удалить dll после использования Assembly.Load
От: HowardLovekraft  
Дата: 24.06.08 11:57
Оценка:
Загружать сборку в отдельный домен, после использования сборки домен выгружать.
Re: невозможно удалить dll после использования Assembly.Load
От: zhech  
Дата: 24.06.08 12:08
Оценка:
На сколько я знаю, среда освобождает загруженные сборки только после выгрузки домена приложения
Re: невозможно удалить dll после использования Assembly.Load
От: TK Лес кывт.рф
Дата: 24.06.08 12:29
Оценка: +1
Здравствуйте, fewl, Вы писали:

F>Подскажите, пожалуйста, как сделать так, чтобы dll-ку можно было заменить, не закрывая приложения.


Почитайте про Shadow Copying Assemblies
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: невозможно удалить dll после использования Assembly.L
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 24.06.08 14:18
Оценка:
Здравствуйте, TK, Вы писали:

TK>Здравствуйте, fewl, Вы писали:


F>>Подскажите, пожалуйста, как сделать так, чтобы dll-ку можно было заменить, не закрывая приложения.


TK>Почитайте про Shadow Copying Assemblies


Удивил AppDomainSetup.ShadowCopyFiles

public string ShadowCopyFiles { get; set; }


A String containing the string value "true" to indicate that shadow copying is turned on; or "false" to indicate that shadow copying is turned off.


Внутри выглядит так

public string ShadowCopyFiles
{
    get
    {
        return this.Value[8];
    }
    set
    {
        if ((value != null) && (string.Compare(value, "true", StringComparison.OrdinalIgnoreCase) == 0))
        {
            this.Value[8] = value;
        }
        else
        {
            this.Value[8] = null;
        }
    }
}

Ведь можно было сделать использование ShadowCopyFiles удобным с bool Какие интересно есть причины такому решению...
Re[3]: невозможно удалить dll после использования Assembly.L
От: Блудов Павел Россия  
Дата: 26.06.08 08:55
Оценка: 3 (1)
Здравствуйте, pt4h, Вы писали:

P>Ведь можно было сделать использование ShadowCopyFiles удобным с bool Какие интересно есть причины такому решению...

Обычная человеческая тупость. Здесь говорится:

So I checked with the team that owns the API to get the “background” story… While no one that still works in the area would claim “credit” for this API, I did get the story. Apparently the rationale for using string was that the underlying infrastructure uses strings rather than bools. This is a classic argument and one you should be very wary of whenever you hear it. For the purpose of great API design you should separate your self from the implementation details for a moment and just ask “what would the user like\expect”.. and only deviate from that where there is a super compelling reason. There clearly is no in this case.


Ещё бы кто объяснил, почему сборки (Assemblies) состоят из модулей (Module) и почему никто и никогда не встречал сборок из более чем одного модуля.
Кроме примеров, разумеется. А раз никому это не нужно, то к чему плодить сущности?
... << RSDN@Home 1.2.0 alpha 4 rev. 1090>>
Re[4]: невозможно удалить dll после использования Assembly.L
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 26.06.08 09:13
Оценка: 5 (1)
Здравствуйте, Блудов Павел, Вы писали:

БП>Ещё бы кто объяснил, почему сборки (Assemblies) состоят из модулей (Module) и почему никто и никогда не встречал сборок из более чем одного модуля.


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

P.S. Показательно, что на Брейнбенче вопросы по многомодульным сборкам есть.
... << RSDN@Home 1.2.0 alpha 4 rev. 1090 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[4]: невозможно удалить dll после использования Assembly.L
От: _FRED_ Черногория
Дата: 26.06.08 10:48
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Ещё бы кто объяснил, почему сборки (Assemblies) состоят из модулей (Module) и почему никто и никогда не встречал сборок из более чем одного модуля.

БП>Кроме примеров, разумеется. А раз никому это не нужно, то к чему плодить сущности?

Насколько я помню какую-то книжку, то, если бы студия (как главное средство разработки) поддерживала многомодульность сборок, то это (наличие нескольких модулей) позволило б куски одной и той же сборки писать не нескольких (разных) языках. Судя по некоторым вопросам в этом форуме, такая "фича" нашла бы применение.
... << RSDN@Home 1 alpha 3 rev. 0>>
Help will always be given at Hogwarts to those who ask for it.
Re[4]: невозможно удалить dll после использования Assembly.L
От: Mace Windu  
Дата: 26.06.08 15:02
Оценка: 15 (1)
Здравствуйте, Блудов Павел, Вы писали:

БП>Ещё бы кто объяснил, почему сборки (Assemblies) состоят из модулей (Module) и почему никто и никогда не встречал сборок из более чем одного модуля.


Ну "никто" это громко сказано. Microsoft точно использует такие сборки. Примеров использования другими производителями я не встречал — наверное за неимением удобного механизма (поддержка студией) и практически неосвещенности этого вопроса.

Модуль не обязан быть дотнетным. Вот тут можно прочитать подробнее. Правда там пишут только про включение unmanaged dll в состав сборки, но я также встречал и неисполняемые файлы (получается нечто на подобие ресурсов, но с отложенной загрузкой).

Если интересуют конкретные примеры таких сборок, могу завтра отписаться.
... << RSDN@Home 1 alpha 4 rev. 0>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.