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, 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)
实体框架似乎有问题,有没有解决的线索?
这个错误没有真正的魔法子弹答案。关键是要掌握所有的信息来理解问题。动态加载的程序集很可能缺少引用的程序集。该程序集需要位于应用程序的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/文件夹并重新构建解决方案。
两种可能的解决方案:
正如前面提到的,通常是一个组件不在那里的情况。
若要确切了解缺少的程序集,请附加调试器,设置断点,当看到异常对象时,请向下钻取到"loaderExceptions"属性。丢失的组件应该在那里。
希望它有帮助!
解决方案是检查loaderException:在我的例子中,一些dll文件丢失了。
我在ASP.NET 4+SQL Server 2008 R2+Entity Framework 4应用程序中遇到此错误。
它在我的开发机器(Windows Vista 64位)上可以正常工作。然后,当部署到服务器(Windows Server 2008 R2 SP1)时,它将一直工作,直到会话超时。所以我们部署了应用程序,一切看起来都很好,然后让它超过20分钟的会话超时,然后就会抛出这个错误。
为了解决这个问题,我在KenCox的博客上使用了这个代码来检索loaderExceptions属性。
在我的情况下,丢失的dll是
如果部署到了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" /> |
从
如果其他答案都不能帮助您:
当我遇到这个问题时,发现我的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 |
确保配置类是失败项目的迁移配置。您需要System.Data.Entity.Migrations才能使用DBMigrator。
在应用程序中设置断点,然后运行它。该异常应该由Visual Studio捕获(除非您将该异常类型设置为不中断调试会话),并且您应该能够找到要查找的信息。
在我的案例中缺少的引用是efproviderwrappertoolkit。
当我在其中一个项目上安装了nuget包而忘记更新另一个项目时,我遇到了这个问题。
我通过使两个项目具有相同的引用程序集来解决这个问题。
这也发生在我身上。我解决的问题如下:右键单击解决方案,管理解决方案的Nuget包…合并包并将包升级为同一版本。
在配置文件中将32位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是由同一产品的安装程序注册的(显然是早期版本,内容略有不同)。
如何修复
- [程序集:assemblyversion("1.0.0.1")]//假定旧的dll文件版本为1.0.0.0
- [程序集:assemblyfileversion("1.0.0.1")]//假定旧的dll文件版本为1.0.0.0
更改assemblyversion对我来说已经足够好了。:)
我希望这是有帮助的。
我可以通过在项目中所有引用的dll文件上标记"copy local=true",在测试服务器上重新构建和部署来解决此问题。
我和automap有问题。在
我正在通过ftp更新一个网站。我假设网站正在使用中,当尝试更新bin文件夹时,一些dll文件必须已锁定,并且没有更新。
在那里,我看到了错误500页,在将客户错误模式设置为关闭时,看到了OP提到的错误消息。
问题是我没有看到ftp程序中列出的失败。我再次尝试那些失败的失败,他们上传了。上次更新的dll文件。于是这个网站开始运作。
在使用Visual Studio 2015创建新的Microsoft Word加载项时,我也遇到了这个问题。这个问题是关于我有两个版本的MS Office,2013年和2016年。我卸载了MS Office 2013,然后它就工作了。
我在nuget控制台中键入迁移命令时遇到了实体框架的这个问题。
当我将我的
我检查了类库项目引用的所有DLL。对于所有这些(除了.NET系统DLL)来说,copytolocal是真的,我完全困惑了。
我知道DLL本身有问题,而不是我的代码。我再次检查了它们,发现当我把我的
简言之,检查完DLL的
验证您的每个项目是否在配置管理器中正确设置。
类似于WilliamEdmondson提出这个问题的原因,我将配置管理器设置从"debug""any cpu"切换到"debug"".net"。问题是".net"版本没有配置为构建所有项目,因此我的一些DLL已过期(而其他的则是最新的)。这导致启动应用程序时出现许多问题。
临时的解决方法是执行Kenny Eliasson的建议,清除in和obj目录。但是,一旦我对非编译项目做了更多的更改,一切都将再次失败。
单击"查看异常详细信息"检查此属性: