Для контекста это продолжение этого вопроса:
Как я могу перезагрузить класс. net
Чтобы избежать проблем с перечитывая этот пост, моя проблема "высокого уровня" в том, что я хочу сделать это:
while(true) {
sleep(naptime);
reload_code(); // use magic?
do_something_useful();
}
Где do_something_useful
скомпилирован отдельно от кода в while l oop и reload_code
подберет последнюю (скомпилированную) версию. Мне дали ссылку на другой ответ на этом сайте, в котором в основном говорилось, что
do_something_useful
следует скомпилировать как отдельную сборку - 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# каким-то образом сможет это сделать.)