Ну не совсем зашита. В любой следующей версии дотнета, они могут сделать выгрузку модулей как в Яве - сборщиком мусора. Если модуль перестал быть кому-то нужен сборщик мусора может его выгрузить. Теоретически это ничему не противоречит.
-----------
Чтоб два раза не вставать
заодно скажу и про размер моего модуля...
Простая програмка-прослойка: получает сообщения по одному протоколу, переделывает их в сообщения другого протокола и наоборот (сообщения едут в обе стороны), причём не 1:1, а сложно (одна команда одного протокола означает серию из нескольких запросов-ответов другого протокола). Поскольку конвертация 1:1 невозможна, то программа должна помнить своё состояние.
Архитектурно программа очень проста: есть структура данных для запоминания состояния и куча процедур изменяющих это состояние при получении сообщений.
Сложность тупо кроется в размере.
Структура данных состоит примерно из 60 типов основных объектов и ещё нескольких десятков вспомогательных (из других библиотек). Все основные типы объектов завязаны друг с другом (объекты ссылаются с помощью указателей). В первом протоколе 345 типов сообщений и ещё несколько сотен структур из которых эти сообщения состоят. Во втором протоколе 140 типов сообщений и ещё несколько десятков структур из которых эти сообщения состоят.
Считаем модули:
1) Модуль описывающий сообщения протокола-1 (35'372 строчек).
2) Модуль описывающий сообщения протокола-2 (7'817 строчек).
3) Модуль описывающий структуру данных чтоб помнить состояние. Включает код процедур вставки/поиска/удаления элементов (14'802 строчек).
4) Модуль для кучи процедур, которые обрабатывают сообщения, изменяют структуру данных (13'429 строчек).
5) Модуль загрузчик (402 строчки).
Еще есть несколько десятков вспомогательных (библиотечных) модулей. Все объекты после "смерти" кэшируются для повторного использования, соответственно есть код который это обеспечивает.