我使用实体框架,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)

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


当前回答

我在编译Visual Studio包(VSPackage)时报告了相同的错误消息。编译整个解决方案,当CreatePkgDef创建包时抛出错误。话虽如此,很明显,我无法捕获loaderexception,因为它不是我的应用程序抛出的,而是微软自己的工具。(虽然我对CreatePkgDef的混乱负责。)

在我的情况下,根本原因是我的解决方案创建了一个MyDll.dll,已经注册到GAC(他们是不同的),所以CreatePgkDef混淆了使用哪个,它决定只是抛出一个错误,这并没有真正的帮助。GAC中的MyDll.dll是由相同产品的安装程序注册的(显然是较早的版本,内容略有不同)。

如何解决

Preferred way: Make sure you use the correct version of MyDll.dll When compiling your project make sure you use a different version number than you used in the previous version located in the GAC. Make sure the following attributes are correct: [assembly: AssemblyVersion("1.0.0.1")] // Assuming the old DLL file was versioned 1.0.0.0 [assembly: AssemblyFileVersion("1.0.0.1")] // Assuming the old DLL file was versioned 1.0.0.0 If needed, specify the fully qualified assembly name (for example, "MyDll.dll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=1234567890abcdef") when you reference it in your other projects. If the above failed: You can uninstall the old MyDll.dll from GAC How to Uninstall an Assembly from the GAC Uninstall the application that includes MyDll.dll

更改AssemblyVersion对我来说已经足够好了。:)

我希望这对你们有帮助。

其他回答

我有一个。net 4.0, ASP。NET MVC 2.0,实体框架4.0 web应用程序开发在Visual Studio 2010。我遇到了同样的问题,它在一台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中。它可以从微软Windows SDK for Windows 7和。net Framework 4下载。

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

类似于William Edmondson关于这个问题的原因,我将我的配置管理器设置从“调试”“任意CPU”切换到“调试”“。net”。问题是“。”NET的版本没有配置为构建所有的项目,所以我的一些dll是过时的(而另一些是最新的)。这导致启动应用程序时出现许多问题。

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

正如之前所提到的,通常情况下,组装不存在。

要确切地知道您丢失了什么程序集,请附加调试器,设置断点,当您看到异常对象时,钻到'LoaderExceptions'属性。丢失的程序集应该在那里。

希望能有所帮助!

两种可能的解决方案:

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

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