web-dev-qa-db-fra.com

Le site Web .Net 4.6 ne charge pas les assemblages de référence correctement

J'ai un projet Web dans Visual Studio 2013, y compris plusieurs projets de bibliothèque.

Le problème est que l’ajout d’une référence (par exemple, System.Collection, System.Net) au projet Web est ajouté en tant qu’assemblage de référence à partir de C:\Program Files (x86)\Reference Assemblies\Microsoft; lorsqu’il est chargé dans IIS, il ne charge pas correctement la mise en œuvre Assemblée (de GAC). Exemple d'erreur suit.

[BadImageFormatException: Cannot load a reference Assembly for execution.]

[BadImageFormatException: Could not load file or Assembly 'System.Collections' or one of its dependencies. Reference assemblies should not be loaded for execution.  They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)]
   System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
   System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +34
   System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +152
   System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) +77
   System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +16
   System.Reflection.Assembly.Load(String assemblyString) +28
   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +38

[ConfigurationErrorsException: Could not load file or Assembly 'System.Collections' or one of its dependencies. Reference assemblies should not be loaded for execution.  They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)]
   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +728
   System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +196
   System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +45
   System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +172
   System.Web.Compilation.BuildManager.GetPreStartInitMethodsFromReferencedAssemblies() +91
   System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath, Boolean& isRefAssemblyLoaded) +111
   System.Web.Compilation.BuildManager.ExecutePreAppStart() +156
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +624

[HttpException (0x80004005): Could not load file or Assembly 'System.Collections' or one of its dependencies. Reference assemblies should not be loaded for execution.  They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +659
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +95
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +189

Supprimer les dll de référence du dossier bin résout le problème, mais je ne sais pas ce qui doit être changé pour résoudre ce problème correctement.

16
Sam

Résolution:

Mes projets de bibliothèque faisaient référence à certaines bibliothèques principales (System.* etc.) avec l'option RequiredTargetFramework définie sur 3.5. Cela n'était évident que dans le fichier csproj, exemple:

<Reference Include="System.Core">
  <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>

Causant ainsi toutes sortes de problèmes avec les versions .net, visual studio essayait de les trier en ajoutant des redirections de liaison dans mon web.config pour les faire pointer en v4 (et inclure les assemblys de référence), sans succès.

La suppression de tous les éléments RequiredTargetFramework des fichiers csproj a résolu le problème.

4
Sam

Je supprime le paquet du dossier/Bin  

System.Collections et System.Collections.Concurrent

et reconstruire le projet 

ça marche.

29
Brayan Aguilar

Chaque fois que vous voyez BadImageFormatException, vous avez un problème de compatibilité de format binaire. Votre pool IIS peut être configuré pour exécuter un pool 32 bits et vos assemblys sont construits en x64, ou inversement. Ou peut-être essayez-vous d'exécuter des assemblys x64 sur une machine 32 bits. Peut-être avez-vous une machine x64, des assemblages construits par anycpu mais certains assemblages tiers sont construits strictement en code 32 bits.

C'est un de ceux-ci, ou similaire

Maintenant, "usr" a un bon point ici. Vous avez Cannot load a reference Assembly for execution mais dans le contexte avec BadImageFormatException. Je me demande si cela se produit au moment de la compilation. Pour cela, essayez d’ajouter ceci à web.config

<compilation>
  <assemblies>
      <remove Assembly="System.Collections" />
  . . . . 

Ou si vous avez 

<add Assembly="System.Collections. . . ."  />

Essayez de l'enlever d'abord

Maintenant, il est normal que GAC soit l’emplacement préféré comme référence, à moins que vous ne fournissiez probing settings

4
T.S.

Cela m'est arrivé après la mise à jour de VS 15.8. La définition de "Copy Local" sur false a résolu le problème de chaque assembly qui m'a généré l'erreur. En outre, j'ai supprimé (à la main) les balises "<Private>" dupliquées dans .csproj.

0
Felipe Moura

Dans mon cas, j'ai ajouté le package de nuget System.Collections à mon projet asp.net 4.6.1 et, pour une raison quelconque, il n'était pas référencé dans le fichier csproj. J'ai édité manuellement le fichier csproj et ajouté la référence. Reloaded, et, voila, a travaillé!

0
Marco Alves

Ce problème se produit souvent si vos redirections de liaison font référence à des versions antérieures à celles sur lesquelles reposent vos références, ce qui peut se produire après la mise à jour de packages (par exemple, via NuGet). Pour résoudre généralement, j'ai ajouté une série d'étapes comme réponse ici . Cependant, pour ce problème particulier, je recommande de suivre spécifiquement l'étape 5 qui est:

Supprimez toutes les liaisons Assembly de tous les fichiers app.config et Web.config, puis générez votre solution. Les liaisons app.config ne sont plus nécessaires. Les liaisons Web.config seront rajoutées à l'étape suivante, mais leur suppression préalable permet d'éviter toute version obsolète de vos liaisons.

0
Neo