Ответ 1
AppDomains - это чистая управляемая конструкция кода. В собственном коде ничего подобного не существует, и Windows не знает об этом. Таким образом, область для загруженной собственной DLL - это процесс. Технически, маркерщик pinvoke мог ссылаться на подсчет DLL и отслеживать, какой именно AppDomain запускал загрузку DLL. Однако он не может определить, работает ли какой-либо собственный код, который использует эту DLL. Родительский код, который может быть запущен вызовом, сделанным из кода в другом AppDomain, возможно, косвенно через маршалированный делегат.
Очевидно, что катастрофа удаляется, если менеджер AppDomain выгружает DLL, которая использовалась таким образом, что неприятно и невозможно диагностировать AccessViolation. Особенно неприятно, поскольку он может запускать долгое время после того, как AppDomain получил разгрузку.
Таким образом, маршаллер не выполняет такой подсчет, DLL остается загруженным. Только вы можете предоставить гарантию, что этого не может быть, у вас есть определенный контроль над тем, какой код работает в DLL и как он запускается. Вы можете заставить DLL разгружаться, но это требует взлома. Pinvoke LoadLibrary(), чтобы получить доступ к DLL. И pinvoke FreeLibrary() дважды, чтобы принудительно его выгрузить. Ни Windows, ни CLR не могут видеть, что вы обманываете. Вы должны убедиться, что после этого нельзя использовать DLL.