web-dev-qa-db-ja.com

エラーメッセージ '要求された種類の1つ以上を読み込めません。詳細については、LoaderExceptionsプロパティを取得してください。

私は Entity Framework 、SQL Server 2000、Visual Studio 2008およびEnterprise Libraryを使用してアプリケーションを開発しました。

ローカルではまったく問題なく動作しますが、プロジェクトをテスト環境にデプロイすると、次のエラーが発生します。

要求されたタイプを1つ以上ロードできません。詳細については、LoaderExceptionsプロパティを取得してください。

スタックトレース:System.Reflection.Module._GetTypesInternal(StackCrawlMark&stackMark)

system.Reflection.Assembly.GetTypes()で

system.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadTypesFromAssembly(LoadingContextコンテキスト)

system.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.InternalLoadAssemblyFromCache(LoadingContextコンテキスト)

system.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadAssemblyFromCache(アセンブリアセンブリ、Boolean loadReferencedAssemblies、Dictionary2 knownAssemblies, Dictionary2&typesInLoading、List`1&errors)

system.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection、objectItemCollection、アセンブリアセンブリ、Boolean loadReferencedAssemblies)

system.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyForType(Type type)

system.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType(Type type、Assembly callingAssembly)

system.Data.Objects.ObjectContext.CreateQuery [T](String queryString、ObjectParameter []パラメータ)

Entity Frameworkに問題があるようですが、どのように修正すればよいですか?

308
The Light

プロジェクトの参照のCopy Local属性をtrueに設定することで、この問題を解決しました。

97
Mentoliptus

このエラーには本当の魔法の答えはありません。重要なのは、問題を理解するためのすべての情報を入手することです。ほとんどの場合、動的にロードされたアセンブリに参照アセンブリがありません。そのアセンブリはアプリケーションのbinディレクトリにある必要があります。

このコードを使用して、欠けているものを判別してください。

using System.IO;
using System.Reflection;
using System.Text;

try
{
    //The code that causes the error goes here.
}
catch (ReflectionTypeLoadException ex)
{
    StringBuilder sb = new StringBuilder();
    foreach (Exception exSub in ex.LoaderExceptions)
    {
        sb.AppendLine(exSub.Message);
        FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
        if (exFileNotFound != null)
        {                
            if(!string.IsNullOrEmpty(exFileNotFound.FusionLog))
            {
                sb.AppendLine("Fusion Log:");
                sb.AppendLine(exFileNotFound.FusionLog);
            }
        }
        sb.AppendLine();
    }
    string errorMessage = sb.ToString();
    //Display or log the error based on your application.
}
490
Ben Gripka

私にとってうまくいった1つの解決策はbin /とobj /フォルダを削除してその解決策を再構築することでした。

53
Kenny Eliasson

考えられる2つの解決策:

  1. リリースモードでコンパイルしていますが、Debugディレクトリから古いコンパイル済みバージョンをデプロイしています(またはその逆)。
  2. テスト環境に正しいバージョンの.NET Frameworkがインストールされていません。
32

それが前に述べたように、それは通常そこにいない総会の場合です。

足りないアセンブリを正確に知るには、デバッガをアタッチし、ブレークポイントを設定して、例外オブジェクトが表示されたら、 'LoaderExceptions'プロパティにドリルダウンします。行方不明の議会はそこにあるべきです。

それが役に立てば幸い!

13
mkorman

解決策は、LoaderExceptionをチェックすることでした。私の場合、DLLファイルの一部が欠落していました。

Enter image description here

7
Dev

私はASP.NET 4 + SQL Server 2008 R2 + Entity Framework 4アプリケーションでこのエラーに遭遇しました。

私の開発マシン(Windows Vista 64-bit)ではうまく動くでしょう。その後、サーバーにデプロイすると( Windows Server 2008 R2 SP1)、セッションがタイムアウトするまで機能します。そのため、アプリケーションをデプロイした後、すべてが問題なく動作し、その後20分以上のセッションタイムアウトの間そのままにしておくと、このエラーがスローされます。

それを解決するために、私は、 Ken Coxのブログの にあるこのコードを使用して、LoaderExceptionsプロパティを取得しました。

私の状況では、欠けているDLLはMicrosoft.ReportViewer.ProcessingObjectModel(バージョン10)でした。このDLLは、アプリケーションが実行されているマシンの GAC にインストールする必要があります。 MicrosoftのダウンロードサイトにあるMicrosoft Report Viewer 2010再頒布可能パッケージにあります。

6
Dean

IISにデプロイした場合は、 IIS で32ビットアプリケーションを許可するようにしてください。現在のアプリケーションプールの設定でこれを定義できます。

5
MrKhal

プロジェクトでEntityDataSourceを使用している場合、解決策はにあります。修正: '1つ以上の要求された型を読み込めません'エラー。 ContextTypeName = "ProjectNameNameSpace.EntityContainerName" 'を設定する必要があります。

これで私の問題は解決しました...

5

最初はFusionログビューアを試してみましたが、それでは役に立たなかったので、SOS拡張子の付いたWinDbgを使用しました。

!dumpheap -stat -type例外/ D

それから私はFileNotFoundExceptionsを調べました。例外のメッセージに、ロードされていないDLLの名前が含まれていました。

N.B.、/ D、ハイパーリンクの結果が表示されるので、FileNotFoundExceptionの要約内のリンクをクリックしてください。これで例外の一覧が表示されます。次に、いずれかの例外のリンクをクリックしてください。その例外が発生します。そうすると、例外オブジェクトのMessageのリンクをクリックするだけで、テキストが表示されます。

4
miko

この問題の私の例は行方不明の参照であることになった。アセンブリはapp.configで参照されていましたが、プロジェクトで参照がありませんでした。

3
SteveCav

正確に何も機能しない理由を知るための別の解決策(Microsoft connectから):

  1. このコードをプロジェクトに追加します。

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        asm.GetTypes();
    }
    
  2. 世代シリアライゼーションアセンブリを無効にします。

  3. ビルドして実行します。
3
Siarhei Kuchuk

binフォルダから冗長アセンブリファイルを削除した後、私の問題は解決しました。

2
user2814851

これに私の特定の問題/解決策を追加することが、このエラーメッセージの最初の結果です。私の場合は、 IIS の最初のアプリケーションのフォルダー内に2番目のアプリケーションをデプロイしたときにエラーが発生しました。どちらも同じ名前の接続文字列を定義していたため、子アプリケーションで競合が発生し、(私にとっては)この明白でないエラーメッセージが生成されました。それは追加することによって解決されました:

<clear/>

子Webアプリケーションの接続文字列ブロック内で、階層の上位にあるweb.configファイルの接続文字列を継承できなかったため、次のようになります。

<connectionStrings>
  <clear/>
  <add name="DbContext" connectionString="MySERVER" providerName="System.Data.SqlClient" />
</connectionStrings>

何が起こっているのかを判断するのに役立った参考スタックオーバーフローの質問は子アプリケーションはその親web.configから継承するでしょうか?

2
Matthew

これは私のために働きました。あなたのweb.configにそれを追加してください

<system.web>
  <trust level="Full" />
2
Rahul Nikate

他の答えのどれもあなたを助けない場合には:

この問題が発生したとき、私のWindowsサービスはx64プラットフォーム用に構築されていて、32ビット版のInstallUtil.exeを誤って実行していました。ですから、自分が構築したプラットフォームに適したバージョンのInstallUtilを使用していることを確認してください。

2
jkindwall

一方のプロジェクトに NuGet パッケージをインストールし、もう一方のプロジェクトを更新するのを忘れたときに、この問題が発生しました。

両方のプロジェクトに同じ参照アセンブリを持たせることでこれを解決しました。

1
jayson.centeno

Package Managerコンソールを使用してEntity Frameworkの移行を追加しようとしたときにも、同じ問題が発生しました(ただし、私の地域では発生します)。

私がそれを解決した方法は、Main()が以下のコードを持っていたコンソールアプリケーションを作成することでした:

 var dbConfig = new Configuration();
 var dbMigrator = new DbMigrator(dbConfig);
 dbMigrator.Update();

構成クラスが、失敗したプロジェクトのマイグレーション構成であることを確認してください。 DbMigratorを使用するにはSystem.Data.Entity.Migrationsが必要になります。

アプリケーションにブレークポイントを設定して実行します。例外はVisual Studioによってキャッチされ(デバッグセッションを中断しないようにその例外タイプが設定されていない限り)、探している情報を見つけることができるはずです。

私の場合、欠けている参照はEFProviderWrapperToolkitでした。

1
Peter Nagy

私は.NET 4.0、 ASP.NET MVC 2.0、 Entity Framework 4.0 WebアプリケーションはVisual Studio 2010で開発されました。私は同じ問題を抱えていました。それは1つの上で動作しました Windows Server 2008 .NETサーバーとASP.NET MVCのバージョンが同じであっても、R2サーバーは別のWindows Server 2008 R2サーバー上にはありません。これと同じエラーが発生します。

私はmikoの提案に従ったので、失敗したサーバーに Windows SDK v7.1(x64))をインストールしたので、!dumpheapを実行できました。

Windows SDK v7.1(x64)をインストールすると問題が解決したことがわかります。不足していた依存関係がSDKに含まれている必要があります。Windows 7用のMicrosoft Windows SDKおよび.NET Framework 4からダウンロードできます。

1
Mafi Osori

それは私にも起こりました。私は次のようにして問題を解決しました:ソリューションを右クリックし、ソリューションのNuGetパッケージを管理...パッケージを統合し、同じバージョンになるようにパッケージをアップグレードしました。

1
user1760527

他の提案はすべて良いです。私の場合、問題は、開発者用ボックスが、 Silverlight を含むさまざまなAPIのx86ロケーションを使用する64ビットマシンであることでした。

Webアプリケーションがデプロイされていた32ビットサーバーに合わせてターゲットプラットフォームを変更することで、1つ以上の要求されたタイプをロードできないことに関連するエラーの大部分を削除しました。

1
rclopez

Entity Framework を使用している場合は、以下の参照をローカルにコピーしてみてください。

  • System.Data.Entity
  • System.Web.Entity

これらの参照と公開のために、プロパティ "Copy Local"を "True"に変更します。

1
SameerPc

私はReferencesのSpecific Version Propertyをfalseに変更しました。

1
Dov Miller

Nugetコンソールで移行コマンドを入力するときに、エンティティフレームワークでこの問題が発生しました。

私のアプリケーションのOAuthAuthorizationServerProviderNAME_コードを、DBContextクラスだけでなくコアデータアクセスロジックを含むクラスライブラリプロジェクトに移動したときに、問題が発生しました。

クラスライブラリプロジェクトによって参照されているすべてのDLLをチェックします。そしてそれらすべてのために(.netシステムDLLを除く)CopyToLocalは真実でした私は完全に混乱しました。

私自身のコードではなくDLL自体に問題があることを私は知っていました。再度チェックしたところ、ApplicationOauthProviderNAME_クラスをクラスライブラリプロジェクトに移動したときに、ApplicationOauthProviderNAME_クラスがMicrosoft.Owin.Security.OAuthアセンブリにあるOAuthAuthorizationServerProviderNAME_クラスを継承していることに気づきましたそれはパッケージのバージョンで、クラスライブラリプロジェクトで使用していたパッケージのバージョン(私のアプリケーションプロジェクトではない)が非常に古い2.1であることに突然気付きましたが、私のアプリケーションでは最新バージョンがインストールされました(3.0.1)私のクラスライブラリプロジェクトのNugetからのMicrosoft.Owin.Security.OAuthパッケージおよび問題は解決しました

DLLのCopyToLocalNAME_プロパティをチェックした後、簡単にそれらのバージョンもチェックし、古いバージョンを最新バージョンに更新します。

0
Code_Worm

プロジェクト内で参照されているすべてのDLLファイルに "Copy Local = True"とマークし、再構築してテストサーバーにデプロイすることで、この問題を解決できます。

0
Srinivasa Rao

私の場合、プロジェクトにインストールされた1つのnugetパッケージがありましたが、パッケージフォルダーはTFSにチェックインされなかったため、ビルドマシンではnugetパッケージbinファイルが見つかりませんでした。したがって、本番環境ではこのエラーが発生していました。運用環境とローカル環境でbinフォルダーを比較する必要があり、その後、どのdllが欠落しているかがわかり、それらが1つのnugetパッケージに属していることがわかりました。

0

Automapに問題がありました。 binフォルダーにはファイルautomap.4net.dllがありましたが、何らかの理由でautomap.xmlとautomap.dllがありませんでした。それらをbinディレクトリにコピーすることで問題は解決しました。

0
alex440

Nugetパッケージを参照しているときにこの問題が発生し、後で削除オプションを使用してプロジェクトから削除しました。私は何時間もの問題と戦った後にbinフォルダをクリアしなければなりませんでした。これを避けるためには、通常の削除ではなくnugetを使って不要なパッケージをアンインストールすることをお勧めします。

0
Alayo Hussein

この問題は、Visual Studio 2015で新しいMicrosoft Wordアドインを作成するときにも発生します。問題は、2つのバージョンのMS Office、2013および2016があることです。MSOffice 2013をアンインストールしてから動作します。

0
amzdmt

Visual Studioパッケージ(VSPackage)のコンパイル時に同じエラーメッセージが表示されました。CreatePkgDefによってパッケージが作成されるときに、ソリューション全体がコンパイルされ、エラーがスローされます。そうは言っても、は私が自分のアプリケーションではなくMicrosoft自身のツールであるため、LoaderExceptionsをキャッチできないことは明らかです。 (私はCreatePkgDefの混乱に対して責任がありますが。)

私の場合、根本的な原因は、私の解決策が既に GAC に登録されているMyDll.dllを作成したことですそれらは違うので、CreatePgkDefはどちらを使うべきか混乱してしまい、本当に役に立たないエラーを投げることにしました。 GACのMyDll.dllは同じ製品のインストーラによって登録されました(明らかに以前のバージョンで、/わずかに異なる内容で)。

修正方法

  1. 推奨される方法:正しいバージョンのMyDll.dll [.____。を使用していることを確認してください。
    1. プロジェクトをコンパイルするときは、GACにある以前のバージョンで使用していたものとは異なるバージョン番号を使用してください。以下の属性が正しいことを確認してください。
      • [Assembly:AssemblyVersion( "1.0.0.1")] //古いDLLファイルのバージョンが1.0.0.0であると仮定
      • [Assembly:AssemblyFileVersion( "1.0.0.1")] //古いDLLファイルのバージョンが1.0.0.0であると仮定
    2. 必要に応じて、他のプロジェクトで参照するときに、完全修飾アセンブリ名(たとえば、 "MyDll.dll、Version = 1.0.0.1、Culture = neutral、PublicKeyToken = 1234567890abcdef")を指定します。
  2. 上記が失敗した場合:GACから古いMyDll.dllをアンインストールすることができます
    1. GACからアセンブリをアンインストールする方法
    2. MyDll.dllを含むアプリケーションをアンインストールします。

AssemblyVersionを変更することは私にとって十分に良かったです。 :)

これが役に立ったことを願っています。

0
Shakaron

私はFTPでウェブサイトを更新していました。 Webサイトが使用中で、binフォルダを更新しようとしたときに、DLLファイルが2、3個ロックされていて更新されなかったに違いありません。

そこに私はエラー500ページを見て、customErrorsモードをOffに設定すると、OPによって言及されたエラーメッセージを見ました。

問題は、FTPプログラムにエラーがリストされていないことです。失敗したものを再試行してアップロードしました。最後のDLLファイルが更新されました。それで、そのサイトはうまくいきました。

0
Valamas

各プロジェクトが構成マネージャーで正しくセットアップされていることを確認してください。

この問題に対する William Edmondsonの 理由と同様に、私はConfiguration Managerの設定を "Debug" "Any CPU"から "Debug" ".NET"に切り替えました。問題は、 ".NET"バージョンがすべてのプロジェクトをビルドするように構成されていなかったため、一部の私のDLLが古くなっていたことです(他のものは最新のものです)。これにより、アプリケーションの起動時に多数の問題が発生しました。

一時的な修正は、\ binディレクトリおよび\ objディレクトリを削除するための Kenny Eliassonの 提案を行うことでした。しかし、コンパイルしていないプロジェクトにさらに変更を加えるとすぐに、すべてが失敗します。

0
cat5dev

私はSharePoint用にいくつかのプロジェクトを作成し、そしてもちろんそれらをデプロイしました。一回それが起こった。

C:\ Windows\Assembly\temp\xxx(FarManagerを使用)で古いアセンブリを見つけ、再起動後にそれを削除し、すべてのプロジェクトをビルドしました。

MSBuildについて質問があります。これは、プロジェクトのようにリンクされたプロジェクトアセンブリではすべてのアセンブリが "ローカルコピー"とマークされていますが、GACからはマークされていないためです。

0
Ilya

設定ファイルで32ビットIISモードをtrueに、デバッグモードをtrueに設定し、tempディレクトリを削除し、IISをリセットすると、一時的に問題が解決し、しばらくしてから元に戻ります。

0
johnny