referencia de ensamblado no encontrado, a pesar de que el conjunto está en el mismo directorio

StackOverflow https://stackoverflow.com/questions/3761960

Pregunta

Actualmente estamos desarrollando un complemento para algún software. Decidimos desarrollar en .NET, a pesar de que la aplicación está escrita en un lenguaje nativo. Ya que había algunos problemas para crear directamente la interfaz externa en .NET, decidimos construir un puente de DLL en C ++ / CLI, que hace algo de inicialización básica y luego carga ensamblaje nuestra administrado y crea un control de usuario de eso.

En un archivo de complemento ini, el C ++ / CLI DLL se hace referencia por su nombre, por lo que la aplicación se carga desde allí. El .NET DLL, sin embargo, se acaba de hacer referencia desde el C ++ / CLI DLL (como referencia administrado), por lo que los tipos exportados están disponibles. En esta configuración, howerver, la aplicación se bloquea la carga de la DLL de .NET.

rápidamente encontró que podíamos simplemente suscribirse al evento AppDomain.AssemblyResolve para cargar el ensamblaje .NET desde el mismo directorio en el que el C ++ / CLI DLL es, por lo que el problema se resuelve en sí.

La pregunta real es: ¿Por qué no el cargador de encontrar el .NET DLL, a pesar de que está en el mismo directorio que el ensamblaje referencia a ella? Siempre que esperaba que las asambleas de carga buscará primero en el mismo directorio, en lugar de en el directorio de trabajo actual. ¿Por qué un ejecutable encontrar una asamblea si cambia su directorio de trabajo, entonces? O son cosas diferentes si el CLR se invoca mediante la carga de un C ++ / CLI de montaje (en lugar de una aplicación administrada puro)?

¿Fue útil?

Solución

Yo recomendaría que use fuslogvw.exe para el análisis de problemas de este tipo:

Fuslogvw.exe y diagnóstico. NET montaje cuestiones vinculante

Y, por supuesto, la herramienta de propósito general para el análisis de problemas con los archivos no encontrado:

Monitor de procesos

Otros consejos

La ruta de sondeo para las asambleas llegar a ser un poco impredecible cuando un EXE no administrado se inicia el proceso. El hecho de que carga un C ++ / CLI DLL, quizás a través de LoadLibrary o SetDllDirectory, hace no en modo alguno a la trayectoria de sondeo para el CLR.

Pero eso es sólo una suposición. No hay necesidad de adivinar cuando se mira a la salida producida por Fuslogvw.exe. Se le muestra exactamente lo que está siendo investigado y qué políticas se aplican. A solucionar el problema con un archivo app.exe.config (elemento de sondeo) o de hecho por AssemblyResolve.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top