2015-09-24 14 views
10

私はいくつかのライブラリプロジェクトを含むVisual Studio 2013にWebプロジェクトを持っています。.Net 4.6ウェブサイトが参照アセンブリを正しく読み込んでいない

問題は、Webプロジェクトに参照(System.Collection、System.Net)を追加することが、「参照アセンブリ」として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を削除すると問題は解決しますが、これを正しく修正するには何が必要かわかりません。

+0

答え[下] –

+1

私は実際にあなたの問題が正確に分かっているかもしれません:あなたは 'System.Collections'への参照で' Copy Local = true'にチェックされていなければなりません。そして、あなたはそれをビンや他の場所に持っています。あなたのウェブサイトはbin内のものをコンパイルしようとします。ですから、以下の答えは '<アセンブリの削除>'で解決するかもしれません。しかし、真の修正は、 'Copy Local = false'を設定することです。一般的に 'System。*'アセンブリはローカルにはコピーしたくありません。 –

+0

@ T.S。良いアイデア、私はすべてのプロジェクトをチェックして、問題の参照のいずれもローカルをコピーするように設定されていません – Sam

答えて

2

解像度:

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

したがって
<Reference Include="System.Core"> 
    <RequiredTargetFramework>3.5</RequiredTargetFramework> 
</Reference> 

.NETバージョンとの問題のすべての種類、Visual StudioはV4にこれらを指すように私のweb.configファイルに結合リダイレクトを追加することによって、それをソートするためにしようとしていた原因(および参照アセンブリを含む)、失敗しました。

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

+0

ローカル、必須のフレームワーク、または必要な特定のバージョンをコピーしてください。残念ながら私はコピーのローカル –

+0

で停止しました。あなたの質問は、あなたのコンピュータ上に文字通り存在しなければ解決するのは実際簡単ではありませんでした。可能性は無限でした。私たちは間違ったアセンブリをロードしていたことしか知りませんでした。 ''は間違った読み込みを中止しましたが、問題は完全に解決されませんでした。これは可能な限り多くの情報を提供することの重要性を意味します –

+0

私は.NET Coreを使用しており、csprojファイルのHintPathから違反している参照を削除しなければなりませんでした。この答えは正しい方向に私を指摘した。ありがとう! – gilletty

4

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

それは今、これらのいずれか、または類似

で、「USRは、」ここで良い点を持っています。 Cannot load a reference assembly for executionがありますが、文脈はBadImageFormatExceptionです。コンパイル時にこれが起こるのだろうかと思います。あなたは

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

を持っている場合は、このために、今で最初

を削除してください、

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

をweb.configのためにこれを追加しようとするか、GACは、参考のために場所を優先していることを普通ですあなたは提供しない限り、probing settings

+0

また、アプリケーションプールが複数のサイトにサービスを提供している可能性があり、読み込まれたビットの不一致がある他のサイトの1つである可能性があります。 – StingyJack

+1

エラーメッセージは、ビットの不一致を指し示す「実行のための参照アセンブリを読み込めません」です。 – usr

+0

@usrこれを指摘するためのタックス。私は答えを更新しました。それはそうであっても、それ以前の何かであってもかまいません。また、質問 –

0

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

13

私は

にSystem.CollectionsにSystem.Collections /ビンフォルダからパッケージを削除します。同時

とプロジェクト

その作品を再構築します。

+3

Binフォルダを削除してビルドするだけで –

関連する問題