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.
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.
Je supprime le paquet du dossier/Bin
System.Collections et System.Collections.Concurrent
et reconstruire le projet
ça marche.
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
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.
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é!
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.