web-dev-qa-db-ja.com

.Net 4.6 Webサイトが参照アセンブリを正しくロードしない

Visual Studio 2013には、いくつかのライブラリプロジェクトを含むWebプロジェクトがあります。

問題は、Webプロジェクトへの参照(System.Collection、System.Netなど)の追加が、IISに読み込まれたときにC:\Program Files (x86)\Reference Assemblies\Microsoftからの「参照アセンブリ」として追加されていることです。アセンブリの実装をロードする(GACから)。エラーの例を次に示します。

[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

Binフォルダーから参照dllを削除すると問題は解決しますが、これを適切に修正するには何を変更する必要があるのか​​わかりません。

18
Sam

解像度:

私のライブラリプロジェクトは、いくつかのコアライブラリ(System.* etc)にRequiredTargetFrameworkオプションを3.5に設定します。これは、csprojファイルでのみ明らかでした。例:

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

そのため、.netバージョンであらゆる種類の問題が発生し、Visual Studioはweb.configにバインドリダイレクトを追加して、これらをv4(および参照アセンブリを含む)を指すように並べ替えようとしましたが、失敗しました。

CsprojファイルからすべてのRequiredTargetFramework要素を削除すると、問題が解決しました。

7
Sam

/ Binフォルダーからパッケージを削除します

System.CollectionsおよびSystem.Collections.Concurrent

プロジェクトを再構築

その作品。

31
Brayan Aguilar

BadImageFormatExceptionが表示される場合は常に、バイナリ形式の互換性の問題があります。 IISプールは32ビットプールを実行するように構成され、アセンブリはx64にビルドされます。またはその逆も可能です。 x64マシン、anycpuでビルドされたアセンブリがありますが、一部のサードパーティアセンブリは32ビットコードに厳密にビルドされています。

これらのいずれか、または同様の

さて、ここで「usr」には良い点があります。 Cannot load a reference Assembly for executionただし、BadImageFormatExceptionとのコンテキストで。これがコンパイル時に起こるかどうか疑問に思っています。このために、これをweb.configに追加してみてください

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

または、持っている場合

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

最初に削除してみてください

現在、 probing settings を指定しない限り、GACが参照先として推奨される場所になるのは正常です

4
T.S.

VS 15.8の更新後、私に起こりました。 「ローカルにコピー」をfalseに設定すると、エラーが発生した各アセンブリの問題が解決しました。さらに、重複した「<Private> ".csprojのタグ。

2
Felipe Moura

この問題は、バインディングリダイレクトが参照が依存しているバージョンよりも前のバージョンを参照している場合によく発生します。これは、パッケージの更新後に発生する可能性があります(NuGetなどを使用)。一般的に解決するために、一連の手順を答えとして追加しました here 。ただし、この特定の問題については、特に次の手順5に従うことをお勧めします。

すべてのapp.configおよびWeb.configからすべてのアセンブリバインディングを削除しますその後、ファイルはソリューションをビルドします。 app.configバインディングはもう必要ありません。 Web.configバインディングは次の手順で再度追加されますが、最初にそれらを削除すると、バインディングに古いバージョンが含まれなくなります。

1
Neo

私の場合、nugetパッケージSystem.Collectionsをasp.net 4.6.1プロジェクトに追加しましたが、何らかの理由で、csprojファイルで参照されませんでした。 csprojファイルを手動で編集し、参照を追加しました。それをリロードし、出来上がりました!

0
Marco Alves