Передача делегатов через собрания

Я создал обертку для существующего проекта, который в настоящее время официально поддерживает только Lua для кодирования на стороне сервера, сервер написан на C#, поэтому использование рефлексии для доступа к методам, предоставленным в Lua, не было реальной проблемой.
Я загружаю "скрипты" в новый AppDomain, который прекрасно работает, однако, как только я передаю делегат (делегаты используются в качестве обработчиков событий кодом сервера, переданным через один из методов), хост домен пытается загрузить сборку скрипта, что противоречит первоначальной цели отделения скриптов от домена хоста, чтобы их можно было выгружать.
если я предоставляю домен узла со сборкой, все работает нормально, пока я не отредактирую код и не добавлю / не удалим / не изменим делегаты, что затем прервет каждую ссылку на вызывающие методы, так как он опирается на более старую копию сборки, как Я загружаю его из массива байтов, чтобы файл сборки мог быть изменен во время выполнения.

Как я могу передать делегатов без необходимости загружать сборку, передавая их в хост-домен приложений, чтобы скрипты могли оставаться действительно изолированными от хост-домена приложений и выгружаться / загружаться по желанию?

РЕДАКТИРОВАТЬ: Используя классы SeparateAppDomain и MefLoader из рамочного проекта Plugin на https://www.codeproject.com/Articles/831823/Plugin-framework я загружаю скрипты следующим образом:

Load () на хостинге

MefLoader mefLoader = SeparateAppDomain.CreateInstance<MefLoader>(path, path);
List<IServerScript> scripts = mefLoader.Load<IServerScript>();
foreach (IServerScript script in scripts)
{
    ServerScript ss = ((ServerScript)script);

    ss.CreateProxy(AppDomain.CurrentDomain);
}

В классе ServerScript (который загружается в новый AppDomain классом MefLoader)

private Wrapper w = null;
internal void CreateProxy(AppDomain HostDomain)
{
    Type wrappertype = typeof(Wrapper);
    w = (Wrapper)HostDomain.CreateInstanceAndUnwrap(wrappertype.Assembly.FullName, wrappertype.FullName, false, BindingFlags.CreateInstance, null, new object[] { }, CultureInfo.InvariantCulture, null);
}

w это путь назад к домену хостинга, который обрабатывает все, что касается отражения в сборке сервера.

Выпуск воспроизводится так:

В ServerScript

public void Test(Delegate d)
{
    if (w != null) w.Test(d);
}

В любом классе, наследующем ServerScript, который будет загружен MefLoader

Test(new Action(() => { });

В оболочке

public void Test(Delegate d)
{
}

Хостинг домен не пытается загрузить скрипт сборки до вызова w.Test(d) сделано в ServerScript.

РЕДАКТИРОВАТЬ 2: После дальнейших тестов причина не в отдельных доменах приложений, а в отдельных сборках, если я не передам делегата, который определен в сборке оболочки, я столкнусь с проблемой, описанной выше, это более чем вероятно, почему оболочка пытается чтобы загрузить сборку скрипта, есть ли способ передать делегаты (часто это Action<> с различным количеством параметров в зависимости от варианта использования) из сборки скрипта в сборку оболочки без загрузки сборки скрипта в оболочку домен?

0 ответов

Другие вопросы по тегам