.net exception-handling assembly-resolution assemblyresolve

.NET 4 carga ensamblajes diferentes de.NET 3.5



exception-handling assembly-resolution (2)

Cuando está migrando su aplicación de .NET 3.0, 3.5 a 4.0, entonces necesita incluir mylib.dll en su proyecto externamente y compilarlos o, si es posible, tiene el código fuente del ensamblaje y luego cambiarlo a .net 4.0

Con la migración a .net 4, comenzamos a enfrentar el problema con nuestra biblioteca. Supongamos que tenemos nuestra biblioteca MyLib.dll y hace referencia al ensamblado de interoperabilidad Interop.dll. Interop.dll tiene referencia a MissingInterop.dll.

Así que las referencias pueden mostrarse como: MyLib.dll -> Interop.dll -> MissingInterop.dll

En MyLib.dll usamos solo una parte de las clases de Interop.dll, por lo que nunca llamamos a nada que necesite MissingInterop.dll y en .net 3.5 funciona bien. Por eso no enviamos MissingInterop.dll con MyLib.dll.

Cuando usamos MyLib.dll del proceso que se ejecuta bajo la aplicación .net 4, se produce un error con la siguiente excepción:

FileNotFoundException: "No se pudo cargar el archivo o el ensamblado ''MissingInterop.dll, Versión = 1.0.0.0, Culture = neutral, PublicKeyToken = null'' o una de sus dependencias. El sistema no puede encontrar el archivo especificado." `

También me he dado cuenta de que Interop.dll hace referencia a otros archivos DLL que faltan, pero .net no intenta cargarlos. Y he encontrado la diferencia. Algunos tipos de MissingInterop.dll se usan en los parámetros del método en Interop.dll, mientras que los tipos de otras bibliotecas faltantes se usan solo como tipos de retorno de método, es decir, en Interop.dll puedo ver:

Class C1 MethodA : void (valuetype [MissingInterop]MissingAssembly.TypeA&) Class C2 get_Status : valuetype[AnotherMissingInterop]AnotherMissingAssembly.TypeB()

y .NET 4 intenta cargar MissingInterop.dll pero no intenta cargar AnotherMissingInterop.dll.

.NET 3.5 no intentó cargar ni MissingInterop.dll ni AnotherMissingInterop porque no se usan en la ruta de ejecución.

Sé que .NET 4 tiene nuevo Fusion pero no he encontrado un cambio tan rotundo descrito en ninguna parte. ¿Alguien sabe por qué .NET 4 intenta cargar algo que no es necesario? ¿Hay alguna manera de solucionar esto sin volver a compilar el código o agregar el archivo faltante?


Probablemente no (por experiencia). Hubo problemas similares con respecto a un paso anterior (no puedo recordar si era 2.0 -> 2.1 o 3.0 -> 3.1. Pero fue hace un tiempo). Teníamos máquinas que informaban que la versión anterior estaba instalada y que fallaba. Cuando limpiamos las instalaciones de red e instalamos la versión inferior, y luego la actualización, todo funcionó bien. Microsoft puede sacar un parche. Me sentiría inclinado a plantearlo con la EM. Usted tiene un error aparentemente bien investigado, y en tales circunstancias el contrato de soporte o no, son muy reacios a terminar cobrándole. (Mi experiencia de todos modos)