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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> загрузить сборку в не-current AppDomain, в .NET 2.0 
V
    Опции темы
Bogdan1024
  Дата 17.3.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

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



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

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

а дальше что?

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

Assembly.LoadFrom(filename);

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


--------------------
user posted image
PM MAIL   Вверх
Bogdan1024
Дата 17.3.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

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



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


--------------------
user posted image
PM MAIL   Вверх
Partizan
Дата 17.3.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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



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


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

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



AppDomain.CreateInstanceAndUnwrap не загружает из другой папки так как ему нужно AssemblyName
так шо не подходит


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

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



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


--------------------
user posted image
PM MAIL   Вверх
Voyager
Дата 17.3.2009, 18:28 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Domain.SetData()
Domain.GetData()
PM   Вверх
Bogdan1024
Дата 17.3.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

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



Заюзал совет 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);//тут всё хорошо
        }

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


--------------------
user posted image
PM MAIL   Вверх
Partizan
Дата 17.3.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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



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


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

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



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


--------------------
user posted image
PM MAIL   Вверх
Partizan
Дата 17.3.2009, 20:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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



Цитата

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


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();


Это сообщение отредактировал(а) Partizan - 17.3.2009, 20:53


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


Эксперт
****


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

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



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


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

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


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

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


 




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


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

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