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


Автор: Pankon 28.4.2006, 13:28
Очень простая 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 
   

Автор: mr.DUDA 4.5.2006, 11:35
юзаем Assembly.LoadFrom а не Assembly.Load 

Автор: Pankon 4.5.2006, 12:47
Цитата(mr.DUDA @  4.5.2006,  11:35 Найти цитируемый пост)
а не Assembly.Load  
 о чем речь smile 
smile Я использую AppDomain.Load.
 

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

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

 

Автор: Pankon 4.5.2006, 13:56
Цитата(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 
 

Автор: arilou 4.5.2006, 15:05
Цитата(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");
                }
                ));
 

Автор: Pankon 4.5.2006, 16:49
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      

Автор: arilou 4.5.2006, 17:07
Pankon, более того - сборка будет загружена и в текущий домен 

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

Добавлено @ 17:16 
http://msdn.microsoft.com/library/rus/default.asp?url=/library/RUS/cpref/html/frlrfsystemappdomainclasstopic.asp


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


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


 smile  

Автор: mr.DUDA 4.5.2006, 18:09
Передавай вызов в другой домен и уже оттуда грузи всё что тебе нужно. 

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

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

Автор: Pankon 5.5.2006, 18:21
Цитата(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  

Автор: arilou 5.5.2006, 18:46
Блин, написал большой ответ, а браузер его по..ил.  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 Найти цитируемый пост)
 же не знал, что текущий домен нужно интепретировать как целевой домен

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

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

Автор: stab 8.11.2007, 15:00
FatherFrost, а что за класс?

Автор: FatherFrost 8.11.2007, 15:05
stab, нашел более подробный пример в другой старой теме. Думаю ща все будет ок.

Автор: arilou 8.11.2007, 15:46
FatherFrost, ну ты некрофил  smile 

Цитата

delegate 
                {
                    Assembly.LoadFrom("myassembly.dll");
                }


попробуй вынести это в статический метод.

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