Pregunta

¿Alguien tiene alguna idea de qué causaría que el cargador de Fusion simplemente omita una DLL sin advertencia o reconocimiento?

Cuando intento hacer esto (en C #) desde una aplicación de línea de comandos

Assembly.LoadFrom("c:\\Deploy\\bin\\WebServices.dll")

Veo esto:

  

" No se puede cargar uno o más de los tipos solicitados. Recupere la propiedad LoaderExceptions para obtener más información. & Quot;

Esa DLL tiene una dependencia en Platform.DLL, pero la carga de esa dependencia falla, por lo que esta línea de código arroja una excepción. Cuando reviso el mensaje de carga del ensamblaje Fusion, esto es lo que veo:

=== Pre-bind state information ===
LOG: DisplayName = Platform, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null (Fully-specified)

...

LOG: This bind starts in LoadFrom load context.
WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load().
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\config\\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform.DLL.
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform/Platform.DLL.
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform.EXE.
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform/Platform.EXE.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform.DLL.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform/Platform.DLL.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform.EXE.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform/Platform.EXE.

El problema es que la DLL está presente en c: \ Deploy \ bin \ Platform.DLL , con la versión adecuada y sin clave pública firmada.

Cosas que he pensado:
1. ¿Tal vez es realmente una dependencia de Platform.DLL que está rota, causando este comportamiento? (Perseguí el árbol de dependencias en Reflector pero no encontré archivos DLL faltantes)
2. ¿Tal vez hay un desajuste de liberación / depuración, o una versión de 64 bits frente a 32 bits? pero todo fue construido en la misma máquina
3. Tal vez estoy leyendo mal los registros, pero ¿no debería detenerse cuando llega a un archivo DLL que encuentra? Tampoco veo el "exitoso" O el " fracasado " mensaje en este registro. Solo sé que falló debido a la excepción.

PS más detalles técnicos:
El entorno de la máquina es Windows 2008 de 64 bits, con .NET 2.0, 3.0 y amp; 3.5 instalado.
Esta misma aplicación se ejecuta bien en otra máquina (Vista de 32 bits), con la misma estructura de directorios y DLL, aunque se crearon en esa máquina

¿Fue útil?

Solución

Sí, debería detenerse cuando encuentre el dll requerido, de modo que el quinto " Intentando descargar ... " debería haberlo encontrado ...

Sin embargo, ¿desde dónde se ejecuta la aplicación de línea de comandos? Si es la carpeta Debug, entonces algunas cosas que puedes probar son

  1. Tener los archivos DLL dependientes en la misma carpeta
  2. Firme el ensamblaje y la referencia a través de un archivo .config en el siguiente formato

    <dependentAssembly>
        <assemblyIdentity name="WebServices.dll" publicKeyToken="<whatever this public key it>" />
        <codeBase version="1.0.0.0" href="..\WebServices.dll" />
    </dependentAssembly>
    
  3. Firma y luego coloca los ensamblajes dependientes en el GAC.

Podría estar muy lejos, pero eso es algunas cosas para probar.

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