.Net 4.6 веб-сайт не загружает Reference Assemblies правильно

У меня есть веб-проект в Visual Studio 2013, в том числе несколько проектов библиотеки.

Проблема заключается в том, что добавление ссылки (то есть System.Collection, System.Net) в веб-проект добавляется как "сборка ссылок" из C:\Program Files (x86)\Reference Assemblies\Microsoft, при загрузке в IIS он неправильно загружает реализацию сборка (от ПКК). Ниже приведен пример ошибки.

[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

Удаление ссылочных dll из папки bin устраняет проблему, но я не уверен, что нужно изменить, чтобы исправить это правильно.

Ответ 1

Разрешение:

Мои проекты библиотеки ссылались на некоторые основные библиотеки (System.* и т.д.) с опцией RequiredTargetFramework, установленной в 3.5. Это было очевидно только в файле csproj, например:

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

Таким образом, создавая всевозможные проблемы с версиями .net, visual studio пыталась отсортировать его, добавив переадресацию привязки в мой web.config, чтобы безуспешно указывать их на v4 (и включать ссылочные сборки).

Удаление всех элементов RequiredTargetFramework из файлов csproj решило проблему.

Ответ 2

Я удаляю пакет из папки /Bin

System.Collections и System.Collections.Concurrent

и перестроить проект

его работы.

Ответ 3

Всякий раз, когда вы видите BadImageFormatException, у вас есть проблема совместимости с двоичным форматом. Возможно, ваш пул IIS настроен на запуск 32-битного пула, а ваши сборки построены на x64 или наоборот. Или, может быть, вы пытаетесь запустить сборки x64 на 32-битной машине. Возможно, у вас есть машина x64, сборка anycpu, но какая-то сторонняя сборка построена строго для 32-битного кода.

Это один из них или аналогичный

Теперь "usr" имеет здесь хороший смысл. У вас есть Cannot load a reference assembly for execution, но в контексте BadImageFormatException. Мне интересно, если это произойдет во время компиляции. Для этого попробуйте добавить это в web.config

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

Или, если у вас

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

Попробуйте сначала удалить его

Теперь, это нормально, что GAC является предпочтительным местом для ссылки, если вы не поставьте probing настройки

Ответ 4

В моем случае я добавил пакет nuget System.Collections в мой проект asp.net 4.6.1 и по какой-то причине он не ссылался на файл csproj. Я вручную отредактировал файл csproj и добавил ссылку. Перезагрузите его, и, вуаля, сработала!