Estoy construyendo en C ++ dll, escribiendo código en C #.
Me sale un error diciendo
Se detectó LoaderLock Mensaje: Intentando ejecución administrada dentro del bloqueo de OS Loader. No intente ejecutar código administrado dentro de una función de inicialización de imagen o DllMain ya que hacerlo puede hacer que la aplicación se bloquee.
Intenté buscar qué significa exactamente este error, pero estoy dibujando artículos sin sentido, en su mayoría diciendo que es solo una advertencia, y debería desactivarlo en Visual Studio. Las otras soluciones parecen deberse a ITunes, o este problema se produce al programar con DirectX. Mi problema no está relacionado con ninguno.
¿Alguien puede explicar qué significa esto realmente?
c#
loaderlock
Devdatta Tengshe
fuente
fuente

Respuestas:
debe ir al menú Depurar -> Excepciones, abrir los Asistentes de depuración administrados, buscar LoaderLock y desmarcar
fuente
Debug->Windows->Exception Settings. El resto es igual conManaged Debugging Assistants \ LoaderLockLa idea general del bloqueo del cargador: el sistema ejecuta el código en DllMain dentro de un bloqueo (como en el bloqueo de sincronización). Por lo tanto, ejecutar código no trivial dentro de DllMain es "solicitar un interbloqueo", como se describe aquí .
La pregunta es, ¿por qué intenta 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 de ejecutarse dentro de DllMain?
Creo que el problema con el código administrado específicamente, es que ejecutar código administrado podría implicar cargar el CLR y cosas por el estilo y no se sabe qué podría suceder allí que resultaría en un punto muerto ... No prestaría atención al consejo de "deshabilitar esta advertencia "si yo fuera usted, porque la mayoría de las posibilidades es que sus aplicaciones se cuelguen inesperadamente en algunos escenarios.
fuente
ACTUALIZACIÓN PARA .NET 4.0 Y MÁS RECIENTES MARCOS
Esta es una vieja pregunta que se hacía en el momento de .Net 2.0, cuando el soporte para DLL de modo mixto tenía serios problemas de inicialización, propensos a bloqueos aleatorios. A partir de .Net 4.0, la inicialización de las DLL de modo mixto ha cambiado. Ahora hay dos etapas separadas de inicialización:
Dado que el paso 2 se realiza fuera del bloqueo del cargador, no hay puntos muertos. Los detalles se describen en Inicialización de ensamblajes mixtos .
Para asegurarse de que su ensamblado de modo mixto se pueda cargar desde un ejecutable nativo, lo único que necesita verificar es que el método DllMain esté declarado como código nativo.
#pragma unmanagedpodría ayudar aquí:También es importante que cualquier código al que DllMain pueda llamar directa o indirectamente tampoco esté administrado. Tiene sentido limitar el tipo de funcionalidad utilizada por DllMain para que pueda rastrear todo el código accesible desde DllMain y asegurarse de que todo esté compilado
#pragma unmanaged.El compilador ayuda un poco al advertirle a C4747 si detecta que DllMain no está declarado como no administrado:
Sin embargo, el compilador no generará ninguna advertencia si DllMain llama indirectamente a alguna otra función administrada, por lo que debe asegurarse de que eso nunca suceda, de lo contrario, su aplicación podría bloquearse aleatoriamente.
fuente
Presione ctr d + e Luego, gaste el nodo de asistentes de depuración administrados. Luego desmarcó LoaderLock.
Espero que esto te ayudará.
fuente
recuerde amablemente a los usuarios de VS2017 que debe deshabilitar el " asistente de excepción " en lugar del " asistente de excepción " (antes de VS2017) para evitar el error de bloqueo del cargador, cuya ruta de configuración es Debug-> Exception . Simplemente corrí con este problema y perdí 2 horas buscando soluciones ...
fuente
Recientemente recibí este error al crear una instancia de un objeto COM escrito en código nativo:
Esto condujo al error descrito. Se detectó un "LoaderLock": se lanzó una excepción.
Superé este error creando la instancia de objeto en un hilo adicional:
fuente
Estoy construyendo una DLL C ++ CLR (MSVS2015) que tiene que hacer llamadas a una DLL no administrada y definir código no administrado. Utilizo #pragma administrado y #pragma no administrado para controlar en qué modo se encuentra para un área determinada del código.
En mi caso, simplemente puse #pragma sin administrar frente a mi DllMain () y esto resolvió el problema. Parecía estar pensando que quería una versión administrada de DllMain ().
fuente
Este problema se produce debido a la forma en que el depurador de Visual Studio ejecuta aplicaciones administradas que utilizan Microsoft Foundation Classes versión 8.0 en uno o más archivos DLL.
Tenga una lectura completa en: http://msdn.microsoft.com/en-us/library/aa290048(vs.71).aspx
fuente
La ruta de configuración en mi instancia de Visual Studio 2017 es Depurar -> Windows -> Configuración de excepción. La "ventana" de configuración de excepciones apareció en el grupo de pestañas inferior (a diferencia de una ventana separada), me tomó un tiempo darme cuenta. Busque "cargador".
fuente