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