Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> динамическое подключение библиотеки 
:(
    Опции темы
4ybaka
Дата 30.8.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 28.4.2007

Репутация: нет
Всего: нет



Загружаю сборку через Assembly.LoadFile() или Assembly.LoadFrom(), а потом нужно ее удалить. так вот доступа к файлу пока не закроешь приложения - нет. как можно освободить файл?


--------------------
"То,что вы понимаете - это все,что вы понимаете."
 Брайн Керниган
PM MAIL WWW   Вверх
Partizan
Дата 30.8.2008, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



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


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
4ybaka
Дата 3.9.2008, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 28.4.2007

Репутация: нет
Всего: нет



попробовал - не получилось.также не дает удалять.может чтото не так делаю?...код такой:
Код

                AppDomain tempDomain = AppDomain.CreateDomain("tmp");
                CSEditorLibrary.Assemblies asm =
                    (CSEditorLibrary.Assemblies)tempDomain.CreateInstanceFromAndUnwrap(
                    "CSEditorLibrary.dll",//моя библиотека
                    "CSEditorLibrary.Assemblies");//тип переменной
                asm.LoadAssembly(ref names, ref typies, ref elements);//функция,которая загружает данные из dll,которую потом нужно удалить
                
                AppDomain.Unload(tempDomain);

ЗЫ:данные все загружаются


--------------------
"То,что вы понимаете - это все,что вы понимаете."
 Брайн Керниган
PM MAIL WWW   Вверх
Idsa
Дата 4.9.2008, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



4ybaka, сам недавно столкнулся с подобной проблемой. Все workaround'ы, которые находил, сводились к бесконечному циклу:
Код

do
{
 bool isUnloaded = true;
 try
 {
   AppDomain.Unload(tempDomain);
 }
 catch
 {
  isUnloaded = false;
 }
}
while (!isUnloaded)

Вот примеры подобных реализаций:
1. http://mark.michaelis.net/Blog/UnableToCon...nAppDomain.aspx
2. http://codebetter.com/blogs/ranjan.sakalle...4/08/61574.aspx

Здесь под заголовком "Unloading" есть обоснование, отчего возникают такие проблемы.

А вот здесь объясняется, почему нет метода Assembly.Unload.

Это сообщение отредактировал(а) Idsa - 4.9.2008, 06:05


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
4ybaka
Дата 4.9.2008, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 28.4.2007

Репутация: нет
Всего: нет



что-то я не совсем понял смысла кода,т.к. исключение то вываливается не при Unload,а при записи в файл...но тем не менее все равно не работает.


--------------------
"То,что вы понимаете - это все,что вы понимаете."
 Брайн Керниган
PM MAIL WWW   Вверх
Idsa
Дата 5.9.2008, 05:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(4ybaka @  5.9.2008,  02:12 Найти цитируемый пост)
исключение то вываливается не при Unload,а при записи в файл

Какая еще запись в файл? Почему тогда выложены исходники с выгрузкой домена, а не с записью в файл?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
4ybaka
Дата 5.9.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 28.4.2007

Репутация: нет
Всего: нет



потому что при удалении файла через File.Delete(path) думаю сложно сделать ошибку.
ЗЫ: запись = удаление в данном случае smile просто пытался сначало напрямую сохранить заново собранную сборку в старый файл,а как не получилось - решил сначало попробовать удалить старый файл...


--------------------
"То,что вы понимаете - это все,что вы понимаете."
 Брайн Керниган
PM MAIL WWW   Вверх
Idsa
Дата 5.9.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(4ybaka @  5.9.2008,  19:45 Найти цитируемый пост)
потому что при удалении файла через File.Delete(path) думаю сложно сделать ошибку.

Очень даже несложно.

Вы бы хоть текст ошибки привели...


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Partizan
Дата 5.9.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



Idsa, мои телепатические способности подсказывают мне, что автор через File.Delete пытается удалить сборку, достигая тем самым выгрузки её...да только по рукам бьют, ибо сборка-то занята )

 smile 


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Idsa
Дата 5.9.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(Partizan @  5.9.2008,  20:13 Найти цитируемый пост)
Idsa, мои телепатические способности подсказывают мне, что автор через File.Delete пытается удалить сборку, достигая тем самым выгрузки её...да только по рукам бьют, ибо сборка-то занята )

Хм... Ну так до этого же сборка выгружается.
4ybaka, нужен весь код. Иначе я буду кусатсья. Надоело играть в отгадайку.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
4ybaka
Дата 5.9.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 28.4.2007

Репутация: нет
Всего: нет



к сожалению старый код уже не вернуть....вообщем предложили загрузить сборку в массив байт и потом через Assembly.Load() загрузить ее.тогда файл не блокируется и хорошо все пишетсяsmile но все же попробую примерно показать что было:
Код

//она находится в другой сборке (CSEditorLibrary) в классе Assemblies 
         public static bool LoadAssembly(ref List<string> names, ref List<string> typies, ref List<List<string>> elements) {
            try {
                Assembly asm = Assembly.LoadFile(
                   System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\CSEnums.dll");

                Type[] tTypies = asm.GetTypes();
                foreach (Type t in tTypies) {
                    if (t.IsEnum) {
                        names.Add(t.Name);
                        elements.Add(new List<string>());
                        typies.Add("enum");
                        foreach (MemberInfo member in t.GetMembers()) {
                            if (member.MemberType == MemberTypes.Field && member.Name != "value__")
                                elements[names.Count - 1].Add(member.Name);
                        }
                    }
                    if (t.IsArray) {
                        names.Add(t.Name);
                        elements.Add(new List<string>());
                        typies.Add("string");
                        foreach (MemberInfo member in t.GetMembers()) {
                            elements[names.Count - 1].Add(member.Name);
                        }
                    }
                }                
            }
            catch (Exception exc) {
                MessageBox.Show("При загрузке библиотеки произошла ошибка: " + exc.Message, "Ошибка");
                return false;
            }
            return true;
        }
//это выполняется при загрузке приложения
                AppDomain tempDomain = AppDomain.CreateDomain("tmp");
                CSEditorLibrary.Assemblies asm =
                    (CSEditorLibrary.Assemblies)tempDomain.CreateInstanceFromAndUnwrap(
                    "CSEditorLibrary.dll",//моя библиотека
                    "CSEditorLibrary.Assemblies");//тип переменной
                asm.LoadAssembly(ref names, ref typies, ref elements);//функция,которая загружает данные из dll,которую потом нужно удалить
                
                AppDomain.Unload(tempDomain);

                System.IO.File.Delete(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\CSEnums.dll");

PS: исключение было такое:
Access to the path 'D:\tmpProjects\src\CSEnumEditor\bin\Debug\CSEnums.dll' is denied.
ЗЗЫ: код может оказаться с опечатками,т.к. восстанавливался в браузере....


--------------------
"То,что вы понимаете - это все,что вы понимаете."
 Брайн Керниган
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0820 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.