Как разделить объект между доменами приложений в c#, если класс не сериализуемый - PullRequest
0 голосов
/ 09 мая 2020

Для контекста это продолжение этого вопроса:

Как я могу перезагрузить класс. net

Чтобы избежать проблем с перечитывая этот пост, моя проблема "высокого уровня" в том, что я хочу сделать это:

while(true) {
    sleep(naptime);
    reload_code(); // use magic?
    do_something_useful();
}

Где do_something_useful скомпилирован отдельно от кода в while l oop и reload_code подберет последнюю (скомпилированную) версию. Мне дали ссылку на другой ответ на этом сайте, в котором в основном говорилось, что

  1. do_something_useful следует скомпилировать как отдельную сборку
  2. the while l oop должен загрузить эту сборку во временный домен приложения и выгрузите весь домен приложения внутри reload_code.

После некоторого пробуждения с загадочными исключениями, я наконец получил, что это работает для моего игрушечного примера. Но для моего примера, не связанного с игрушкой, у меня был код, который выглядел примерно так:

object handle = init(); // get a handle to draw on the screen, or something
while(true) {
    sleep(naptime);
    reload_code(); // use magic?
    do_something_useful(handle);
}

Оказывается, объект дескриптора не сериализуем, поэтому вызов do_something_useful завершается неудачно. Это заставляет меня задуматься, может ли то, что я делаю, просто невозможно сделать в C# на CLR, и я должен попробовать какой-нибудь другой язык. (На JVM это потребовало бы возиться с загрузчиками классов, но классы с разными загрузчиками находятся в одной большой счастливой семье; здесь нет жестких границ, таких как домены приложений. В C можно было просто загружать и выгружать разделяемые библиотеки. Я ожидал, что C# каким-то образом сможет это сделать.)

...