关于c#:错误消息’无法加载一个或多个请求的类型。

Error message 'Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.'

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

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

Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information

Stack trace: at System.Reflection.Module._GetTypesInternal(StackCrawlMark& stackMark)

at 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, Dictionary2 knownAssemblies, Dictionary2& 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)

实体框架似乎有问题,有没有解决的线索?


这个错误没有真正的魔法子弹答案。关键是要掌握所有的信息来理解问题。动态加载的程序集很可能缺少引用的程序集。该程序集需要位于应用程序的bin目录中。

使用此代码确定缺少的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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.
}


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


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


两种可能的解决方案:

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

  • 正如前面提到的,通常是一个组件不在那里的情况。

    若要确切了解缺少的程序集,请附加调试器,设置断点,当看到异常对象时,请向下钻取到"loaderExceptions"属性。丢失的组件应该在那里。

    希望它有帮助!


    解决方案是检查loaderException:在我的例子中,一些dll文件丢失了。

    Enter image description here


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

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

    为了解决这个问题,我在KenCox的博客上使用了这个代码来检索loaderExceptions属性。

    在我的情况下,丢失的dll是Microsoft.ReportViewer.ProcessingObjectModel(版本10)。此dll需要安装在运行应用程序的计算机的GAC中。您可以在Microsoft下载网站上提供的Microsoft Report Viewer 2010可再发行软件包中找到它。


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


    如果在项目中使用EntityDataSource,则解决方案处于修复状态:"无法加载一个或多个请求类型的错误。"您应该设置contexttypename="projectnamenamespace.entitycontainername"'

    这解决了我的问题…


    最初我尝试了Fusion日志查看器,但没有帮助所以我最终使用了windbg和sos扩展。

    !dumpheap-stat-type异常/d

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

    注意,/D提供超链接的结果,所以单击文件摘要中的链接,以获取fileNotFoundException。这将列出一系列例外情况。然后单击其中一个例外的链接。那就行了!转储异常的对象。然后您应该只需单击异常对象中消息的链接,就可以看到文本。


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


    另一个解决方案是了解为什么什么都不起作用(来自Microsoft Connect):

  • 将此代码添加到项目:

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

  • 构建和执行。

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

    1
    <clear/>

    在子Web应用程序的连接字符串块中,阻止它继承层次结构中更高级别的web.config文件的连接字符串,因此如下所示:

    1
    2
    3
    4
    <connectionStrings>
      <clear/>
     
    </connectionStrings>

    一个引用堆栈溢出问题,一旦我确定了正在进行的是子应用程序将从其父web.config继承吗?.


    这对我很有用。将其添加到web.config中

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


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


    如果其他答案都不能帮助您:

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


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

    • system.data.实体
    • system.web.实体

    将这些引用的属性"copy local"更改为"true",然后发布。


    其他建议都不错。在我的例子中,问题是开发人员框是一台64位计算机,使用各种API(包括Silverlight)的x86位置。

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


    我在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的建议,所以我在失败的服务器上安装了WindowsSDKv7.1(x64),这样我就可以运行了!笨蛋。

    事实证明,安装WindowsSDKv7.1(x64)解决了这个问题。任何缺少的依赖项都必须包含在SDK中。它可以从Microsoft Windows SDK for Windows 7和.NET Framework 4下载。


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


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

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

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

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

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

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


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

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


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


    在配置文件中将32位IIS模式设置为真,调试模式设置为真,删除temp目录,重置IIS临时修复问题,一段时间后返回。


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


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

    我在C:windowsassembly empxxx(带farmanager)中找到了一个旧程序集,在重新启动后将其删除,并生成了所有项目。

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


    编译Visual Studio包(vPackage)时报告了相同的错误消息。整个解决方案编译,当createpkgdef创建包时引发错误。尽管如此,很明显我不能捕获loaderExceptions,因为抛出它的不是我的应用程序,而是微软自己的工具。(尽管我要为createpkgdef的混乱负责。)

    在我的例子中,根本原因是我的解决方案创建了一个已经注册到GAC的my dll.dll(它们是不同的),因此createpgkdef混淆了要使用哪一个,它决定只抛出一个没有真正帮助的错误。GAC中的mydll.dll是由同一产品的安装程序注册的(显然是早期版本,内容略有不同)。

    如何修复

  • 首选方式:确保使用正确版本的mydll.dll
  • 编译项目时,请确保使用的版本号与GAC中以前版本中使用的版本号不同。确保以下属性正确:
    • [程序集:assemblyversion("1.0.0.1")]//假定旧的dll文件版本为1.0.0.0
    • [程序集:assemblyfileversion("1.0.0.1")]//假定旧的dll文件版本为1.0.0.0
  • 如果需要,请在其他项目中引用完全限定的程序集名称(例如,"mydll.dll,version=1.0.0.1,culture=neutral,publickeytoken=1234567890abcdef")。
  • 如果上述操作失败:您可以从GAC卸载旧的mydll.dll
  • 如何从GAC卸载程序集
  • 卸载包含mydll.dll的应用程序
  • 更改assemblyversion对我来说已经足够好了。:)

    我希望这是有帮助的。


    我可以通过在项目中所有引用的dll文件上标记"copy local=true",在测试服务器上重新构建和部署来解决此问题。


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


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

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

    问题是我没有看到ftp程序中列出的失败。我再次尝试那些失败的失败,他们上传了。上次更新的dll文件。于是这个网站开始运作。


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


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

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

    我检查了类库项目引用的所有DLL。对于所有这些(除了.NET系统DLL)来说,copytolocal是真的,我完全困惑了。

    我知道DLL本身有问题,而不是我的代码。我再次检查了它们,发现当我把我的ApplicationOauthProvider类移到类库项目中时,ApplicationOauthProvider继承了OAuthAuthorizationServerProvider类,它位于Microsoft.Owin.Security.OAuth程序集中,我检查了它的包版本,突然发现我用于类库项目的包版本(不是我的应用程序项目t)是非常老的2.1版本,但在我的应用程序中安装了最新版本(3.0.1),所以我从nuget for my class library项目升级了Microsoft.Owin.Security.OAuth包的版本,问题就解决了。

    简言之,检查完DLL的CopyToLocal属性后,也要检查它们的版本,并将旧版本更新为letest版本。


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

    类似于WilliamEdmondson提出这个问题的原因,我将配置管理器设置从"debug""any cpu"切换到"debug"".net"。问题是".net"版本没有配置为构建所有项目,因此我的一些DLL已过期(而其他的则是最新的)。这导致启动应用程序时出现许多问题。

    临时的解决方法是执行Kenny Eliasson的建议,清除in和obj目录。但是,一旦我对非编译项目做了更多的更改,一切都将再次失败。


    单击"查看异常详细信息"检查此属性:

    enter image description here