Создать экземпляр типа в другом домене приложения - PullRequest
3 голосов
/ 16 января 2010

Мой сценарий заключается в том, что у меня есть приложение .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 показывает, что каталоги, которые он искал, были каталогами консольных приложений. Он не включал папки поиска, которые были установлены из домена приложения - в переменной «baseDirecory».

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

Спасибо ...

Ответы [ 2 ]

3 голосов
/ 16 января 2010

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

ObjectHandle handle = domain.CreateInstanceFrom( 
    baseDirectory + @"\SampleClassLibrary.dll", // <- exists in "c:\foo"  
    "SomeClassInTheDll" );
0 голосов
/ 16 января 2010

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

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

Loader l = (Loader)domain.CreateInstanceAndUnwrap("Loader");
l.Load("SomeClassInTheDll");
...