在 x64 项目中启用迁移获取 System.BadImageFormatException

问题描述:

我有一个设置为 x64 的项目(它使用了一些仅 64 位的 Nuget 包).一切运行和部署都很好,但是尝试在包管理器控制台上运行 EF 的 enable-migrations 会得到一个 System.BadImageFormatException.完整的例外:

I have a project set to x64 (it's using some Nuget packages that are 64-bit only). Everything runs and deploys fine, but trying to run EF's enable-migrations at the Package Manager Console gets me a System.BadImageFormatException. The full exception:

PM> enable-migrations
System.BadImageFormatException: Could not load file or assembly  or one of its dependencies. An attempt was made to load a program with an incorrect format.
File name: 
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection)
   at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.Load(String assemblyString)
   at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.LoadAssembly(String name)
   at System.Data.Entity.Migrations.Design.ToolingFacade.GetContextTypeRunner.Run()
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.GetContextType(String contextTypeName)
   at System.Data.Entity.Migrations.EnableMigrationsCommand.FindContextToEnable(String contextTypeName)
   at System.Data.Entity.Migrations.EnableMigrationsCommand.<>c__DisplayClass2.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLMSoftwareMicrosoftFusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLMSoftwareMicrosoftFusion!EnableLog].

Could not load file or assembly  or one of its dependencies. An attempt was made to load a program with an incorrect format.

注意:我已经从错误消息中删除了项目名称,这既是为了让谷歌更容易搜索,又是因为它与这个问题无关.

Note: I've removed the project name from the error message, both to make this easier to google and because it's irrelevant to this problem.

问题是 enable-migrations 命令似乎有一个硬编码的路径,EF 在其中查找您项目的构建 DLL在 /bin/Debug 处,无论实际构建路径是什么.当您将项目更改为 x64 时,Visual Studio 会悄悄地将您项目的构建路径更改为 /bin/x64/Debug - 而 EF 则继续在 /bin/Debug 中查找.这会导致这个模糊的 System.BadImageFormatException.

The problem is that the enable-migrations command appears to have a hard-coded path where EF looks for built DLLs of your project at /bin/Debug, no matter what the actual build path is. When you change a Project to x64, Visual Studio quietly changes your project's build path to /bin/x64/Debug - while EF keeps looking in /bin/Debug. That causes this vague System.BadImageFormatException.

将您的项目构建路径更改为 /bin/Debug 是无害的,而且神奇的是,一切都开始按预期工作.

It's harmless to just change your Project build path to /bin/Debug and magically, everything begins working like it's supposed to.

错误一直存在到 EF 6.1.0(包括 EF 6.1.0).已发布错误报告.

Bug exists up to and including EF 6.1.0. Bug report posted.

更新:Microsoft 已决定不修复该错误,已关闭为 wontfix,因为存在解决方法.非常糟糕的行为.

Update: Microsoft has decided not to bother fixing the bug, closed as wontfix, because a workaround exists. Pretty bad behavior.