.net visual-studio-2017 .net-standard .net-standard-1.4

.net - No se pudo cargar el archivo o el ensamblado ''System.ComponentModel.Annotations, Version=4.1.0.0



visual-studio-2017 .net-standard (5)

Tengo una biblioteca de clases .NET Standard 1.4 que hace referencia al paquete NuGet System.ComponentModel.Annotations (4.3.0).

Luego estoy haciendo referencia a esta biblioteca de clases desde un proyecto de prueba de .NET Framework 4.6.2. Se construye bien, pero en tiempo de ejecución me sale el siguiente error:

Se produjo la excepción System.IO.FileLoadException HResult = 0x80131040
Mensaje = No se pudo cargar el archivo o el ensamblado ''System.ComponentModel.Annotations, Version = 4.1.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a'' o una de sus dependencias. La definición del manifiesto del ensamblaje ubicado no coincide con la referencia del ensamblaje. (Excepción de HRESULT: 0x80131040)

Intenté agregar una referencia al paquete NuGet System.ComponentModel.Annotations (4.3.0) del proyecto net462, pero eso no hizo ninguna diferencia.

Intenté agregar una referencia a la biblioteca estándar de .NET del proyecto net462, pero aún así no tuve suerte.

¿Me estoy perdiendo de algo? ¿Se trata de un error conocido? Si es así, ¿hay algún problema?

¡Cualquier ayuda es muy apreciada!


Consiguió que funcionara utilizando la redirección de ensamblajes como se describe en: simplemente invoque FunctionsAssemblyResolver.RedirectAssembly() al principio de su programa. https://.com/a/50776946/2705777

using System.Reflection; using System.Diagnostics; using System.Linq; public class FunctionsAssemblyResolver { public static void RedirectAssembly() { var list = AppDomain.CurrentDomain.GetAssemblies().OrderByDescending(a => a.FullName).Select(a => a.FullName).ToList(); AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; } private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { var requestedAssembly = new AssemblyName(args.Name); Assembly assembly = null; AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve; try { assembly = Assembly.Load(requestedAssembly.Name); } catch (Exception ex) { } AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; return assembly; } }


En mi caso, estaba usando 4.0.0, así que lo arreglé agregando

<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="4.1.0.0" newVersion="4.0.0.0"/> </dependentAssembly>

Adaptar a su versión requerida.


En muchos casos, esto se puede resolver agregando el siguiente archivo csproj de su proyecto de prueba:

<PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>

Esto obliga al proceso de construcción a crear un archivo .dll.config en el directorio de salida con las redirecciones de enlace necesarias.

La razón es que los proyectos de prueba csproj "clásicos" son verdaderos "bibliotecas" y no se considera que necesiten redireccionamientos de enlace por defecto. Pero ejecutar pruebas unitarias requiere esto. Esto solo se convierte en un problema si los proyectos de referencia necesitan que las redirecciones funcionen correctamente. Esto generalmente funciona cuando se instalan directamente todos los paquetes NuGet que usa la biblioteca a la que se hace referencia, pero con el nuevo estilo PackageReference de los paquetes NuGet, no es así.

Vea otros casos en los que esta solución ha ayudado:

No se pudo cargar el archivo o el ensamblaje Microsoft.Extensions.DependencyInjection.Abstractions, Version = 1.1.0.0

Cuando se usa .Net Standard 1.4 en una biblioteca y .Net framework 4.6.1 en y aplicación, no se puede cargar el archivo System.IO.FileSystem, Version = 4.0.1.0


Para mí, ninguna de las otras soluciones funcionó.

Resolví esto agregando manualmente una referencia a System.ComponentModel.DataAnnotations (a través de proyecto -> Referencias), en lugar de dejar que Visual Studio lo maneje a través del menú de corrección rápida de bombillas.


Tuve un problema similar, pero ninguna de las respuestas anteriores me ayudó. Resulta que la solución es muy fácil, acabo de ejecutar el siguiente comando en el Administrador de paquetes:

Paquete de instalación System.ComponentModel.Annotations -Version 4.1.0