CreateInstance типа в другом AppDomain

Мой сценарий заключается в том, что у меня есть приложение .net (скажем, консольное приложение), которое создает домены приложений. Затем необходимо создать экземпляры и вызвать методы для типов, которые находятся в этом AppDomain. Каждый домен приложения имеет определенный каталог, в котором должны находиться его зависимости, который не находится в каталоге консольных приложений (или даже рядом с ним). Вот мой простой код:

string baseDirectory = "c:\foo"; // <- where AppDomain's dependecies 

// set up the app domain
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationName = DateTime.Now.ToString("hh:MM:ss:ffff");
setup.ApplicationBase = baseDirectory;
setup.PrivateBinPath = baseDirectory;

// create app domain
AppDomain domain = AppDomain.CreateDomain(
    name,
    AppDomain.CurrentDomain.Evidence,
    setup );

// instantiate Type from an assembly in that AppDomain
ObjectHandle handle = domain.CreateInstanceFrom(
    "SampleClassLibrary.dll", // <- exists in "c:\foo" 
    "SomeClassInTheDll" ); 

Вызов CreateInstanceFrom приводит к FileNotFoundExcepotion. FusionLog показывает, что каталоги, в которых он искал, были каталогами консольных приложений. В него не вошли папки поиска, которые были заданы из AppDomain — в переменной «baseDirecory».

Что я делаю неправильно? Есть ли другой способ выполнить код, который находится в другом AppDomain?

Спасибо...


person will    schedule 16.01.2010    source источник
comment
Пожалуйста, прочтите мой блог о взаимодействии между доменами приложений blog.vcillusion. co.in/   -  person vCillusion    schedule 03.06.2018
comment
Возможно, попробуйте использовать AssemblyResolve для разрешения сборки во время выполнения.   -  person vCillusion    schedule 03.06.2018


Ответы (2)


Одним из обходных путей может быть передача полного пути к вызову .CreateInstanceFrom:

ObjectHandle handle = domain.CreateInstanceFrom( 
    baseDirectory + @"\SampleClassLibrary.dll", // <- exists in "c:\foo"  
    "SomeClassInTheDll" );
person Bruce    schedule 16.01.2010
comment
Просто предоставление полного пути к dll сделало свое дело, по крайней мере, я смог загрузить этот тип. Кажется странным, что AppDomain ищет эту dll в baseDirectory. Интересно, будут ли проблемы, если эта dll будет ссылаться на другие dll, которые находятся в этом каталоге. Я протестирую и посмотрю. Спасибо, Брюс. - person will; 16.01.2010
comment
Как я и думал, решение выше не работает. Это похоже на то, что AppDomain не может найти ни одну из своих зависимых dll, поскольку каталог, в котором он ищет, — это список каталогов консольных приложений, а не AppDomains... Есть идеи? Это не может быть так сложно? - person will; 17.01.2010
comment
Выяснил, что использование обработчика AssemblyResolve помогло. - person will; 07.02.2010

Я не могу сказать, что не так с вашим кодом, так как похоже, что он должен работать. Однако когда я сделал это, я сделал помощника для выполнения этой работы. Примерно так:

public class Loader
{
    public void Load(string typename)
    {
        // ....
    }
}

Loader l = (Loader)domain.CreateInstanceAndUnwrap("Loader");
l.Load("SomeClassInTheDll");
person Dark Falcon    schedule 16.01.2010