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


347

我已经使用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程序集,Boolean loadReferencedAssemblies,字典2 knownAssemblies, Dictionary2&typesInLoading,List`1&错误)

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

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

在System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType(类型类型,程序集callingAssembly)

在System.Data.Objects.ObjectContext.CreateQuery [T](字符串queryString,ObjectParameter []参数)处

实体框架似乎有问题,有什么线索如何解决?


没有解决这个问题的灵丹妙药,但是这个答案将帮助您知道非常确切的原因stackoverflow.com/a/8824250/185022
AZ_

Answers:


105

我通过将项目引用的“复制本地”属性设置为true解决了此问题。


33
当我们继续深入研究内部异常时,直到看到类型为ReflectionTypeLoadException的异常,并且它具有属性“ LoaderExceptions”,该属性提供有关丢失或不匹配的DLL信息的信息。然后,我们可以从那里开始采取适当的措施。
2014年

19
好,从Visual Studio调试时很好。但是,如果您是Web应用程序,那么只会在生产服务器上抛出此错误呢?即使将“本地复制”属性设置为true也是如此。
Yousi 2014年

2
这是针对生产服务器(而不是本地Visual Studio)上的问题的解决方案。“本地复制”在构建时复制引用的DLL,并且首先在与正在运行的应用程序相同的文件夹中搜索DLL。如果您没有将在构建时复制的DLL复制到生产服务器上的正确文件夹,则该问题可能会继续存在。
Mentoliptus

就我而言,我还必须添加对Microsoft.AspNetCore.Mvc.ViewFeatures
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ǝɯɐſ15年

2
你救了我的命。非常感谢。我永远不会发现问题。这是一些我不再使用的旧dll,潜伏在我的项目结构中并导致了此问题。
理查德

4
只是为了快速找出缺失,使用throw new Exception(errorMessage);,希望对某人有用。
shaijut

2
没有任何额外的代码,在Visual Studio中转到“异常设置”,然后在搜索框中输入TypeLoadException,然后启用“两命中”复选框。另外,您可能必须在调试部分“仅我的代码”下的选项中禁用该选项,以便在未编写的依赖项中发生异常时捕获异常。
大卫·伯格

56

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


我不得不重新构建测试项目本身,不确定您是指此处的测试项目还是要测试的项目。
詹森·阿克森

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

我有这个问题。按照建议,我关闭了Visual Studio,删除了bin文件夹,重新打开了项目并进行了重建,它成功了。
Sagar S.

当我在具有重大更改的分支之间切换时,就是这种情况。删除垃圾箱是可行的。清洁和重建无效。
JGTaylor'7

33

两种可能的解决方案:

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

我有同样的问题,第1点对我来说是正确的。谢谢威廉。
马修

我遇到了同样的问题...我经历了两个建议,仍然收到相同的错误:(
David Kiff

如果您引用的DLL被“阻止”,也会发生这种情况。右键单击它,然后选择“取消阻止”
Ben

3
如果将DLL项目之一设置为构建“ x64”而不是“任何CPU”,也会发现这种情况发生。
DCastenholz 2012年

如果解决方案配置不正确,则会发生#1-未选择要构建的项目,例如,在删除项目并将其再次添加到解决方案之后
surfen 2012年

13

如前所述,通常是不存在装配的情况。

要确切了解缺少的程序集,请附加调试器,设置一个断点,然后在看到异常对象时,向下钻取到“ LoaderExceptions”属性。缺少的程序集应该在那里。

希望能帮助到你!


1
同样,我们可以继续挖掘内部异常,直到我们看到类型为ReflectionTypeLoadException的异常,并且它具有属性“ LoaderExceptions”,该属性提供有关丢失或不匹配的DLL信息的信息。
2014年

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

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异常/ D

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

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



4

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


3

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

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

对于这些引用,将属性“复制本地”更改为“真”,然后发布。


3

知道为什么什么都不起作用的另一种解决方案(来自Microsoft Connect):

  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中必须包含任何缺少的依赖项。可以从适用于Windows 7和.NET Framework 4的Microsoft Windows SDK下载该文件。


2

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

<clear/>

在子Web应用程序的连接字符串块中,阻止了子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位处理器编译的,更改为任何处理器,现在可以使用。
布莱克·史塔德

1

其他建议都很好。就我而言,问题是开发者盒是一台64位计算机,使用了各种API(包括Silverlight)的x86位置

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


1

我将Refrences的“ Specific Version”属性更改为false,这有所帮助。


1

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

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

如何修复

  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

当我尝试使用Package Manager Console添加Entity Framework迁移时,我遇到了相同的问题(但在本地)。

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

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

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

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

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


1

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

我通过使两个项目具有相同的参考装配体来解决了这一问题。


感谢您的链接!我不知道什么是NuGet。
jebar8

1

这件事对我来说也发生了。我解决了以下问题:右键单击解决方案,为解决方案管理NuGet软件包...合并软件包并将软件包升级到相同版本。


0

在配置文件中将32位IIS模式设置为true,将调试模式设置为true,删除temp目录并重新设置IIS可以暂时解决此问题,并在一段时间后返回。


0

验证是否在Configuration Manager中正确设置了每个项目。

相似 William Edmondson导致此问题原因,我将Configuration Manager设置从“调试”“任何CPU”切换为“调试”“ .NET”。问题是“ .NET”版本未配置为构建所有项目,因此我的某些DLL已过期(而其他DLL是最新的)。这在启动应用程序时引起了许多问题。

临时的解决方法是按照肯尼·埃里亚森的建议清除\ bin和\ obj目录。但是,一旦我对非编译项目进行了更多更改,一切都会再次失败。


0

当使用Visual Studio 2015创建新的Microsoft Word加载项时,我也遇到了此问题。该问题与我有2个版本的MS Office,2013和2016有关。我卸载了MS Office 2013,然后它可以工作。


0

我为SharePoint构建了一些项目,当然也进行了部署。曾经发生过一次。

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

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


0

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


0

我对自动贴图有疑问。在该bin文件夹中,存在文件automap.4net.dll,但是由于某种原因,没有automap.xml和automap.dll。将它们复制到bin目录即可解决此问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.