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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Assembly.UnLoad, Как выгрузить сборку? 
:(
    Опции темы
jfx
Дата 18.1.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Понятно что такого метода MS не предусмотрела, но тем не менее как можно "разлочить" dll-ку со сборкой которая уже не используется? AppDomain.UnLoad не помог...
Меня не интересует "уборка мусора", dll остается залоченой до выхода из приложения при любых обстоятельствах smile
Как победить? Спасибо.
Добавлено @ 19:42
Да, если это невозможно, то может быть можно как-то получить ресурс из сборки без ее загрузки?
PM MAIL   Вверх
jfx
Дата 18.1.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Похоже только AppDomain.SetShadowCopyFiles может помочь (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemappdomainclasssetshadowcopyfilestopic.asp?frame=true)
Может можно как-то проще?
PM MAIL   Вверх
mr.DUDA
Дата 19.1.2006, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



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


--------------------
user posted image
PM MAIL WWW   Вверх
arilou
Дата 19.1.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


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

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



Цитата(mr.DUDA @ 19.1.2006, 00:10 Найти цитируемый пост)

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

Зато можно выгрузить домен со всеми сборками smile (если только в нем код не выполняется)


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
mr.DUDA
Дата 19.1.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Цитата(jfx @ 18.1.2006, 18:28 Найти цитируемый пост)
Да, если это невозможно, то может быть можно как-то получить ресурс из сборки без ее загрузки?

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


--------------------
user posted image
PM MAIL WWW   Вверх
jfx
Дата 6.2.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, давно не заглядывал.
Т.е. можно в домен загрузить только ресурс?
Как домены создаются я знаю smile а вот как в него загрузить только ресурс не представляю... Покажите пожалуйста.
Спасибо.
PM MAIL   Вверх
mr.DUDA
Дата 6.2.2006, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Цитата(jfx @ 6.2.2006, 14:03 Найти цитируемый пост)
Т.е. можно в домен загрузить только ресурс?
Как домены создаются я знаю  а вот как в него загрузить только ресурс не представляю... Покажите пожалуйста.

Создаём домен, дёргаем метод в отдельном домене. После того как попали в новый домен, грузим сборку с пом. Assembly.LoadFrom. Получаем ресурс с пом. GetManifestResourceStream. Читаем стрим в переменную-массив. Кладём массив во внутренние переменные домена с пом. AppDomain.SetData(). Выходим из метода, получаем с пом. GetData() массив. Выгружаем домен.

Вот пример:

Код
using System;
using System.Reflection;
using System.Security;
using System.Security.Policy;
using System.Threading;
using System.IO;

[Serializable]
class SmartResourceLoader
{
    string _assemblyPath;
    string _resourceId;

    internal SmartResourceLoader()
    {
    }

    public void WorkerMethod()
    {
        Assembly assm = Assembly.LoadFrom(_assemblyPath);
        Stream stream = assm.GetManifestResourceStream(_resourceId);
        byte[] ret = new byte[stream.Length];
        stream.Read(ret, 0, (int)stream.Length);
        AppDomain.CurrentDomain.SetData("result", ret);
    }

    public static byte[] LoadResource(string assemblyPath, string resourceId)
    {
        AppDomainSetup info = new AppDomainSetup();
        info.ApplicationName = "SmartResourceLoader";
        info.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
        info.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
        Evidence evidence = AppDomain.CurrentDomain.Evidence;
        AppDomain anotherDomain = AppDomain.CreateDomain("SmartResourceLoader", evidence, info);

        SmartResourceLoader loader = new SmartResourceLoader();
        loader._assemblyPath = assemblyPath;
        loader._resourceId = resourceId;

        try
        {
            anotherDomain.DoCallBack(new CrossAppDomainDelegate(loader.WorkerMethod));
            return (byte[])anotherDomain.GetData("result");
        }
        finally
        {
            AppDomain.Unload(anotherDomain);
        }
    }
}

class TestApp
{
    [STAThread]
    static void Main(string[] args)
    {
        byte[] ret = SmartResourceLoader.LoadResource(@"D:\Projects\FormLibrary1\bin\debug\FormLibrary1.dll", "FormLibrary1.ListForm1.resources");
    }
}




--------------------
user posted image
PM MAIL WWW   Вверх
jfx
Дата 6.2.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, буду пробовать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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