Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: willОтветов: 2

Мой сценарий заключается в том, что у меня есть приложение .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?

Спасибо...

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

appdomaincreateinstance

Ответы

Ответ 1 · рейтинг 3 · Bruce

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

ObjectHandle handle = domain.CreateInstanceFrom(
    baseDirectory + @"\SampleClassLibrary.dll", // <- exists in "c:\foo"
    "SomeClassInTheDll" );

Ответ 2 · Dark Falcon

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы