Как достать имя типа из другого домена?

317
09 декабря 2016, 08:58

Вот к примеру код:

var setup = new AppDomainSetup();
            setup.PrivateBinPath = $"{Directory.GetCurrentDirectory()}\\Libs";
var appDomain = AppDomain.CreateDomain( "имя домена", null, setup );
appDomain.DoCallBack ( AssemblyLoad );

Пример метода в калбэке:

private static void AssemblyLoad()
{
    var assembly = Assembly.Load( "Test" );
    var type = assembly.GetTypes().Single( t => typeof( НужныйТип).IsAssignableFrom( t ) );
    Console.WriteLine( type.FullName );
    _typeName = type.FullName;
}

переменная _typeName тоже статичная и остается при этом пустой. Если сделать метод не статичным, то каллбэк домена вызовет ошибку. Как узнать имя требуемого типа?

Answer 1

Создайте дополнительный класс, наследующий от MarshalByRefObject и перенесите в него AssemblyLoad, _typeName, сделав их не статическими.

По непонятным причинам DoCallBack не работает (скорее всего, тянет за собой загрузку сборки в текущий домен), но работает CreateInstanceAndUnwrap:

class Test : MarshalByRefObject
{
    private Type _typeName;
    public void AssemblyLoad()
    {
        var assembly = Assembly.Load( "Test" );
        var type = assembly.GetTypes().Single( t => typeof( НужныйТип).IsAssignableFrom( t ) );
        Console.WriteLine( type.FullName );
        _typeName = type.FullName;
    }
}
// ...
var setup = new AppDomainSetup {
    PrivateBinPath = "Libs"
};
var appDomain = AppDomain.CreateDomain("имя домена", null, setup);
var test = (Test)appDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Test).FullName);
test.AssemblyLoad();

При этом возникнет следующая проблема: если вы попытаетесь обратиться к test._typeName в текущем домене, это повлечет загрузку в него сборки Test. Так как private path для текущего домена не прописан, возникнет исключение FileNotFoundException. Вам придется либо также настраивать private path для текущего домена, либо работать с загруженной сборкой исключительно внутри второго домена, передавая наружу только результаты ее работы.

READ ALSO
Реализация Матрицы C#

Реализация Матрицы C#

Вот решил перейти с С++ на С# и наткнулся на такую проблемуКак я понял, в шарпе нет шаблонов как таковых, и это компенсируется интерфейсами...

458
Точка входа в MVVM: App.xaml.cs или представление?

Точка входа в MVVM: App.xaml.cs или представление?

Начал изучать MVVM и столкнулся, как наверное и многие другие, с определенным недопониманиемВ многочисленных примерах реализации MVVM, доступных...

271
Как создать папку с текстовыми файлами в проекте и пользоваться ими?

Как создать папку с текстовыми файлами в проекте и пользоваться ими?

Хочу добавить в проект несколько csv файлов и пользоваться ими, как текстовыми ресурсамиНу и чтобы лежали вместе в папке для порядка

370
C# selenuim phantomJS error: can't find JQuery

C# selenuim phantomJS error: can't find JQuery

ПриветствуюРешил поработать с selenium в C# посредством веб-драйвера phantomJS, но при запуске phantomjs

275