72 votes

Impossible de charger le fichier ou l'assemblage "System.ComponentModel.Annotations, Version=4.1.0.0".

J'ai une bibliothèque de classes .NET Standard 1.4 qui fait référence au paquet NuGet System.ComponentModel.Annotations (4.3.0).

Je fais ensuite référence à cette bibliothèque de classes à partir d'un projet de test .NET Framework 4.6.2. Il se construit bien, mais au moment de l'exécution, j'obtiens l'erreur suivante :

System.IO.FileLoadException s'est produit HResult=0x80131040
Message= Impossible de charger le fichier ou l'assemblage System.ComponentModel.Annotations, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' ou l'une de ses dépendances. La définition du manifeste de l'assemblage définition du manifeste de l'assemblage localisé ne correspond pas à l'assemblage d'assemblage. (Exception de HRESULT : 0x80131040)

J'ai essayé d'ajouter une référence au paquet NuGet System.ComponentModel.Annotations (4.3.0) du projet net462, mais cela n'a fait aucune différence.

J'ai essayé d'ajouter une référence à la bibliothèque .NET Standard du projet net462, mais toujours pas de chance.

Est-ce que quelque chose m'échappe ? S'agit-il d'un bogue connu ? Si oui, existe-t-il un moyen de le contourner ?

Toute aide est la bienvenue !

0 votes

Utiliser le Attribut bindingRedirect dans app.config pour forcer l'utilisation de la librairie 4.3.0.0

26 votes

Pour tous ceux qui ne disposent pas de la Version=4.2.0.0 : L'installation de System.ComponentModel.Annotations 4.4.1 à partir de la galerie NuGet a réglé le problème pour moi.

0 votes

@user764754 Merci beaucoup !

64voto

Martin Ullrich Points 5894

Dans de nombreux cas, ce problème peut être résolu en ajoutant le code suivant au fichier csproj de votre projet de test :

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

Cela oblige le processus de construction à créer un .dll.config dans le répertoire de sortie avec les redirections nécessaires.

La raison en est que les projets de test csproj "classiques" sont de véritables "bibliothèques" et ne sont pas considérés comme nécessitant des redirections de liaison par défaut. Mais l'exécution de tests unitaires le nécessite. Cela ne devient un problème que si les projets référencés ont besoin de ces redirections pour fonctionner correctement. Cela fonctionne généralement en installant directement tous les paquets NuGet que la bibliothèque référencée utilise, mais avec la nouvelle fonction PackageReference des paquets NuGet, il ne le fait pas.

Voir d'autres cas où cette solution a été utile :

Impossible de charger le fichier ou l'assemblage Microsoft.Extensions.DependencyInjection.Abstractions, Version=1.1.0.0

Lors de l'utilisation de .Net Standard 1.4 dans une bibliothèque et de .Net Framework 4.6.1 dans une application, impossible de charger le fichier System.IO.FileSystem, Version=4.0.1.0.

8 votes

Cela ne fonctionne pas avec les applications Web .NET 4.6.1. Cette question semble être un problème constant lorsque l'on développe contre une application Web. La seule chose que j'ai pu faire et qui a fonctionné est de recompiler mon application Web et de la décharger de la solution avant de déboguer IIS manuellement. C'est vraiment pénible à gérer.

2 votes

Je peux confirmer que cela ne fonctionne pas dans les applications Web .Net 4.6.1.

0 votes

Dans ma solution WPF - WCF - SQL server - j'ai changé dans app.config <dependentAssembly> <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.5.0" /> </dependentAssembly>

21voto

Lukasz Cokot Points 306

J'ai eu un problème similaire mais aucune des réponses ci-dessus ne m'a aidé. Il s'avère que la solution est très facile, j'ai juste exécuté la commande suivante dans le gestionnaire de paquets :

Installer-Package System.ComponentModel.Annotations -Version 4.1.0

2 votes

Ce n'est pas une solution très satisfaisante, mais cela a fonctionné pour moi.

0 votes

Au moment de la rédaction, j'ai dû utiliser la version 4.4.1.

13voto

Guillaume Points 194

Dans mon cas, j'utilisais la version 4.0.0, donc j'ai corrigé le problème en ajoutant dans

<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>

Adaptez à votre version requise.

0 votes

Si le changement apporté par ma réponse est appliqué, cette redirection de liaison devrait être générée automatiquement par msbuild lorsqu'il unifie les références d'assemblage pendant la compilation.

2 votes

Merci pour moi c'était <bindingRedirect oldVersion="4.2.0.0" newVersion="4.2.1.0"/>

0 votes

Dans mon cas, j'ai créé une application console avec .NET Framework 4.7.2, initialement avec une transformation app.config (pour Debug/Release), puis j'ai ajouté le paquet Microsoft,EntityFrameworkCore.Sqlite 2.1.4 NuGet, (VS 2017 15.8.5). Il m'a fallu un peu plus de temps pour découvrir que les transformations app.config existantes ont en quelque sorte cassé les redirections de liaison au moment de l'exécution. (Après avoir supprimé les transformations, cela a commencé à fonctionner).

3voto

Neil Points 45

J'ai réussi à le faire fonctionner en utilisant la redirection d'assemblage comme décrit dans : il suffit d'invoquer FunctionsAssemblyResolver.RedirectAssembly() au début de votre programme. 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;
    }

}

0 votes

C'est en gros ce que fait BenchmarkDotNet. github.com/dotnet/BenchmarkDotNet/blob/

0voto

Rich Points 370

Pour moi, aucune des autres solutions n'a fonctionné.

J'ai résolu ce problème en ajoutant manuellement une référence à System.ComponentModel.DataAnnotations (via projet -> Références), plutôt que de laisser Visual Studio s'en charger via le menu de correction rapide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X