错误消息“无法加载一种或多种请求的类型。检索 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,Dictionary
2 knownAssemblies, Dictionary
2& 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”)。
-
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错误消息