2011-01-01 14 views
8

Tengo una solución .net visual studio con una cantidad de proyectos (bibliotecas de clase y una aplicación web)."No se pudo cargar el archivo o ensamblado 'XXX.YYY' o una de sus dependencias. El sistema no puede encontrar el archivo especificado."

Realicé refracción que movía archivos entre proyectos, creaba nuevos proyectos, eliminaba los que no se usaban y renombraba algunos proyectos existentes.

La solución construye sin un problema, pero cuando corro la aplicación web, se produce la siguiente excepción:.

"No se pudo cargar el archivo o ensamblado 'XXX.YYY' o uno de sus dependencias El sistema no puede encontrar el archivo especificado. "

El proyecto llamado XXX.YYY que se eliminó en el refractoring superó un dll llamado XXX.YYY. Pero esto no se usa en ninguna parte de la aplicación. Eliminé el directorio obj de las aplicaciones web y la carpeta bin y reconstruí pero aún así ocurre.

¿Alguien tiene alguna idea de cuándo podría estar ocurriendo esto, algún consejo?

ACTUALIZACIÓN:

Actualización sobre mi problema. Cogí el código de lugar en otra computadora y lo ejecuté desde allí, y se compiló y ejecutó correctamente sin que se produzca este problema. Así que esto me hace pensar que el problema es con mi PC en lugar de con la base del código. Tal vez hay algo almacenado en caché en mi PC. Eliminé mis archivos temporales en "C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Archivos temporales ASP.NET" pero no tuve suerte.

Cualquier otra cosa que pueda almacenarse en la memoria caché u otra razón para que ocurra en mi PC.

nueva actualización

Otra actualización en esto. He ejecutado el mismo código en la máquina de otros desarrolladores y él no tiene un problema al ejecutarlo. ¡Así que definitivamente debe ser algo en mi máquina! Lo único diferente en nuestra máquina es que estoy ejecutando IIS7 con el grupo de aplicaciones de la aplicación en modo clásico. El otro desarrollador ejecuta IIS6.

2 nuevas piezas en la información. En primer lugar en mi httpmodules en mi web.config, tengo que eliminar un módulo http personalizado, antes de agregarlo. El otro desarrollador no tiene que hacer esto. En segundo lugar, he podido solucionar el problema "No se pudo cargar el archivo o ensamblar 'XXX.YYY' o uno de sus dependencias" a través de un "hackeo" que es solo una solución a corto plazo al crear una biblioteca de clases en mi proyecto llamado XXX .YYY e incluyendo las clases que se buscan, que son todos controles personalizados, es decir. heredando de System.Web.UI.WebControls.WebControl.

Cualquier otra pensamientos ....

+0

¿Intentó utilizar el reflector? – jgritty

+1

¿Intentó limpiar su directorio de archivos temporales ASP.NET? C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Archivos temporales de ASP.NET –

+0

@Harvey - intenté borrar los archivos temporales pero todavía no tuve suerte – amateur

Respuesta

0

¡Buenas noticias que he resuelto el problema! Tuve que volver a instalar mi entorno de tiempo de ejecución de .net. También eliminé sitios de IIS y volví a listar el sitio web. Cuando lo ejecuté, el problema no ocurrió y el sitio se ejecutó.

Muchísimas gracias a todos por su ayuda y asistencia, muy apreciadas. ¡Todos los consejos y la ayuda me orientaron en la dirección para resolver esto!

1

acaba de comprobar los proyectos de la estructura de configuración .. si hay un archivo DLL compilado de 64 bits en sus referencias y su principal proyecto es de 32 bits (o cualquier CPU y su máquina es de 32 bit) o ​​viceversa, obtendrá este error

+0

, ¿no arrojaría eso una excepción ** BadImageFormat **? – BrokenGlass

+0

@BrokenGlass - sí ... lo hace con esta descripción "No se pudo cargar el archivo o ensamblado" XXX.YYY, Versión = 1.0.XXX, Cultura = neutral, PublicKeyToken = null "o una de sus dependencias." –

1

Use Dependency Walker (depende) en todos sus EXEs y DLL para ver cuál tiene la dependencia que falta. Debe ejecutar depende del directorio de trabajo de su proyecto para obtener mejores resultados.

Una vez que sepas qué EXE/DLL es el culpable, ve a la configuración de ese proyecto y mira si allí se menciona la dependencia de la que se queja.

EDITAR: Otra cosa se me ocurrió hace unos minutos ... Si alguna de sus dependencias está "bloqueada" porque fueron marcadas como descargadas por algunos metaware de MS (cuando usa DL con el explorador de Inet, por ejemplo) que pueden evitar que se cargue código ejecutable. Mire las propiedades de sus ejecutables (DLL/EXE) con Windows Explorer y vea si tienen un botón de desbloqueo en la primera página. Si es así, haz clic en ese botón. Esto me tomó un tiempo para averiguarlo hace un tiempo, espero que ayude.

+0

Utilizando el explorador de Windows, hice clic derecho en todos los dll en el directorio bin y en las propiedades visualizadas. No vi bloquear/desbloquear en ningún lado. ¿Dónde debería verlo si es pertinente para esto? No he usado Dependency Walker antes, así que soy un novato en cuanto a cómo funciona esto. ¿Abro cada dll en mi directorio bin con él? (Nota: el directorio bin es el de la aplicación web, ¿tengo que hacerlo para todas las bibliotecas de clases? ¡Tengo más de 30!) – amateur

+0

Dependencia Walker resuelve la dependencia de DLL de la tabla de importación y exportación de PE, hasta donde yo sé. A menos que esté usando una DLL no administrada, no veo cómo el caminante de dependencia va a ayudar. ¿El último caminante de dependencias también puede recorrer la referencia de ensamblaje? –

+0

@Niall Collins: no hay opción de bloque, solo desbloquear. Si no lo ves, deberías estar bien. – JimR

0

Haga la búsqueda de solución para el texto "XXX.YYY" y elimine todas las ocurrencias. Tal vez lo has omitido en algún archivo web.config.

Además, puede verificar los archivos * .csproj si la búsqueda de la solución no encuentra nada. Básicamente son archivos de texto, por lo que no debería haber problemas para eliminar referencias.

+0

intenté buscar la solución completa (todos los archivos) para XXX.YYY, pero no encontré la suerte de encontrar referencias. gracias por su entrada – amateur

0

Simplemente le falta una dependencia. Es probable que una situación como el Proyecto A tenga una referencia al Proyecto B que tenga una referencia al Proyecto C. Su directorio de salida no cuenta con la DLL para el Proyecto C.

+0

Pero si este es el caso, la solución no se compilaría, ¿correcto? La solución está construyendo bien. – amateur

+0

@Niall No necesariamente. Todos los proyectos están en la misma solución, por lo que cada proyecto tiene sus referencias requeridas y todos están construidos en el orden necesario para construir las dependencias. Para una aplicación publicada, siempre y cuando la carpeta bin contenga todas las DLL requeridas, la aplicación se ejecutará, pero si falta una única DLL, verá el problema que está experimentando. ¿Está publicando la aplicación en IIS o simplemente depurando en VS? – mikesigs

+0

Interesante. Lo estoy ejecutando en mi IIS7 local en la PC de Windows 7. ¿Debería esto importar? – amateur

5

Existen dos posibles motivos.

1) Cuando ejecuta su aplicación web, todavía utiliza los ensamblajes antiguos en algún lugar de sus máquinas. Sus ensamblajes anteriores se referían al ensamblaje anterior "XXX.YYY".

2) El último archivo binario que ha construido todavía hace referencia al ensamblaje anterior "XXX.YYY".

Para saber qué ensamblajes utiliza su aplicación web, si está ejecutando un depurador, puede encontrarlo fácilmente desde la ventana de resultados. Deberían ser las primeras pocas líneas de la salida. Otra forma de averiguarlo es abrir las ventanas del Módulo en VS.NET IDE durante la depuración.

Si no puede depurarlo por alguna razón o tiene problemas para conectar un depurador, otra manera más fácil de hacerlo es usar fuslogvw. Le proporciona las ubicaciones exactas de todos los assemblis cargados con éxito, así como los ensamblajes que no pudo cargar. Asegúrese de ejecutar el fuslogvw como administrador en Windows 7.

Después de averiguar qué ensamblajes cargó con éxito su webapp, puede hacer ildasm en esos ensamblajes para ver qué ensamblajes están haciendo referencia. Necesitas revisarlos uno por uno, desafortunadamente.

Supongo que algunos de los ensamblados cargados con éxito provienen de algún lugar de la memoria caché ASP.NET o GAC.

+2

+1 para una educación. No sabía sobre fuslogvw. – JimR

+0

También quería mencionar el registrador de fusión, pero no recuerdo el nombre de la herramienta. – jgritty

1

Habilite el registro de diagnóstico para el resultado de compilación (Herramientas -> Opciones -> Compilación y ejecución -> Verbosidad del registro de salida -> Diagnóstico) y Cree la solución y vea desde donde Visual Studio selecciona el dll (somedll.dll versión xxx. yy). Ahora ejecute la aplicación y vea dónde está tratando de resolver el dll en tiempo de ejecución. (Windbg es una opción).

0

Ve a References en Solution Explorer en Visual Studio. Seleccione el conjunto que se está quejando. Selecciónelo y vaya a la opción de menú View y seleccione Property Window en la parte inferior. Mientras se selecciona el ensamblaje, vea sus propiedades en la ventana de propiedades y busque el valor Copy Local. Si su valor está establecido en False, configúrelo en True.Crea la solución y publícala. Debería resolver con éxito el problema.

Cuestiones relacionadas