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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> AppDomain 
:(
    Опции темы
qaurts
Дата 15.7.2008, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вопрос такой почему при загрузке Assembly в отдельный AppDomain она также загружается в общий? 
Код

        public void PreLoadAssembly(string FilePath)
        {
            Assembly[] all =AppDomain.CurrentDomain.GetAssemblies(); // Здесь еще все впорядке
            AppDomain domain = AppDomain.CreateDomain("TEMP");
            
            all = AppDomain.CurrentDomain.GetAssemblies(); // здесь все еще то же кол-во Assembly's
            AssemblyName name = AssemblyName.GetAssemblyName(FilePath);
            all = AppDomain.CurrentDomain.GetAssemblies(); // все ок

            
            Assembly asm = domain.Load(name); 
            all = AppDomain.CurrentDomain.GetAssemblies(); // Оп.. на 1 больше! почему ???
            AppDomain.Unload(domain); // это не помогает 
            all = AppDomain.CurrentDomain.GetAssemblies(); // опять лишняя сборка  (((((
        }

Наверное я Ламмер =) smile 
Как избежать загрузки в общий AppDomain?

Это сообщение отредактировал(а) qaurts - 15.7.2008, 19:37
PM MAIL   Вверх
wotker
Дата 15.7.2008, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 18.7.2006
Где: Ростов-на-Дону

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



про Load:
Цитата

This method should only be used to load an assembly into the current application domain. This method is defined for interoperability callers who cannot call the static Load method.


Тоесть она загружает сборку не в domain, а в CurrentDomain.
Вот и всё.
--------------------
ICQ ::            347306684e-mail ::         wotker[at]rambler[dot]ru 
PM MAIL ICQ   Вверх
qaurts
Дата 15.7.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да поковырялся в MSDNe там написано 
Цитата


The assembly is loaded into both domains because Assembly does not derive from MarshalByRefObject, and therefore the return value of the Load method cannot be marshaled. Instead, the common language runtime tries to load the assembly into the calling application domain. The assemblies that are loaded into the two application domains might be different if the path settings for the two application domains are different.
[Note] Note:

If both the AssemblyName..::.Name property and the AssemblyName..::.CodeBase property are set, the first attempt to load the assembly uses the display name (including version, culture, and so on, as returned by the Assembly..::.FullName property). If the file is not found, the CodeBase property is used to search for the assembly. If the assembly is found using CodeBase, the display name is matched against the assembly. If the match fails, a FileLoadException is thrown.

Короче (если правильно понял) загрузка идет и в этот и в общий Домен. Так как сделать загрузку в отдельный??? 
PM MAIL   Вверх
Pankon
Дата 15.7.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(qaurts @  15.7.2008,  20:48 Найти цитируемый пост)
Так как сделать загрузку в отдельный??? 

А через MarshalByRefObject пробовал?

PM MAIL   Вверх
qaurts
Дата 15.7.2008, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Каким образом? Если можно исходник для наглядности. Если это то что я думаю - то не подходит. Задача в изоляции клиентских Плагинов. Т.Е. у каждого у клиента существует свой AppDomain в котором загружены его плагины. все...

Это сообщение отредактировал(а) qaurts - 15.7.2008, 22:45
PM MAIL   Вверх
Pankon
Дата 15.7.2008, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(qaurts @  15.7.2008,  22:09 Найти цитируемый пост)
Каким образом?


тут про MarshalByRefObject  почитай.

Принцип такой:
1.  Делаешь прокси класс (наследуешь MarshalByRefObject), в котором в конструкторе (или в методе) грузишь свои assembly в "текущий" домен.

2. Создаешь новый домен
AppDomain ad = AppDomain.CreateDomain("New domain");

3. В новом домене создаешь экземпляр прокси класса (см п.1)
ad.CreateInstanceAndUnwrap(...)

4. Вызываешь свой метод для загрузки assembly(если в конструкторе не загрузил) 

Вообщем так получатся, экземпляр класса будет "жить" в новом домене и для него новый домен будет "current". Через MarshalByRefObject "дергаешь как за ниточки" методы этого экземпляра из главного домена. 
(Вот так популярно объяснил.)

Добавлено через 13 минут и 22 секунды
Цитата(qaurts @  15.7.2008,  22:09 Найти цитируемый пост)
Если это то что я думаю - то не подходит. Задача в изоляции клиентских Плагинов. Т.Е. у каждого у клиента существует свой AppDomain в котором загружены его плагины. все...
 Подходит. 
Делай у плагинов Main класс, который реализует твой Interface(и наследует MarshalByRefObject). В 3 - м шаге создавай экземпляр из твоей assembly-plagin на Main(Main класс будет прокси). Присваивай экземпряр твоему  интерфейсу. Так ты сможешь "дергать одинаковые методы" во всех плагинах.

Не забудь указать ApplicationBase для каждого домена, где у тебя assemblies данного плагина лежат(см. класс AppDomainSetup).

PM MAIL   Вверх
qaurts
Дата 16.7.2008, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо! Почти работает .. Есть только одно ApplicationBase, после создания домена не присваивается, если присвоить при инициализации то 1) CreateInstanceAndUnwrap [см *] вызывает исключение (не удается найти exe - сборку). 2) В противном случае выдается исключение при попытке получить все сборки [см **] выдается исключение что не может загрузить dll - сборку. Как быть?
Вот мой код
Код

    public class Proxy : MarshalByRefObject
    {
        public Hashtable plugins = new Hashtable();

        public Proxy()
        {
            string[] files = Directory.GetFiles("C:\\Ivan\\Plugins\\", "*.dll");
                        foreach (string file in files)
            {
                try
                {
                    Assembly asm = Assembly.LoadFile(file);
                    Type [] types=asm.GetTypes();
                    foreach (Type type in types)
                    {
                        Type iface = type.GetInterface("IPlugin");
                        if (iface != null)
                        {
                            IPlugin plugin = (IPlugin)Activator.CreateInstance(type);
                            plugins.Add(plugin.Name, plugin);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }

            }
        }
    }


    class Program
    {
        public Program()
        {
            Assembly[] all = AppDomain.CurrentDomain.GetAssemblies();

            AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
                        //setup.ApplicationBase = "C:\\Ivan\\Plugins\\"; - точка изменения ошибки  с 1 на 2
            AppDomain dom=AppDomain.CreateDomain("Hello",AppDomain.CurrentDomain.Evidence,setup);


            all = AppDomain.CurrentDomain.GetAssemblies();
            string asm=Assembly.GetExecutingAssembly().FullName;
            Proxy p = (Proxy)dom.CreateInstanceAndUnwrap(asm, "PluginsP.Proxy");//*
            all = AppDomain.CurrentDomain.GetAssemblies();
            Assembly[] current = dom.GetAssemblies();//**
        }

        static void Main(string[] args)
        {
            new Program();
        }
    }
}



Это сообщение отредактировал(а) qaurts - 16.7.2008, 11:18
PM MAIL   Вверх
ДобренькийПапаша
Дата 25.7.2008, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

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



конфигурационный файл есть (его надо создать), он имеет такое же имя как и сборка + расширение конфиг там прописать конкретно можно откуда что брать, попробуй, может поможет...

Это сообщение отредактировал(а) ДобренькийПапаша - 25.7.2008, 17:23


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

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


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

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


 




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


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

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