错误消息'无法加载一个或多个请求的类型.检索LoaderExceptions属性以获取更多信息.

The*_*ght 324 c# entity-framework

我使用Entity Framework,SQL Server 2000,Visual Studio 2008和Enterprise Library 开发了一个应用程序.

它在本地工作得非常好,但是当我将项目部署到我们的测试环境时,我收到以下错误:

无法加载一个或多个请求的类型.检索LoaderExceptions属性以获取更多信息

堆栈跟踪:在System.Reflection.Module._GetTypesInternal(StackCrawlMark和stackMark)

在System.Reflection.Assembly.GetTypes()

at System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadTypesFromAssembly(LoadingContext context)

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

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

at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection objectItemCollection,Assembly assembly,Boolean loadReferencedAssemblies)

at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyForType(Type type)

at System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType(Type type,Assembly callingAssembly)

at System.Data.Objects.ObjectContext.CreateQuery [T](String queryString,ObjectParameter [] parameters)

实体框架似乎有问题,任何线索如何修复它?

Ben*_*pka 509

这个错误没有真正的魔术子弹答案.关键是要掌握所有信息以了解问题.很可能动态加载的程序集缺少引用的程序集.该程序集需要位于应用程序的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.
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这应该是使用MEF的系统中任何日志记录设置的一部分. (4认同)
  • 只是为了快速找出缺少的东西,使用`throw new Exception(errorMessage);`,希望能帮助某人. (4认同)
  • 无需任何额外代码,在 Visual Studio 中转到“异常设置”并输入搜索框 TypeLoadException,然后启用一对匹配复选框。此外,您可能必须在调试部分“仅我的代码”下的选项中禁用,以便在您未编写的依赖项中发生异常时捕获异常。 (4认同)
  • 如果我每次回到这个答案都可以进行投票,那么它将会有大约5个赞成...并且还在计算中 (3认同)
  • 你救了我的命.非常感谢.我从来没有发现过这个问题.这是我不再使用的一些旧dll,潜伏在我的项目结构中并引发了这个问题. (2认同)

Men*_*tus 102

我通过将项目引用的Copy Local属性设置为true来解决了这个问题.

  • 当我们继续向下钻取内部异常时,直到我们看到ReflectionTypeLoadException类型的异常并且它有一个属性"LoaderExceptions",它提供有关丢失或不匹配DLL信息的信息.然后我们可以从那里处理适当的行动. (31认同)
  • 好吧,从Visual Studio调试时没关系.但是,如果您的Web应用程序只在生产服务器上抛出此错误呢?甚至在将"复制本地"属性设置为true之后. (18认同)
  • 这是生产服务器上的问题的解决方案,而不是本地Visual Studio上的问题.复制本地在构建时复制引用的DLL,首先在与正在运行的应用程序相同的文件夹中搜索DLL.如果您没有将在构建时复制的DLL复制到生产服务器上的正确文件夹,则问题可能会持续存在. (2认同)

Ken*_*son 56

一个对我有用的解决方案是删除bin /和obj /文件夹并重建解决方案.

  • 另一个建议:右键单击“解决方案资源管理器”中的“解决方案”节点,然后单击“清理解决方案”,然后单击“重建解决方案”。(如果您的源项目中有一个新添加项-解决方案中的其他项目-该部分将导致更改反映到您的项目dll文件夹中,从而解决了此问题) (3认同)

Wil*_*son 32

两种可能的解决方

  1. 您正在发布模式下编译,但从Debug目录中部署较旧的编译版本(反之亦然).
  2. 您没有在测试环境中安装正确版本的.NET Framework.

  • 如果其中一个DLL项目被设置为构建"x64"而不是"Any CPU",也会发现这种情况. (3认同)

mko*_*man 13

正如之前提到的那样,通常情况下是不在那里的组件.

要准确了解您缺少的程序集,请附加调试器,设置断点,当您看到异常对象时,请深入查看"LoaderExceptions"属性.丢失的组件应该在那里.

希望能帮助到你!

  • 在具有多个项目的解决方案中,我们如何查看哪个项目导致LoaderExceptions中的问题?我看到找不到System.Web.Mvc,但是我不知道此解决方案中的20个项目中哪一个会遇到麻烦。 (2认同)

Dev*_*Dev 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 Redistributable Package中找到它.


Ste*_*Cav 5

我的这个问题的例子最终是缺少参考。app.config 中引用了程序集,但项目中没有引用。


小智 5

最初我尝试了 Fusion 日志查看器,但这并没有帮助,所以我最终将 WinDbg 与 SOS 扩展一起使用。

!dumpheap -stat -type 异常 /D

然后我检查了 FileNotFoundExceptions。异常中的消息包含未加载的 DLL 的名称。

注意,/D 为您提供超链接结果,因此单击 FileNotFoundException 摘要中的链接。这将显示一个例外列表。然后单击例外之一的链接。那将 !dumpobject 例外。然后,您应该能够单击异常对象中的 Message 链接,您将看到文本。


小智 5

如果您在项目中使用EntityDataSource,则解决方案在Fix:'无法加载一个或多个请求类型的错误.您应该设置ContextTypeName ="ProjectNameNameSpace.EntityContainerName"'

这解决了我的问题......