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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка assembly из локалной папки, в домен приложения 
:(
    Опции темы
Pankon
Дата 28.4.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Очень простая assembly:
Код
Module Module1
    Sub Main()
        Console.WriteLine("I'm simple assembly!!!!!")
    End Sub
End Module
Компилирую в C:\local\

Создаю новый домен приложения и пытаюсь загрузить assembly 
Код
    Imports System.Reflection
    Private myAss As String = "C:\local\SimpleAssembly.exe"
    Private Sub test()
        Dim newDomain As AppDomain = AppDomain.CreateDomain("NewMyDomain")
        Dim myAssemblyName As AssemblyName
        myAssemblyName = AssemblyName.GetAssemblyName(myAss)
        newDomain.Load(myAssemblyName)
    End Sub
Получаю очень смешное FileNotFoundException!!!
Код
Файл или Assembly SimpleAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ce6d90a467ee5ae2 или зависимость не наиден.
Система не может найти заданный файл : SimpleAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ce6d90a467ee5ae2

Что за бред?
По этому сообщению видно, что система нашла эту Assembly, бедь система прочитала ИЗ файла Строгое имя.

Что не так? Все перерыл ... smile 
   

Это сообщение отредактировал(а) Pankon - 28.4.2006, 13:48
PM MAIL   Вверх
mr.DUDA
Дата 4.5.2006, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



юзаем Assembly.LoadFrom а не Assembly.Load 


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


Опытный
**


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

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



Цитата(mr.DUDA @  4.5.2006,  11:35 Найти цитируемый пост)
а не Assembly.Load  
 о чем речь smile 
smile Я использую AppDomain.Load.
 
PM MAIL   Вверх
arilou
Дата 4.5.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Pankon @  4.5.2006,  12:47 Найти цитируемый пост)
AppDomain.Load

Assembly.LoadFrom и Assembly.Load  загружают сборку в текущий appdomain

 


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


Опытный
**


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

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



Цитата(arilou @  4.5.2006,  13:28 Найти цитируемый пост)
Assembly.LoadFrom и Assembly.Load  загружают сборку в текущий appdomain
- очень правильно подмечено.  smile 

Мне же нужно загрузить сборку в новый 
Цитата(Pankon @  28.4.2006,  13:28 Найти цитируемый пост)
Dim newDomain As AppDomain = AppDomain.CreateDomain("NewMyDomain")
  smile 
 
PM MAIL   Вверх
arilou
Дата 4.5.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Pankon @  4.5.2006,  13:56 Найти цитируемый пост)
Мне же нужно загрузить сборку в новый 

Принимая во внимание вот это:
Цитата

An attempt to call Load on a target application domain that is not the current application domain will result in a successful load of the assembly in the target application domain. Since an Assembly is not MarshalByRefObject, when this method attempts to return the Assembly for the loaded assembly to the current application domain, the common language runtime will try to load the assembly into the current application domain and the load might fail. The assembly that is loaded into the current application domain might be different from the assembly that was loaded first if the path settings for the two application domains are different.


Делаем вот так:

Код

            AppDomain newDomain = AppDomain.CreateDomain("newAppDomain");
            newDomain.DoCallBack(
                new CrossAppDomainDelegate(
                delegate 
                {
                    Assembly.LoadFrom("myassembly.dll");
                }
                ));
 


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


Опытный
**


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

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



AppDomain.Load Method (AssemblyName) 
Цитата
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.
Цитата
An attempt to call Load on a target application domain that is not the current application domain will result in a successful load of the assembly in the target application domain.

Цитата
Этот метод следует использовать только для загрузки сборки в домен текущего приложения. Этот метод определен для взаимодействия вызывающих операторов, которые не могут вызывать статический метод Load.
Цитата
Попытка вызвать метод Load для целевого домена приложения, который не является текущим, даст положительный результат загрузки сборки в целевой домен приложения. 

 smile      

Это сообщение отредактировал(а) Pankon - 4.5.2006, 16:53
PM MAIL   Вверх
arilou
Дата 4.5.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Pankon, более того - сборка будет загружена и в текущий домен 


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


Опытный
**


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

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



Ну а нафига тогда такие новые домены, если туда и сборку не запихнутьsmile

Добавлено @ 17:16 
AppDomain - класс


Цитата
Домены приложений, представленные объектами AppDomain, предоставляют границы изоляции, выгрузки и безопасности для выполнения управляемого кода.


Цитата
Домены приложений создаются с помощью метода CreateDomain. Экземпляры AppDomain используются для загрузки и выполнения сборок (Assembly). Если объект AppDomain больше не используется, его можно выгрузить.


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


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


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

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



Передавай вызов в другой домен и уже оттуда грузи всё что тебе нужно. 


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


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


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

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



Цитата(Pankon @  4.5.2006,  17:13 Найти цитируемый пост)
Ну а нафига тогда такие новые домены, если туда и сборку не запихнуть

Ты что, не читаешь то, что тут пишут  smile я привел пример кода, который загрузит сборку в новом созданном домене.  


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


Опытный
**


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

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



Цитата(arilou @  5.5.2006,  12:48 Найти цитируемый пост)
Ты что, не читаешь то, что тут пишут

Читаю:
Цитата(arilou @  4.5.2006,  17:07 Найти цитируемый пост)
сборка будет загружена и в текущий домен
Цитата(arilou @  5.5.2006,  12:48 Найти цитируемый пост)
загрузит сборку в новом созданном домене

Терминология MSDN
Цитата(Pankon @  4.5.2006,  16:49 Найти цитируемый пост)
загрузки сборки в домен текущего приложения
Цитата(Pankon @  4.5.2006,  16:49 Найти цитируемый пост)
загрузки сборки в целевой домен


Вероятно я не правильно интерпретировал твой первый пост...  smile  
Я же не знал, что текущий домен нужно интепретировать как целевой домен. smile   Особенно после чтения MSDN  smile

Добавлено @ 18:27 
Кстати.
Что говорит теория по поводу "отсутствия" "достойных" собственных  методов загрузок сборок из новых доменов... Что приводит к использованию способов загрузок из домена текущего приложения (через делегаты) smile  
PM MAIL   Вверх
arilou
Дата 5.5.2006, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Блин, написал большой ответ, а браузер его по..ил.  smile Ладно, пишу еще раз.

Вобщем, смысл такой. Исходя из этого:

Цитата(arilou @  4.5.2006,  15:05 Найти цитируемый пост)
Since an Assembly is not MarshalByRefObject, when this method attempts to return the Assembly for the loaded assembly to the current application domain, the common language runtime will try to load the assembly into the current application domain and the load might fail


всего логично. Если вызывать 

Код

AppDomain newDomain = AppDomain.CreateDomain("newAppDomain");
newDomain.Load("myassembly");


То вызов Load пересечет границу между апдоменами. Т.к. AppDomain.Load возвращает ссылку на загруженную сборку, то при переходе границы создается копия Assembly, что вызывает ее загрузку в текущем домене - том, в котором произощел вызов AppDomain.Load.

В моем примере этот вызов происходит в новом созданном домене newDomain, т.к. я использую метод AppDomain.DoCallback.

Цитата(arilou @  4.5.2006,  15:05 Найти цитируемый пост)
            AppDomain newDomain = AppDomain.CreateDomain("newAppDomain");
            newDomain.DoCallBack(
                new CrossAppDomainDelegate(
                delegate 
                {
                    Assembly.LoadFrom("myassembly.dll");
                }
                ));


Цитата(Pankon @  5.5.2006,  18:21 Найти цитируемый пост)
 же не знал, что текущий домен нужно интепретировать как целевой домен

Я так не говорил. Текущий домен - это домен, в котором в данный момент времени выполняется данный код. 


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


Почетный Мороз
**


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

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



arilou, попробовал такой способ. У меня вылетает ошибка, что класс в котором я это все делаю несериализуем. Попробовал сделать его сереализуемым, но результата никакого.


--------------------
Задаю много глупых вопросов....
PM MAIL ICQ   Вверх
stab
Дата 8.11.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



FatherFrost, а что за класс?


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

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


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

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


 




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


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

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