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


Автор: Bogdan1024 17.3.2009, 13:32
Как загрузить .dll в домен не по умолчанию, при чём сборка находится не в папке приложения?
Код

AppDomain d = AppDomain.CurrentDomain.CreateDomain(DomainName);

а дальше что?

Добавлено через 7 минут и 20 секунд
я так понимаю что нужно использовать этот код:
Код

Assembly.LoadFrom(filename);

но он опять же загружает сборку в текущий домен
а как загрузить в другой?

Автор: Bogdan1024 17.3.2009, 13:56
нужно использовать метод DoCallBack у нового домена, в котором передаётся делегат с кодом, который загружает сборку

Автор: Partizan 17.3.2009, 13:56
Bogdan1024, смотри метод AppDomain.CreateInstanceAndUnwrap при создании объекта сборка автоматически загрузится в домен.

Автор: Bogdan1024 17.3.2009, 17:03
AppDomain.CreateInstanceAndUnwrap не загружает из другой папки так как ему нужно AssemblyName
так шо не подходит

Автор: Bogdan1024 17.3.2009, 18:18
вот зло
чтобы загрузить сборку нужно указать путь к файлу
как дать знать коду из другой другого домена какой именно файл нужно загрузить?
интуиция подсказывает что нужно использовать ремоутинг, но как именно его использовать пока не понятно smile

Автор: Voyager 17.3.2009, 18:28
Domain.SetData()
Domain.GetData()

Автор: Bogdan1024 17.3.2009, 19:23
Заюзал совет Voyager'a. 
Но что-то по-прежнему не так! 

лучше проиллюстрирую кодом:
Код

                AppDomain d = AppDomain.CreateDomain(DomainName);
                CrossAppDomainDelegate dd = new CrossAppDomainDelegate(AssembliesLoader.LoadAssembly);
                d.SetData(AssembliesLoader.CurrentDllFileName_ParameterName, filename);//Leting know the code that is run in another app domain which assembly to load.
                d.DoCallBack(dd);
                Assembly[] asses = d.GetAssemblies();//ловлю ошибку "Could not load file or assembly 'ClassLibrary1, Version=1.0.2.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified."

Код

        private static void LoadAssembly()
        {                
            string filename = (string)AppDomain.CurrentDomain.GetData(AssembliesLoader.CurrentDllFileName_ParameterName);
            Assembly.LoadFile(filename);//тут всё хорошо
        }

что не так на этот раз?
я же её уже загрузил!

Автор: Partizan 17.3.2009, 19:31
Bogdan1024, файлы на которые ссылается ClassLibrary1 должны лежать рядом с ней, либо в GAC

Автор: Bogdan1024 17.3.2009, 19:33
ну, это как бы понятно
не понятно почему и как это преодолеть
я же загрузил их из другой папки успешно

Автор: Partizan 17.3.2009, 20:53
Цитата

ну, это как бы понятно
не понятно почему и как это преодолеть
я же загрузил их из другой папки успешно 


Bogdan1024, тип Assembly как бы не помечен атрибутом [Serializable] и как бы между доменами объекты этого типа не передать...


Код

    public class Loader : MarshalByRefObject
    {
        public Loader()
        {

        }

        public void LoadAssembly(string path)
        {
            Assembly.LoadFile(path);
        }

        public List<string> GetAssemblies()
        {
            List<string> asmNames = new List<string>();
            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
            foreach (Assembly asm in assemblies)
            {
                asmNames.Add(asm.FullName);
            }

            return asmNames;
        }
    }



Код

            AppDomain ad = AppDomain.CreateDomain("NewDomain");
            Loader obj = (Loader)ad.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Loader).FullName);
            obj.LoadAssembly(filePath);
           
            List<string> assemblies = obj.GetAssemblies();

Автор: Idsa 19.3.2009, 13:44
А почему бы просто не заюзать AppDomain.Load(byte[])?
1. Создаем новый AppDomain
2. Считываем сборку в любой папке в поток байт
3. Вызываем Load(byte[])

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