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

我已经开发了一个应用程序使用实体框架, SQL Server 2000, Visual Studio 2008和企业库。

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

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

堆栈跟踪:at 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(集合程序集,布尔值loadReferencedAssemblies, Dictionary2 knownAssemblies, Dictionary2&typesInLoading、列表' 1,错误)

在System.Data.Metadata.Edm.ObjectItemCollection。loadassemblyfromache (ObjectItemCollection ObjectItemCollection, Assembly Assembly, Boolean loadReferencedAssemblies)

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

在System.Data.Metadata.Edm.MetadataWorkspace。LoadAssemblyForType(类型类型,Assembly callingAssembly)

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

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

458464 次浏览

两种可能的解决方案:

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

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

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

更新:

或者您可以尝试右键单击“解决方案资源管理器”中的“解决方案”节点。点击“清洁解决方案”,然后点击“重建解决方案”。(感谢埃姆雷·古尔多安)

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

!dumpheap -stat -type异常/D

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

注意,/D会给你超链接的结果,所以点击FileNotFoundException摘要中的链接。这将显示一个例外列表。然后点击其中一个例外的链接。那将!dumpobject异常。然后,您应该能够单击异常对象中的Message链接,然后您将看到文本。

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

我用Visual Studio 2010开发了一个。net 4.0, ASP。NET MVC 2.0, 实体框架 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 .NET Framework 4< a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b&displaylang=en" rel="nofollow">微软Windows SDK for Windows 7 and .NET Framework 4下载。

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

我在使用ASP时遇到了这个错误。NET 4 + SQL Server 2008 R2 + 实体框架 4应用程序。

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

为了解决这个问题,我使用肯·考克斯博客上的代码来检索LoaderExceptions属性。

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

如果您正在使用实体框架,请尝试在本地复制以下引用。

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

将这些引用的“Copy Local”属性更改为“True”并发布。

另一个解决方案,知道为什么什么都不能工作(从微软连接):

  1. 将以下代码添加到项目中:

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
    asm.GetTypes();
    }
    
  2. Turn off generation serialization assemblies.

  3. Build and execute.

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

这解决了我的问题……

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

其他建议都很好。在我的例子中,问题是开发人员盒子是一个64位机器,使用各种api的x86位置,包括Silverlight

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

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

<clear/>

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

<connectionStrings>
<clear/>
<add name="DbContext" connectionString="MySERVER" providerName="System.Data.SqlClient" />
</connectionStrings>
一个参考堆栈溢出问题,一旦我确定什么是帮助

. going on was 子应用程序会从父应用程序web.config继承吗?< / >.

在配置文件中将32位IIS模式设置为true,调试模式设置为true,删除temp目录并重置IIS可以暂时修复问题,一段时间后它会回来。

正如之前所提到的,通常情况下,组装不存在。

要确切地知道您丢失了什么程序集,请附加调试器,设置断点,当您看到异常对象时,钻到'LoaderExceptions'属性。丢失的程序集应该在那里。

希望能有所帮助!

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

类似于威廉·埃德蒙森的这个问题的原因,我将我的配置管理器设置从“调试”“任何CPU”切换到“调试”“。net”。问题是“。”NET的版本没有配置为构建所有的项目,所以我的一些dll是过时的(而另一些是最新的)。这导致启动应用程序时出现许多问题。

临时修复是做肯尼·埃利亚松的建议清理\bin和\obj目录。然而,一旦我对非编译项目做了更多的更改,一切都会再次失败。

我改变了引用的特定版本属性为假,这有助于。

我为SharePoint构建了一些项目,当然,也部署了它们。有一次发生了。

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

我对MSBuild有疑问,因为在项目程序集中链接的项目和每个程序集都标记为“复制本地”,但不是从GAC。

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

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

如何解决

  1. 首选方法: 请确保您使用了正确的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
      • 李< / ul > < / >
      • 如果需要,请在其他项目中引用时指定完全限定程序集名称(例如,“MyDll.dll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=1234567890abcdef”)。
      • 李< / ol > < / >
      • 您可以从GAC卸载旧的MyDll.dll
        1. 如何从GAC上卸载程序集 . 0如何从GAC上卸载程序集
        2. 卸载包含MyDll.dll的应用程序
        3. 李< / ol > < / >

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

        我希望这对你们有帮助。

我能够通过在项目中所有引用的DLL文件上标记“复制本地=True”来修复这个问题,在测试服务器上重新构建和部署。

我在自动地图上出了点问题。在bin文件夹中,automap.4net.dll文件在那里,但由于某种原因,automap.xml和automap.dll不在那里。将它们复制到bin目录解决了这个问题。

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

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

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

确保Configuration类是失败项目的迁移配置。你需要System.Data.Entity.Migrations来使用DbMigrator。

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

在我的案例中,缺少的引用是EFProviderWrapperToolkit。

我正在通过FTP更新一个网站。我假设网站正在使用中,当尝试更新bin文件夹时,几个DLL文件必须被锁定并且没有更新。

在那里,我看到了错误500页,并将customErrors模式设置为关闭,看到了OP提到的错误消息。

问题是我没有看到FTP程序中列出的失败。我重试了那些失败的失败,他们上传。更新了最后一个DLL文件。于是这个网站就成功了。

这对我很管用。把它添加到你的web.config中

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

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

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

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

以防其他答案都帮不了你:

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

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

Enter image description here

点击“查看异常详细信息”检查此属性:

enter image description here

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

在Nuget控制台中输入迁移命令时,我遇到了实体框架的这个问题。

当我把我的OAuthAuthorizationServerProvider代码从我的应用程序移动到一个类库项目,其中包含核心数据访问逻辑以及我的DBContext类时,问题出现了。

我检查类库项目引用的所有dll。和他们所有人(除了.net系统dll) CopyToLocal是真的,我完全困惑。

我知道dll本身有问题,而不是我的代码。我再次检查了它们,我注意到当我将我的ApplicationOauthProvider类移动到一个类库项目中,ApplicationOauthProvider继承自位于Microsoft.Owin.Security.OAuth程序集中的OAuthAuthorizationServerProvider类时,我检查了它的包版本,突然注意到我用于类库项目(不是我的应用程序项目)的包版本非常旧2.1,但是在我的应用程序上安装了最新版本(3.0.1),所以我从Nuget升级了Microsoft.Owin.Security.OAuth包的版本,用于我的类库项目,问题消失了

简而言之,在检查dll的CopyToLocal属性后,也检查它们的版本,并将旧版本更新到letest版本

我也有过这样的经历。我的解决方法如下: 右键单击解决方案,管理解决方案的NuGet包…

.

.

.

.

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

在我的情况下,我有一个nuget包,安装在我的项目,但包文件夹从未检入到TFS,因此,在构建机器的nuget包bin文件丢失。因此在生产中我得到了这个错误。我不得不比较bin文件夹在生产和我的本地,然后我发现哪些dll是缺失的,我发现那些属于一个nuget包。

如果您在PowerShell中引用.dll时遇到此错误,而您的.dll是. net 5(。),那么你应该确保你在PowerShell 6+而不是Windows PowerShell 5.1(或更早的版本)中执行PowerShell脚本。这在一个特定的场景中帮助了我。