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


347

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 context)で

System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.InternalLoadAssemblyFromCache(LoadingContext context)で

System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadAssemblyFromCache(Assembly assembly、Boolean loadReferencedAssemblies、Dictionary 2 knownAssemblies, Dictionary2&typesInLoading、List`1&errors)で

System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection objectItemCollection、Assembly assembly、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 [] parameters)で

Entity Frameworkに問題があるようです、それを修正する方法の手がかりはありますか?


この問題を解決するための特効薬はありませんが、この回答は、stackoverflow.com
a / 8824250/185022

回答:


105

この問題は、プロジェクトの参照の[ローカルコピー]属性をtrueに設定することで解決しました。


33
タイプReflectionTypeLoadExceptionの例外が見つかるまで内部例外をドリルダウンし続けると、DLL情報の欠落または不一致に関する情報を提供する「LoaderExceptions」プロパティがあります。その後、そこから適切なアクションを処理できます。
Sai

19
まあ、Visual Studioからデバッグしている場合は問題ありません。しかし、Webアプリケーションがこのエラーを本番サーバーでのみスローする場合はどうでしょうか?ローカルのコピー属性をtrueに設定した後でも。
Yousi

2
これは、ローカルのVisual Studioではなく、運用サーバーでの問題の解決策です。ローカルコピーは、ビルド時に参照DLLをコピーし、DLLは実行中のアプリケーションと同じフォルダーで最初に検索されます。ビルド時にコピーされたDLLを本番サーバーの正しいフォルダにコピーしなかった場合、問題は解決しません。
Mentoliptus 2014年

私の場合、Microsoft.AspNetCore.Mvc.ViewFeaturesへのnuget参照も追加する必要がありました
MFedatto

530

このエラーには、真の魔法の答えはありません。問題を理解するためのすべての情報を入手することが重要です。おそらく、動的に読み込まれたアセンブリに参照アセンブリがありません。そのアセンブリは、アプリケーションの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.
}

4
ありがとう!これは、MEFを使用するシステムのロギング設定の一部である必要があります。
Bogi lenvig 2014

4
私がこの回答に戻るたびに賛成票を投じることができた場合、さらに5つの賛成票が返されます...そしてカウント
sǝɯɐſ

2
あなたは私の命を救いました。どうもありがとうございます。私は決して問題を見つけなかっただろう。これは、私がこれ以上使用していない古いDLLであり、プロジェクト構造の奥深くに潜んでいて、この問題を引き起こしていました。
リチャード2015

4
不足しているものをすばやく見つけるために、を使用してthrow new Exception(errorMessage);、誰かが役に立てば幸いです
シャイユット2017年

2
追加のコードなしで、Visual Studioの[例外の設定]に移動し、検索ボックスにTypeLoadExceptionを入力して、[カップルヒット]チェックボックスを有効にします。また、記述していない依存関係で発生したときに例外をキャッチできるように、デバッグセクション「Just my code」のオプションで無効にする必要がある場合もあります。
デビッドバーグ

56

私にとってうまくいった解決策の1つは、bin /およびobj /フォルダーを削除して、ソリューションを再構築することでした。


ここでテストプロジェクトを参照しているのか、テストしているプロジェクトを参照しているのかわからないため、テストプロジェクト自体を再構築する必要がありました。
Jason Axelson 2013年

4
別の再コメント:「ソリューションエクスプローラー」でソリューションノードを右クリックし、「ソリューションのクリーン」をクリックして、「ソリューションの再構築」をクリックします。(ソースプロジェクト-ソリューションの他のプロジェクト-パーツに新しい追加がある場合、これにより変更がプロジェクトのdllフォルダーに反映され、この問題が解決されます)
Emre Guldogan

私はこの問題を抱えていました。提案されたように、私はVisual Studioを閉じ、binフォルダーを削除し、プロジェクトを再度開いて再ビルドし、成功しました。
Sagar S.

これは、大幅な変更を加えてブランチを切り替えていたときに発生していました。ビンの削除はうまくいきました。クリーニングと再構築が機能していませんでした。
JGTaylor 2017

33

2つの可能な解決策:

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

同じ問題がありました。ポイント1は私にとっては正確でした。ウィリアムに感謝します。
マシュー

私はこれと同じ問題を抱えています...私は2つの提案の両方を試しても同じエラーを受け取ります:(
David Kiff

参照されたDLLが「ブロック」されている場合にも発生する可能性があります。それを右クリックして、「ブロック解除」を選択します
Ben

3
また、DLLプロジェクトのいずれかが「任意のCPU」ではなく「x64」をビルドするように設定されている場合にも、これが発生することがわかりました。
DCastenholz

#1は、ソリューション構成が正しくない場合に発生する可能性があります-たとえば、プロジェクトを削除してソリューションに再度追加した後など、プロジェクトがビルド用に選択されていません
秒に

13

前述のとおり、通常はアセンブリが存在しない場合です。

不足しているアセンブリを正確に知るには、デバッガーを接続し、ブレークポイントを設定し、例外オブジェクトが表示されたら、「LoaderExceptions」プロパティにドリルダウンします。不足しているアセンブリがそこにあるはずです。

それが役に立てば幸い!


1
また、ReflectionTypeLoadException型の例外が見つかるまで内部例外をドリルダウンし続けることができます。これには、欠落または不一致のDLL情報に関する情報を提供する「LoaderExceptions」プロパティがあります。
Sai

2
複数のプロジェクトがあるソリューションで、どのプロジェクトがLoaderExceptionsで問題を引き起こしているのかをどのように確認できますか?System.Web.Mvcが見つからないことがわかりましたが、このソリューションの20のプロジェクトのどれが問題を抱えているのかわかりません。
mrcoulson 2018

9

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

ここに画像の説明を入力してください


6

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


6

ASP.NET 4 + SQL Server 2008 R2 + Entity Framework 4アプリケーションでこのエラーが発生しました。

私の開発マシン(Windows Vista 64ビット)では問題なく動作します。その後、サーバー(Windows Server 2008 R2 SP1)にデプロイすると、セッションがタイムアウトするまで機能します。したがって、アプリケーションをデプロイすると、すべてが問題なく表示され、20分のセッションタイムアウトよりも長く放置すると、このエラーがスローされます。

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

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


5

最初はFusionログビューアを試しましたが、それでも役に立たなかったため、結局SOS拡張機能を備えたWinDbgを使用しました。

!dumpheap -stat -type Exception / D

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

注意、/ Dはハイパーリンクされた結果を提供するので、FileNotFoundExceptionの概要のリンクをクリックします。例外のリストが表示されます。次に、いずれかの例外のリンクをクリックします。!dumpobjectその例外。次に、例外オブジェクトのメッセージのリンクをクリックするだけで、テキストが表示されます。



4

この問題の私のインスタンスは、参照が欠落してしまいました。アセンブリはapp.configで参照されましたが、プロジェクトに参照がありませんでした。


3

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

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

これらの参照のプロパティ「ローカルのコピー」を「True」に変更して公開します。


3

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

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

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        asm.GetTypes();
    }
  2. 生成シリアル化アセンブリをオフにします。

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

2

Visual Studio 2010で開発された.NET 4.0、ASP.NET MVC 2.0、Entity Framework 4.0 Webアプリケーションがありました。同じ問題がありました。あるWindows Server 2008 R2サーバーでは機能しましたが、別のWindows Server 2008 R2サーバーでは機能しませんでした。 .NETとASP.NET MVCのバージョンは同じでしたが、これと同じエラーが発生しました。

私はmikoの提案に従いました。そのため、障害が発生しているサーバーにWindows SDK v7.1(x64)をインストールし、!dumpheapを実行できるようにしました。

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


2

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

<clear/>

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

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

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


2

これでうまくいきました。あなたのweb.configに追加してください

<system.web>
  <trust level="Full" />

このエラーが発生しました:It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.


2

他のどの回答もあなたを助けない場合:

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


同様の問題がありました。私のサービスが使用していたDLLの一部は32ビットプロセッサ用にコンパイルされており、任意のプロセッサに変更され、現在は機能しています。
Blake Thingstad

1

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

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



1

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

私の場合、根本的な原因は、私のソリューションが既にGACに登録されているMyDll.dllを作成することでした(そして、それらは異なる)。そのため、CreatePgkDefは、どれを使用するか混乱し、それだけではないエラーをスローすることにしました。本当に役に立ちました。GACのMyDll.dllは、同じ製品のインストーラーによって登録されました(明らかに以前のバージョンで、内容が/ slyly /異なっています)。

それを修正する方法

  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を変更するだけで十分です。:)

これがお役に立てば幸いです。


1

パッケージマネージャーコンソールでEntity Frameworkの移行を追加しようとしたときに、同じ問題が発生しました(ただし、ローカルで発生しました)。

私が解決した方法は、Main()に次のコードが含まれるコンソールアプリケーションを作成することでした。

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

Configurationクラスが、失敗したプロジェクトの移行構成であることを確認してください。DbMigratorを使用するには、System.Data.Entity.Migrationsが必要です。

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

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


1

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

同じ参照アセンブリを持つ両方のプロジェクトを作成するだけでこれを解決しました。


リンクをありがとう!NuGetが何であるか私にはわかりませんでした。
jebar8 2017

1

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


0

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


0

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

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

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


0

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


0

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

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

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


0

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.