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

Posted

技术标签:

【中文标题】错误消息“无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。【英文标题】:Error message 'Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.' 【发布时间】:2010-11-08 16:14:18 【问题描述】:

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

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

无法加载一种或多种请求的类型。检索 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(Assembly 程序集,布尔 loadReferencedAssemblies,Dictionary2 knownAssemblies, Dictionary2& typesInLoading,List`1& 错误)

在 System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection objectItemCollection,Assembly 程序集,布尔 loadReferencedAssemblies)

在 System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyForType(类型类型)

at System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType(类型类型,程序集调用Assembly)

在 System.Data.Objects.ObjectContext.CreateQuery[T](String queryString, ObjectParameter[] 参数)

实体框架似乎有问题,有什么解决办法吗?

【问题讨论】:

没有灵丹妙药可以解决这个问题,但这个答案将帮助您了解确切的原因***.com/a/8824250/185022 我通过从 Azure 中删除所有文件并重新部署 API 解决了这个问题。 【参考方案1】:

这个错误没有真正的灵丹妙药答案。关键是要有所有的信息来理解问题。动态加载的程序集很可能缺少引用的程序集。该程序集需要位于应用程序的 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.

【讨论】:

谢谢!这应该是使用 MEF 的系统中任何日志记录设置的一部分。 如果我每次回到这个答案时都可以投票,那将有大约 5 个投票......并且还在增加 你救了我的命。太感谢了。我永远不会发现问题。这是一些我不再使用的旧 dll,潜伏在我的项目结构中并导致了这个问题。 只是为了快速找出缺少的内容,使用throw new Exception(errorMessage);,希望对某人有所帮助。 无需任何额外代码,在 Visual Studio 中转到 Exception Settings 并输入搜索框 TypeLoadException 然后启用几个命中复选框。此外,您可能必须在“仅我的代码”调试部分下的选项中禁用,以便在您未编写的依赖项中发生异常时捕获异常。【参考方案2】:

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

【讨论】:

当我们继续深入研究内部异常,直到我们看到 ReflectionTypeLoadException 类型的异常,并且它有一个属性“LoaderExceptions”,它提供有关丢失或不匹配的 DLL 信息的信息。然后我们可以从那里处理适当的操作。 好吧,当您从 Visual Studio 进行调试时,这很好。但是如果你的 web 应用程序只在生产服务器上抛出这个错误呢?即使将 Copy Local 属性设置为 true。 这是针对生产服务器上的问题的解决方案,而不是在本地 Visual Studio 上。 Copy Local 在构建时复制引用的 DLL,并且首先在与正在运行的应用程序相同的文件夹中搜索 DLL。如果您没有将在构建时复制的 DLL 复制到生产服务器上的正确文件夹,问题可能仍然存在。 就我而言,我还必须添加对 Microsoft.AspNetCore.Mvc.ViewFeatures 的 nuget 引用【参考方案3】:

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

更新:

或者您可以尝试右键单击“解决方案资源管理器”中的解决方案节点并单击“清理解决方案”,然后单击“重建解决方案”(感谢 Emre Guldogan)

【讨论】:

我不得不自己重新构建测试项目,不知道你是指这里的测试项目还是你正在测试的项目。 另一条评论:右键单击“解决方案资源管理器”中的“解决方案”节点,单击“清理解决方案”,然后单击“重建解决方案”。 (如果您的源项目中有新添加 - 您的解决方案中的其他项目 - 部分,这会导致更改将反映在您的项目 dll 文件夹中并解决此问题) 我遇到了这个问题。按照建议,我关闭了 Visual Studio,删除了 bin 文件夹,重新打开项目并重建,它成功了。 当我在有重大变化的分支之间切换时发生了这种情况。删除垃圾箱工作。清洁和重建不起作用。【参考方案4】:

两种可能的解决方案:

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

【讨论】:

我遇到了同样的问题,第 1 点对我来说是准确的。谢谢威廉。 我有同样的问题...我已经通过了这两个建议,但仍然收到相同的错误:( 如果您引用的 DLL 被“阻止”,也会发生这种情况。右键单击它,然后选择“取消阻止” 还发现如果将 DLL 项目之一设置为构建“x64”而不是“任何 CPU”,也会发生这种情况。 #1 如果解决方案配置不正确,可能会发生 - 未选择项目进行构建,例如在将项目删除并再次添加到解决方案之后【参考方案5】:

如前所述,通常情况下,程序集不存在。

要确切知道您缺少哪个程序集,请附加调试器,设置断点,当您看到异常对象时,深入了解“LoaderExceptions”属性。缺少的程序集应该在那里。

希望对你有帮助!

【讨论】:

此外,我们可以继续深入了解内部异常,直到我们看到 ReflectionTypeLoadException 类型的异常,并且它有一个属性“LoaderExceptions”,它提供有关丢失或不匹配的 DLL 信息的信息。 在一个包含多个项目的解决方案中,我们如何查看哪个项目导致了 LoaderExceptions 中的问题?我看到 System.Web.Mvc 找不到,但我不知道这个解决方案中的 20 个项目中的哪个项目可能有问题。【参考方案6】:

解决方案是检查 LoaderException:在我的情况下,一些 DLL 文件丢失了。

【讨论】:

【参考方案7】:

如果您确实部署到 IIS,请确保在 IIS 上允许 32 位应用程序。您可以在当前应用程序池的设置中定义它。

【讨论】:

【参考方案8】:

我在 ASP.NET 4 + SQL Server 2008 R2 + Entity Framework 4 应用程序中遇到了这个错误。

它可以在我的开发机器(Windows Vista 64 位)上正常工作。然后当部署到服务器 (Windows Server 2008 R2 SP1) 时,它会一直工作到会话超时。所以我们会部署应用程序,一切看起来都很好,然后让它超过 20 分钟的会话超时,然后就会抛出这个错误。

为了解决这个问题,我使用this code on Ken Cox's blog 来检索 LoaderExceptions 属性。

对于我的情况,缺少的 DLL 是 Microsoft.ReportViewer.ProcessingObjectModel(版本 10)。此 DLL 需要安装在运行应用程序的机器的 GAC 中。您可以在 Microsoft 下载站点上的 Microsoft Report Viewer 2010 Redistributable Package 中找到它。

【讨论】:

【参考方案9】:

最初我尝试了 Fusion 日志查看器,但没有帮助 所以我最终使用了带有 SOS 扩展的 WinDbg。

!dumpheap -stat -type 异常 /D

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

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

【讨论】:

【参考方案10】:

如果您在项目中使用 EntityDataSource,则解决方案位于 Fix: 'Unable to load one or more of the requested types' Errors。您应该设置 ContextTypeName="ProjectNameNameSpace.EntityContainerName" '

这解决了我的问题...

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

了解为什么没有任何效果的另一种解决方案(来自 Microsoft connect):

    将此代码添加到项目中:

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    
        asm.GetTypes();
    
    

    关闭生成序列化程序集。

    构建并执行。

【讨论】:

【参考方案13】:

如果您使用的是Entity Framework,请尝试在本地复制以下引用。

System.Data.Entity System.Web.Entity

将这些引用的属性“复制本地”更改为“真”并发布。

【讨论】:

【参考方案14】:

我在 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 and .NET Framework 4下载。

【讨论】:

【参考方案15】:

添加我的具体问题/解决方案,因为这是此错误消息的第一个结果。就我而言,当我在IIS 的第一个应用程序的文件夹中部署第二个应用程序时收到错误。两者都定义了具有相同名称的连接字符串,导致子应用程序发生冲突,进而生成这个(对我而言)不明显的错误消息。它通过添加解决:

<clear/>

在子 Web 应用程序的连接字符串块中,它阻止它继承层次结构中更高的 web.config 文件的连接字符串,所以它看起来像:

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

一个参考堆栈溢出问题,一旦我确定了什么是 Will a child application inherit from its parent web.config?.

【讨论】:

【参考方案16】:

这对我有用。将其添加到您的 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.【参考方案17】:

bin 文件夹中删除多余的程序集文件后,我的问题已得到解决。

【讨论】:

【参考方案18】:

如果其他答案都没有帮助您:

当我遇到这个问题时,原来我的 Windows 服务是为 x64 平台构建的,并且我无意中运行了 32 位版本的 InstallUtil.exe。因此,请确保您为所构建的平台使用了正确版本的 InstallUtil。

【讨论】:

我遇到了类似的问题。我的服务使用的一些 DLL 是为 32 位处理器编译的,更改为任何处理器,现在都可以使用。【参考方案19】:

其他建议都不错。在我的例子中,问题在于开发者机器是一台 64 位机器,使用各种 API 的 x86 位置,包括Silverlight。

通过更改目标平台以匹配正在部署 Web 应用程序的 32 位服务器,消除了与无法加载一种或多种请求类型相关的大部分错误。

【讨论】:

【参考方案20】:

我将引用的特定版本属性更改为 false,这很有帮助。

【讨论】:

【参考方案21】:

我在编译 Visual Studio 包 (VSPackage) 时报告了相同的错误消息。 整个解决方案编译并在 CreatePkgDef 创建包时抛出错误。话虽如此,很明显 我无法捕获 LoaderExceptions,因为不是我的应用程序引发了它,而是 Microsoft 自己的工具。 (虽然我对 CreatePkgDef 的混乱负责。)

在我的情况下,根本原因是我的解决方案创建了一个已经注册到 GAC 的 MyDll.dll(它们是不同的),所以 CreatePgkDef 混淆了哪个使用它,它决定只是抛出一个没有真正帮助的错误。 GAC中的MyDll.dll是由同一个产品的安装程序注册的(显然是更早的版本,/slightly/不同的内容)。

如何解决

    首选方式: 确保使用正确版本的 MyDll.dll
      在编译您的项目时,请确保您使用的版本号与您在 GAC 中的先前版本中使用的版本号不同。确保以下属性正确: [assembly: AssemblyVersion("1.0.0.1")] // 假设旧 DLL 文件的版本为 1.0.0.0 [assembly: AssemblyFileVersion("1.0.0.1")] // 假设旧 DLL 文件的版本为 1.0.0.0 如果需要,请在其他项目中引用它时指定完全限定的程序集名称(例如,“MyDll.dll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=1234567890abcdef”)。
    如果上述失败: 您可以从 GAC 卸载旧的 MyDll.dll
      How to Uninstall an Assembly from the GAC 卸载包含 MyDll.dll 的应用程序

更改 AssemblyVersion 对我来说已经足够了。 :)

我希望这会有所帮助。

【讨论】:

【参考方案22】:

当我尝试使用包管理器控制台添加实体框架迁移时,我遇到了同样的问题(但在我的本地)。

我解决它的方法是创建一个控制台应用程序,其中 Main() 具有以下代码:

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

确保配置类是失败项目的迁移配置。您将需要 System.Data.Entity.Migrations 才能使用 DbMigrator。

在您的应用程序中设置断点并运行它。异常应该被 Visual Studio 捕获(除非您将该异常类型设置为不中断调试会话),并且您应该能够找到您正在寻找的信息。

在我的例子中缺少的参考是 EFProviderWrapperToolkit。

【讨论】:

【参考方案23】:

当我在其中一个项目上安装 NuGet 包并忘记更新另一个项目时遇到了这个问题。

我通过使两个项目具有相同的参考程序集来解决这个问题。

【讨论】:

感谢您的链接!我不知道 NuGet 是什么。【参考方案24】:

这也发生在我身上。我解决了如下问题: 右键单击解决方案,管理解决方案的 NuGet 包... 合并软件包并将软件包升级为同一版本。

【讨论】:

【参考方案25】:

我在引用 nuget 包时遇到了这个问题,后来我使用删除选项从我的项目中删除它。在与这个问题斗争了几个小时后,我不得不清除 bin 文件夹。为避免这种情况,建议使用 nuget 卸载不需要的软件包,而不是通常的删除

【讨论】:

【参考方案26】:

在配置文件中设置 32 位 IIS 模式为真,调试模式为真,删除temp 目录并重置 IIS 暂时修复了问题,过一段时间又回来了。

【讨论】:

【参考方案27】:

验证您的每个项目在配置管理器中的设置是否正确。

类似于William Edmondson's 导致此问题的原因,我将配置管理器设置从“调试”“任何 CPU”切换到“调试”“.NET”。问题是“.NET”版本未配置为构建所有项目,因此我的一些 DLL 已过时(而其他 DLL 是最新的)。这导致启动应用程序时出现许多问题。

临时修复是执行Kenny Eliasson's 建议以清除 \bin 和 \obj 目录。但是,一旦我对非编译项目进行更多更改,一切都会再次失败。

【讨论】:

【参考方案28】:

我在使用 Visual Studio 2015 创建新的 Microsoft Word 插件时也遇到了这个问题。问题是我有两个版本的 MS Office,2013 和 2016。我卸载了 MS Office 2013,然后它就可以工作了。

【讨论】:

【参考方案29】:

我为 SharePoint 构建了几个项目,当然也部署了它们。曾经发生过一次。

我在 C:\Windows\assembly\temp\xxx(使用 FarManager)中找到了一个旧程序集,重新启动后将其删除,并构建了所有项目。

我对 MSBuild 有疑问,因为在项目程序集中像项目一样链接,并且每个程序集都标记为“复制本地”,但不是来自 GAC。

【讨论】:

【参考方案30】:

我可以通过在项目中所有引用的 DLL 文件上标记“Copy Local=True”、在测试服务器上重新构建和部署来解决此问题。

【讨论】:

以上是关于错误消息“无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使没有错误,表单也会出现错误消息?

如何解决 weasyprint 错误消息 gobject-2.0-0 错误 0x7e 消息?

如何在spring mvc 3.0中的同一jsp中显示运行时错误消息或sql错误消息

当我想连接有这个问题“错误”:“内部服务器错误”,“消息”:“没有可用的消息”,[重复]

自定义错误消息的 Grails 问题

修复包含错误的单元格时,消息框一直显示