Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Assembly.UnLoad


Автор: jfx 18.1.2006, 19:28
Понятно что такого метода MS не предусмотрела, но тем не менее как можно "разлочить" dll-ку со сборкой которая уже не используется? AppDomain.UnLoad не помог...
Меня не интересует "уборка мусора", dll остается залоченой до выхода из приложения при любых обстоятельствах smile
Как победить? Спасибо.
Добавлено @ 19:42
Да, если это невозможно, то может быть можно как-то получить ресурс из сборки без ее загрузки?

Автор: jfx 18.1.2006, 19:51
Похоже только AppDomain.SetShadowCopyFiles может помочь (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemappdomainclasssetshadowcopyfilestopic.asp?frame=true)
Может можно как-то проще?

Автор: mr.DUDA 19.1.2006, 00:10
Сборку, загруженную в домен, выгрузить нельзя.

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

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

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

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

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

Автор: jfx 6.2.2006, 15:03
Спасибо, давно не заглядывал.
Т.е. можно в домен загрузить только ресурс?
Как домены создаются я знаю smile а вот как в него загрузить только ресурс не представляю... Покажите пожалуйста.
Спасибо.

Автор: mr.DUDA 6.2.2006, 16:20
Цитата(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");
    }
}


Автор: jfx 6.2.2006, 17:01
Спасибо, буду пробовать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)