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

时间:2009-07-07 11:40:14

标签: 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)

     

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

     

at System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadAssemblyFromCache(Assembly assembly,Boolean loadReferencedAssemblies,Dictionary 2 knownAssemblies, Dictionary 2& 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)

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

36 个答案:

答案 0 :(得分:488)

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

答案 1 :(得分:97)

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

答案 2 :(得分:52)

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

答案 3 :(得分:32)

两种可能的解决方案:

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

答案 4 :(得分:13)

如前所述,通常情况下,集会不在那里。

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

希望它有所帮助!

答案 5 :(得分:6)

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

Enter image description here

答案 6 :(得分:6)

我在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中找到它。

答案 7 :(得分:5)

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

答案 8 :(得分:5)

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

这解决了我的问题...

答案 9 :(得分:4)

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

!dumpheap -stat -type Exception / D

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

N.B。,/ D为您提供超链接结果,因此请单击FileNotFoundException摘要中的链接。这将列出一系列例外情况。然后单击其中一个例外的链接。那会!dumpobject那个例外。然后你应该只能点击异常对象中Message的链接,你就会看到文本。

答案 10 :(得分:3)

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

答案 11 :(得分:3)

另一个解决方案,知道为什么没有任何作用(来自Microsoft connect):

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

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        asm.GetTypes();
    }
    
  2. 关闭生成序列化程序集。

  3. 构建并执行。

答案 12 :(得分:2)

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

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

答案 13 :(得分:2)

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

解决了这个问题
<clear/>

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

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

参考Stack Overflow问题,一旦我确定了什么是帮助 正在进行的是 Will a child application inherit from its parent web.config?

答案 14 :(得分:2)

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

答案 15 :(得分:2)

这对我有用。将其添加到您的web.config

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

答案 16 :(得分:1)

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

答案 17 :(得分:1)

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

我通过让两个项目具有相同的参考组件来解决这个问题。

答案 18 :(得分:1)

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

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

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

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

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

我案例中缺少的参考文献是EFProviderWrapperToolkit。

答案 19 :(得分:1)

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

答案 20 :(得分:1)

我有一个在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 下载。

答案 21 :(得分:1)

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

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

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

答案 22 :(得分:1)

其他建议都很好。就我而言,问题是开发人员盒子是64位机器,使用各种AP​​I的x86位置,包括Silverlight

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

答案 23 :(得分:0)

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

答案 24 :(得分:0)

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

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

我检查了类库项目引用的所有DLL。对于所有这些(除了.net系统DLL) CopyToLocal 是真的我完全糊涂了。

我知道DLL本身有问题而不是我的代码。我再次检查了它们,我发现当我将 ApplicationOauthProvider 类移到类库项目中时, ApplicationOauthProvider 继承自 {{ 1}} 类位于 OAuthAuthorizationServerProvider 程序集中,我检查了它的包版本,突然发现我用于类库项目的包的版本(不是我的应用程序项目)是非常古老的2.1,但在我的应用程序上安装了最新版本(3.0.1)所以我从我的类库项目和问题的Nuget升级了 Microsoft.Owin.Security.OAuth 包的版本离开了

在检查了DLL的 Microsoft.Owin.Security.OAuth 属性后,请检查其版本并将旧版本更新为letest版本

答案 25 :(得分:0)

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

答案 26 :(得分:0)

如果您在 PowerShell 中引用 .dll 时遇到此错误,并且您的 .dll 是 .NET 5(也是 .NET Core?),那么您应该确保在 PowerShell 6+ 中执行 PowerShell 脚本而不是 Windows PowerShell 5.1(或更早版本)。这在特定情况下对我有帮助。

答案 27 :(得分:0)

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

答案 28 :(得分:0)

我是通过FTP更新网站的。我假设网站正在使用,当尝试更新bin文件夹时,一些DLL文件必须已被锁定且未更新。

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

问题是我没有看到FTP程序中列出的故障。我重试那些失败的失败并上传了。最后一个DLL文件已更新。所以网站随后工作了。

答案 29 :(得分:0)

我遇到了自动化问题。在bin文件夹中,文件automap.4net.dll存在,但由于某种原因,automap.xml和automap.dll不存在。将它们复制到bin目录可以解决问题。

答案 30 :(得分:0)

我可以通过标记&#34;复制本地=真&#34;来解决此问题。在项目中所有引用的DLL文件上,在测试服务器上重建和部署。

答案 31 :(得分:0)

编译Visual Studio程序包(VSPackage)时报告了相同的错误消息。整个解决方案编译并在CreatePkgDef创建程序包时抛出错误。话虽如此,很明显我无法捕获LoaderExceptions ,因为它不是我的应用程序抛出它,而是微软自己的工具。 (虽然我对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. How to Uninstall an Assembly from the GAC
    2. 卸载包含MyDll.dll的应用程序
  3. 改变AssemblyVersion对我来说已经足够了。 :)

    我希望这很有帮助。

答案 32 :(得分:0)

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

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

我对MSBuild有疑问,因为在像项目链接的项目程序集中,每个程序集都标记为&#34;复制本地&#34;,但不是来自GAC。

答案 33 :(得分:0)

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

类似于William Edmondson's这个问题的原因,我将Configuration Manager设置从“Debug”“Any CPU”切换到“Debug”“.NET”。问题是“.NET”版本没有配置为构建所有项目,所以我的一些DLL已经过时(而其他的是最新的)。这在启动应用程序时引起了许多问题。

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

答案 34 :(得分:0)

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

答案 35 :(得分:-1)

单击“查看例外详细信息”检查此属性:

enter image description here