错误消息“无法加载一个或多个请求的types。 检索LoaderExceptions属性以获取更多信息。
我已经使用entity framework ,SQL Server 2000,Visual Studio 2008和企业库开发了一个应用程序。
它在本地工作绝对正常,但是当我将项目部署到我们的testing环境时,出现以下错误:
无法加载一个或多个请求的types。 检索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 assembly,Boolean loadReferencedAssemblies,Dictionary
2 knownAssemblies, Dictionary
2&typesInLoading,List`1&errors)在System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection objectItemCollection,程序集程序集,布尔loadReferencedAssemblies)
在System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyForType(typestypes)
在System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType(typestypes,程序集callsAssembly)
在System.Data.Objects.ObjectContext.CreateQuery [T](String queryString,ObjectParameter [] parameters)
entity framework似乎有问题,任何线索如何解决它?
我通过将我的项目的引用的复制本地属性设置为true来解决此问题。
这个错误没有真正的魔术弹头答案。 关键是要有所有的信息来了解问题。 一个dynamic加载的程序集很可能缺less一个引用程序集。 该程序集需要位于应用程序的bin目录中。
使用此代码来确定缺less的东西。
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. }
一个解决scheme适用于我,是删除bin /和obj /文件夹并重build解决scheme。
两种可能的解决方
- 您正在以“发行版”模式进行编译,但从Debug目录中部署较早的编译版本(或反之亦然)。
- 您的testing环境中没有安装正确的.NET Framework版本。
正如之前所提到的那样,通常情况下是不在那里的集会。
为了确切地知道你所缺less的程序集,附加你的debugging器,设置一个断点,当你看到这个exception对象时,深入挖掘LoaderExceptions属性。 缺less的程序集应该在那里。
希望它有帮助!
我遇到了一个ASP.NET 4 + SQL Server 2008 R2 + entity framework 4应用程序的这个错误。
它可以在我的开发机器(Windows Vista 64位)上正常工作。 然后,当部署到服务器( Windows Server 2008 R2 SP1)时,它将工作,直到会话超时。 所以我们部署应用程序,一切看起来都不错,然后让它超过20分钟的会话超时,然后这个错误将被抛出。
为了解决这个问题,我在Ken Cox的博客上使用了这个代码来检索LoaderExceptions属性。
对于我的情况,缺less的DLL是Microsoft.ReportViewer.ProcessingObjectModel
(版本10)。 该DLL需要安装在应用程序运行的机器的GAC中。 您可以在Microsoft下载站点上的Microsoft Report Viewer 2010 Redistributable Package中find它。
如果您部署到IIS,请确保您允许在IIS上使用32位应用程序。 你可以在你当前的应用程序池的设置上定义它。
如果您在项目中使用EntityDataSource,则解决scheme位于“ 修复:无法加载一个或多个请求的types”错误 。 你应该设置ContextTypeName =“ProjectNameNameSpace.EntityContainerName”
这解决了我的问题…
最初,我尝试了Fusion日志查看器,但是这并没有帮助,所以我最终使用WinDbg和SOS扩展。
!dumpheap -stat -typeexception/ D
然后我检查了FileNotFoundExceptions。 exception中的消息包含未加载的DLL的名称。
注意,/ D给你超链接的结果,所以点击FileNotFoundException摘要中的链接。 这将列出例外的列表。 然后点击链接,查看其中一个例外情况。 这将!dumpobject,例外。 然后,您应该只需点击exception对象中的消息链接即可看到文本。
另一个解决scheme,以知道为什么没有任何工作(从微软连接):
-
将此代码添加到项目中:
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) { asm.GetTypes(); }
-
closures生成序列化程序集。
- build立并执行。
添加我的具体问题/解决scheme,因为这是这个错误消息的第一个结果。 在我的情况下,当我在IIS中的第一个应用程序的文件夹中部署第二个应用程序时收到错误。 两者都定义了具有相同名称的连接string,导致子应用程序发生冲突,进而产生这个(对我来说)非显而易见的错误消息。 这是通过添加:
<clear/>
在子Web应用程序的连接string块中阻止它inheritance层次结构中较高级别的web.config文件的连接string,所以它看起来像:
<connectionStrings> <clear/> <add name="DbContext" connectionString="MySERVER" providerName="System.Data.SqlClient" /> </connectionStrings>
一旦我确定发生了什么,一个引用的堆栈溢出问题会是一个子应用程序inheritance它的父级web.config? 。
这对我有效。 将其添加到您的web.config
<system.web> <trust level="Full" />
我的这个问题的实例最终成为一个缺less的参考。 在app.config中引用了一个程序集,但在项目中没有引用。
我在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的build议,所以我安装了Windows SDK v7.1(x64)在失败的服务器上,所以我可以运行!dumpheap。
那么,事实certificate,安装Windows SDK v7.1(x64)解决了这个问题。 SDK中必须包含缺失的任何依赖项。 它可以从Microsoft Windows SDK for Windows 7和.NET Framework 4下载 。
如果您正在使用entity framework ,请尝试在本地复制以下参考。
- System.Data.Entity的
- System.Web.Entity
将这些引用的属性“Copy Local”更改为“True”并发布。
其他build议都很好。 在我的情况下,问题是开发人员的盒子是一个64位机器,使用各种API的x86位置,包括Silverlight 。
通过更改目标平台以匹配部署Web应用程序的32位服务器,大多数与不能加载一个或多个请求types有关的错误都被删除。
我将Refrences的特定版本属性更改为false,这有所帮助。
当我尝试使用程序包pipe理器控制台添加entity framework迁移时,我遇到了同样的问题(但在本地)。
我解决这个问题的方法是创build一个控制台应用程序,其中Main()具有以下代码:
var dbConfig = new Configuration(); var dbMigrator = new DbMigrator(dbConfig); dbMigrator.Update();
确保configuration类是您的失败项目的迁移configuration。 您将需要System.Data.Entity.Migrations使用DbMigrator。
在你的应用程序中设置一个断点,并运行它。 这个exception应该被Visual Studio捕获(除非你把那个exceptiontypes设置为不中断debugging会话),你应该能够find你正在寻找的信息。
在我的情况下缺less的参考是EFProviderWrapperToolkit。
当我在其中一个项目上安装了一个NuGet软件包,并忘记更新其他项目时,我遇到了这个问题。
我通过使两个项目具有相同的参考组件来解决此问题。
从bin
文件夹中删除冗余程序集文件后,我的问题已得到解决。
如果没有其他答案可以帮助您:
当我遇到这个问题时,事实certificate我的Windows服务是为x64平台而构build的,而且我无意间运行了32位版本的InstallUtil.exe。 因此,请确保您使用正确版本的InstallUtil作为您所创build的平台。
将32位IIS模式设置为true,在configuration文件中将debug模式设置为true,删除temp
目录并重置IIS,暂时解决问题,并在一段时间后恢复。
validation您的每个项目在configurationpipe理器中正确设置 。
类似于这个问题的William Edmondson的理由,我将Configuration Manager设置从“Debug”“Any CPU”切换到“Debug”“.NET”。 问题是,“.NET”版本没有configuration为构build所有的项目,所以我的一些DLL已经过时(而其他人是最新的)。 这在启动应用程序时造成了许多问题。
暂时的解决办法是做Kenny Eliasson的build议,清除\ bin和\ obj目录。 但是,只要我对非编译项目做了更多的修改,一切都会失败。
使用Visual Studio 2015创build新的Microsoft Word加载项时,我也遇到了这个问题。问题是我有两个版本的MS Office,2013和2016.我卸载MS Office 2013,然后工作。
我为SharePoint构build了一些项目,当然也部署了它们。 有一次发生了。
我在C:\ Windows \ assembly \ temp \ xxx(使用FarManager)中find了一个旧的程序集,在重新启动后将其删除,并且构build了所有项目。
我有MSBuild的问题,因为在像项目链接的项目程序集,每个程序集都标记为“复制本地”,但不是从GAC。
编译Visual Studio包(VSPackage)时报告了相同的错误消息。 整个解决scheme编译和CreatePkgDef创build包时引发错误。 话虽如此,很明显, 我不能捕获LoaderExceptions,因为它不是我的应用程序抛出它,而是微软自己的工具。 (虽然我对CreatePkgDef的困惑负责。)
在我的情况下, 根本原因是我的解决scheme创build一个已经注册到GAC的MyDll.dll(他们是不同的),所以CreatePgkDef弄糊涂使用哪一个,它决定只是抛出一个错误,真的很有帮助 GAC中的MyDll.dll是由同一产品的安装程序注册的(显然是早期版本,具有/稍微/不同的内容)。
如何解决它
- 首选方法: 确保使用正确版本的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
- 如果需要,请在其他项目中引用它时指定完全限定的程序集名称(例如,“MyDll.dll,Version = 1.0.0.1,Culture = neutral,PublicKeyToken = 1234567890abcdef”)。
- 编译项目时,请确保使用的版本号与您在GAC中以前版本中使用的版本号不同。 确保以下属性是正确的:
- 如果上述失败: 您可以从GAC中卸载旧的MyDll.dll
- 如何从GAC卸载程序集
- 卸载包含MyDll.dll的应用程序
改变AssemblyVersion对我来说已经足够了。 🙂
我希望这是有帮助的。
我能够通过在项目中所有引用的DLL文件上标记“Copy Local = True”来解决这个问题,在testing服务器上重build和部署。
我有一个关于automap的问题。 在bin
文件夹中,文件automap.4net.dll在那里,但由于某种原因automap.xml和automap.dll不是。 将它们复制到bin
目录解决了这个问题。
我正在通过FTP更新网站。 我假设网站正在使用,当试图更新bin文件夹时,一些DLL文件必须已被locking,并没有更新。
在那里,我看到错误500页,并将customErrors模式设置为关,看到由OP提到的错误信息。
问题是我没有看到在FTP程序中列出的故障。 我重试失败失败,他们上传。 最后一个DLL文件已更新。 所以,该网站然后工作。
解决的办法是检查LoaderException:在我的情况下,一些DLL文件丢失。