Los AppDomains son una construcción de código administrado puro. Nada de eso existe en el código nativo, y Windows tampoco tiene idea al respecto. Entonces, el alcance de una DLL nativa cargada es el proceso. Técnicamente, el marshaller de Pinvoke podría referenciar el conteo de la DLL y hacer un seguimiento exacto de qué AppDomain desencadenó la carga de la DLL. Sin embargo, no puede decir si se está ejecutando algún código nativo que use esa DLL. Código nativo que podría iniciarse mediante una llamada hecha desde el código en otro AppDomain, posiblemente indirectamente a través de un delegado clasificado.
Claramente el desastre golpea si el administrador AppDomain descarga una DLL que se usa de esa manera, eso es desagradable e imposible de diagnosticar AccessViolation. Particularmente desagradable, ya que puede desencadenarse mucho tiempo después de que se descargó AppDomain.
Así que el Marshaller no implementa ese tipo de conteo, la DLL permanece cargada. Solo usted puede proporcionar la garantía de que esto no puede suceder, usted tiene cierto grado de control sobre exactamente qué código se ejecuta en el DLL y cómo se inicia. Usted puede forzar la DLL para descargar, pero requiere un hack. Pinvoke LoadLibrary() usted mismo para obtener un control de la DLL. Y pinvoke FreeLibrary() dos veces para descargarlo por la fuerza. Ni Windows ni el CLR no pueden ver que estás haciendo trampa. Usted debe asegurarse de que la DLL no se puede utilizar después de esto.
+1 buen truco :-) – Yahia
¡Hola, solo quería decir gracias por la respuesta muy clara! – user472875