c# loaderlock

c# - Error de bloqueo del cargador



loaderlock (8)

ACTUALIZACIÓN PARA .NET 4.0 Y MARCOS MÁS RECIENTES

Esta es una pregunta antigua formulada en el momento de .Net 2.0, cuando el soporte para DLL de modo mixto tenía serios problemas de inicialización, propenso a interbloqueos aleatorios. A partir de .Net 4.0, la inicialización de los DLL de modo mixto ha cambiado. Ahora hay dos etapas separadas de inicialización:

  1. Inicialización nativa, llamada en el punto de entrada de la DLL, que incluye la configuración nativa de C ++ en tiempo de ejecución y la ejecución de su método DllMain.
  2. Inicialización gestionada, ejecutada automáticamente por el cargador del sistema.

Como el paso n. ° 2 se realiza fuera del bloqueo del cargador, no hay puntos muertos. Los detalles se describen en Initialization of Mixed Assemblies .

Para garantizar que su ensamblaje de modo mixto se pueda cargar desde un ejecutable nativo, lo único que debe verificar es que el método DllMain se declare como código nativo. #pragma unmanaged podría ayudar aquí:

#pragma unmanaged BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { ... // your implementation here }

También es importante que cualquier código que DllMain pueda llamar directa o indirectamente tampoco esté administrado. Tiene sentido limitar el tipo de funcionalidad utilizada por DllMain para rastrear todo el código accesible desde DllMain y asegurarse de que esté todo compilado con #pragma unmanaged .

El compilador ayuda un poco al advertirle a C4747 si detecta que DllMain no está declarado como no administrado:

1> Generating Code... 1>E:/src/mixedmodedll/dllmain.cpp : warning C4747: Calling managed ''DllMain'': Managed code may not be run under loader lock, including the DLL entrypoint and calls reached from the DLL entrypoint

Sin embargo, el compilador no generará advertencias si DllMain llama indirectamente a alguna otra función administrada, por lo que debe asegurarse de que nunca suceda, de lo contrario, su aplicación podría bloquearse aleatoriamente.

Estoy construyendo en C ++ dll, escribiendo código en C #.

Me sale un error, diciendo

Se detectó LoaderLock Mensaje: intento de ejecución administrada dentro del bloqueo del cargador del sistema operativo. No intente ejecutar código administrado dentro de una función de inicialización de DllMain o de imagen ya que al hacerlo puede hacer que la aplicación se cuelgue.

Intenté detectar qué significa exactamente este error, pero estoy dibujando artículos sin sentido, sobre todo diciendo que es solo una advertencia y que debería apagarlo en Visual Studio. Las otras soluciones parecen deberse a iTunes, o este problema ocurre cuando se programa con DirectX. Mi problema no está conectado a ninguno de los dos.

¿Alguien puede explicar, qué significa esto realmente?



Estoy construyendo una DLL CLR de C ++ (MSVS2015) que tiene que realizar llamadas a una DLL no administrada y definir un código no administrado. Utilizo #pragma managed y #pragma unmanaged para controlar en qué modo se encuentra para un área determinada del código.

En mi caso, simplemente puse #pragma sin gestionar en frente de mi DllMain () y esto resolvió el problema. Parecía pensar que quería una versión administrada de DllMain ().


Hace poco recibí este error al crear una instancia de un COM-Object escrito en código nativo:

m_ComObject = Activator.CreateInstance(Type.GetTypeFromProgID("Fancy.McDancy"));

Esto condujo al error descrito. Se detectó "LoaderLock": se lanzó una excepción.

Superé este error creando la instancia del objeto en un hilo adicional:

ThreadStart threadRef = new ThreadStart(delegate { m_ComObject = Activator.CreateInstance(Type.GetTypeFromProgID("Fancy.McDancy")); }); Thread myThread = new Thread(threadRef); myThread.Start(); myThread.Join(); // for synchronization


La idea general del bloqueo de cargador: el sistema ejecuta el código en DllMain dentro de un bloqueo (como en - bloqueo de sincronización). Por lo tanto, ejecutar un código no trivial dentro de DllMain es "pedir un punto muerto", como se describe here .

La pregunta es, ¿por qué intentas ejecutar código dentro de DllMain? ¿Es crucial que este código se ejecute dentro del contexto de DllMain o puede generar un nuevo hilo y ejecutar el código en él, y no esperar a que el código termine la ejecución dentro de DllMain?

Creo que el problema con el código administrado específicamente, es que ejecutar el código administrado puede implicar cargar el CLR y cosas por el estilo y no hay forma de saber qué podría suceder allí que resultaría en un punto muerto ... No haría caso al consejo de "desactivar esta advertencia "Si fuera usted porque la mayoría de las posibilidades es que encontrará que sus aplicaciones se cuelgan inesperadamente en algunos escenarios.


Presione ctr d + e Luego, Expenda el Nodo de asistentes de depuración administrados. Luego desactive la opción LoaderLock.

Espero que esto te ayudará.


debe ir al menú Depurar -> Excepciones, abrir los Asistentes de depuración gestionados, buscar Bloqueo de cargador y desmarcar


recuerde amablemente a los usuarios de VS2017 que necesita deshabilitar " ayudante de excepción " en lugar de " asistente de excepción " (antes VS2017) para evitar el error de bloqueo del cargador, cuya ruta de configuración es Depurar-> Excepción . Solo me encontré con este problema y perdí 2 horas buscando soluciones ...