Вот сообщение в блоге MSDN , в котором перечислены некоторые причины, почему нет. Основная проблема:
Во-первых, вы запускаете этот код в домене приложения (да!). Это означает, что потенциально существуют сайты вызовов и стеки вызовов с адресами в них, которые ожидают продолжения работы. Вы когда-нибудь получали нарушение прав доступа, когда ваш EIP указывает на 0x ???????? Это пример, когда кто-то освобождает DLL, страницы не отображаются системой памяти, а затем вы пытаетесь перейти к ней. Обычно это происходит в COM, когда у вас возникает ошибка подсчета ссылок и вы вызываете метод интерфейса. Мы не можем позволить себе потерять управляемый код. Мы должны гарантировать, что мы знаем весь код, который вы выполняете, и что он является безопасным и проверяемым. Это означает явное отслеживание всего, что может использовать этот код, включая объекты GC и оболочки взаимодействия COM. Это отслеживание обрабатывается сегодня вокруг границы домена приложения. Отслеживание на уровне сборки становится довольно дорогим.
Я обобщу это на языке более высокого уровня:
В основном, вещи, которые не работают, если вы просто удаляете исполняемый код, не работают на уровне управления. Вы бы скомпилировали код, который указывает на другой скомпилированный код, которого больше нет, поэтому ваш код попадет в область, которая недопустима и, возможно, содержит произвольные данные.
Это недопустимо в управляемом коде, потому что вещи должны быть безопасными и иметь некоторые гарантии вокруг них. Одна из этих гарантий заключается в том, что ваш код не может выполнять произвольные разделы памяти.
Чтобы решить эту проблему должным образом, вам придется отслеживать гораздо больше вещей более внимательно, и это потребует больших затрат. Альтернатива состоит в том, чтобы отслеживать эти вещи только на границах домена приложения, что и делается.