我使用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)
实体框架似乎有问题,任何线索如何修复它?
答案 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)
两种可能的解决方案:
答案 4 :(得分:13)
如前所述,通常情况下,集会不在那里。
要准确了解您缺少的程序集,请附加调试器,设置断点,当您看到异常对象时,请深入查看“LoaderExceptions”属性。丢失的装配应该在那里。
希望它有所帮助!
答案 5 :(得分:6)
答案 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):
将此代码添加到项目中:
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
{
asm.GetTypes();
}
关闭生成序列化程序集。
答案 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,请尝试在本地复制以下参考。
将这些引用的“Copy Local”属性更改为“True”并发布。
答案 22 :(得分:1)
其他建议都很好。就我而言,问题是开发人员盒子是64位机器,使用各种API的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是由同一产品的安装程序注册的(显然是早期版本,具有/略微/不同的内容)。
如何修复
改变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)