Tengo una biblioteca de clases .NET Standard 1.4 que hace referencia al paquete NuGet System.ComponentModel.Annotations (4.3.0).
Luego hago referencia a esta biblioteca de clases de un proyecto de prueba de .NET Framework 4.6.2. Se construye bien, pero en tiempo de ejecución me sale el siguiente error:
System.IO.FileLoadException ocurrió HResult=0x80131040
Mensaje = No se pudo cargar el archivo o ensamblado 'System.ComponentModel.Annotations, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' o una de sus dependencias. La definición del manifiesto del ensamblado ubicado no coincide con la referencia del ensamblado. (Excepción de HRESULT: 0x80131040)
Intenté agregar una referencia al paquete NuGet System.ComponentModel.Annotations (4.3.0) del proyecto net462, pero eso no supuso ninguna diferencia.
Intenté agregar una referencia a la biblioteca .NET Standard del proyecto net462, pero aún no tuve suerte.
¿Me estoy perdiendo de algo? ¿Es este un error conocido? Si es así, ¿hay alguna solución?
¡Cualquier ayuda es muy apreciada!
En muchos casos, esto se puede resolver agregando el siguiente código al archivo csproj de su proyecto de prueba:
<PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup> Esto obliga al proceso de compilació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 verdaderas "bibliotecas" y no se considera que necesiten redireccionamientos vinculantes de forma predeterminada. Pero ejecutar pruebas unitarias requiere esto. Esto solo se convierte en un problema si los proyectos a los que se hace referencia necesitan esos redireccionamientos para funcionar correctamente. Esto suele funcionar cuando se instalan directamente todos los paquetes de NuGet que usa la biblioteca a la que se hace referencia, pero no es así con el nuevo estilo PackageReference de los paquetes de NuGet.
Vea otros casos en los que esta solución ha ayudado:
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>Adáptese a su versión requerida.
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:
Install-Package System.ComponentModel.Annotations -Versión 4.1.0
Lo hice funcionar usando la redirección de ensamblaje como se describe en: simplemente invoque FunctionsAssemblyResolver.RedirectAssembly() al comienzo de su programa. https://stackoverflow.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; } }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 solución rápida de la bombilla.
En realidad, esto es mucho más fácil que piratear archivos de configuración. Hackear archivos de configuración da un poco de miedo; ¡puede que te pierdas algo! Deje que el IDE lo haga por usted, ¡con suerte lo hará bien!
¡Ahora se ejecutan mis pruebas unitarias! ¡Increíble!
Todavía es posible que necesite usar la respuesta de @Guillaume si tiene archivos app.config en su proyecto de prueba de unidad.
Agregue el ensamblaje dependentAssembly a continuación en su archivo web.Config o app.Config
La siguiente configuración se agrega en la configuration --> tiempo de runtime --> nodo de enlace de assemblyBinding en:
<dependentAssembly> <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" /> </dependentAssembly>Crédito a @MiguelSlv ya que mi caso tenía que ver con el uso de una redirección de enlace adecuada. Sin embargo, asegúrese de que cuando implemente su aplicación en versión beta o producción, la redirección de enlace esté en su web.config implementado (no solo en su entorno de desarrollo). Terminé usando la siguiente redirección de enlace para el paquete NuGet System.ComponentModel.Annotations 5.0.0 que se usa en un proyecto de clase .NET Standard 2.0 que consume mi aplicación web **ASP.NET MVC (.NET Framework 4.7.1 )
<dependentAssembly> <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" /> </dependentAssembly>Tenga en cuenta que 4.2.1.0 es la versión que se muestra en propiedades, mientras que 5.0.0 es la versión del paquete NuGet.
Se corrigió esto instalando la misma versión de System.ComponentModel.Annotations que quiero usar en todos los proyectos de la solución.
También para el error de la versión 4.2.0.0 , esto se solucionó para mí en web.config :
<dependentAssembly> <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.6.0" /> </dependentAssembly> </assemblyBinding>Solucioné este error haciendo el comando Limpiar solución en Visual Studio 2019.
Esto suele suceder cuando Visual Studio no puede averiguar el enlace vinculante Redirect.
Lo más probable es que la causa sea que la versión del nugget no coincide con la versión de la biblioteca producida.
Para arreglar haz esto:
Desde la consola de administración de paquetes, haga lo siguiente:
Get-Project –All | Add-BindingRedirect
para regenerar la configuración de assemblyBinding en el archivo de configuración
Si no lo solucionó, agregue manualmente la redirección de enlace:
<dependentAssembly> <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-X" newVersion="Y" /> </dependentAssembly>donde:
Tengo este problema al implementar una función auxiliar que redirige el ensamblaje al principio (que se sugirió en esta respuesta ):
public static class FunctionsAssemblyResolver { #region Public Methods public static void RedirectAssembly() { AppDomain.CurrentDomain.AssemblyResolve += ResolveAssemblyOnCurrentDomain; } #endregion Public Methods #region Private Methods private static Assembly ResolveAssemblyOnCurrentDomain(object sender, ResolveEventArgs args) { var requestedAssembly = new AssemblyName(args.Name); var assembly = default(Assembly); AppDomain.CurrentDomain.AssemblyResolve -= ResolveAssemblyOnCurrentDomain; try { assembly = Assembly.Load(requestedAssembly.Name); } catch { } AppDomain.CurrentDomain.AssemblyResolve += ResolveAssemblyOnCurrentDomain; return assembly; } #endregion Private Methods }