web-dev-qa-db-ja.com

x64プロジェクトでのenable-migrationsはSystem.BadImageFormatExceptionを取得します

プロジェクトをx64に設定しています(64ビットのみのNugetパッケージを使用しています)。すべてが正常に実行およびデプロイされますが、パッケージマネージャーコンソールでEFのenable-migrationsを実行しようとすると、System.BadImageFormatExceptionが取得されます。完全な例外:

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 [HKLM\Software\Microsoft\Fusion!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 [HKLM\Software\Microsoft\Fusion!EnableLog].

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

注:これをグーグルで検索しやすくするためと、この問題とは無関係であるため、エラーメッセージからプロジェクト名を削除しました。

24
Chris Moschini

問題は、実際のビルドパスが何であっても、EFがプロジェクトのビルドDLLをenable-migrationsで検索する/bin/Debugコマンドにハードコードされたパスがあるように見えることです。プロジェクトをx64に変更すると、VisualStudioはプロジェクトのビルドパスを静かに/bin/x64/Debugに変更しますが、EFは/bin/Debugを探し続けます。これにより、このあいまいなSystem.BadImageFormatExceptionが発生します。

プロジェクトのビルドパスを/bin/Debugに変更するだけでも無害であり、魔法のように、すべてが想定どおりに機能し始めます。

バグはEF6.1.0まで存在します。 バグレポートが投稿されました

更新:回避策が存在するため、Microsoftはバグの修正を気にしないことを決定しました。かなり悪い行動。

44
Chris Moschini

Microsoftのサポートによると、「回避策は、[移行を生成/実行する前に] AnyCPUまたはx86にスワップしてから、スワップバックすることです」。

彼らはまた、「[リファクタリング]モデル/ AnyCPUである別のプロジェクトへの移行」を提案しています。

6
Adam Cox

中心的な問題はx64周辺でした。私のシナリオでは、Azure Mobile ServicesTodoリファレンスソリューションを使用しようとしていました。このソリューションには、サービスソリューションと、2つのフロントエンドクライアント(Windows8およびWindowsPhone)ソリューションがあります。

ソリューションを試す際に、オフラインサポートを追加しました。オフラインサポートはSQLiteを実装し、SQLiteでは、それぞれのネイティブクライアントにx64またはARMを使用するようにソリューションを構成する必要があります。

したがって、SQLiteサポートを解決するためにCPUターゲットを変更するには、サービスでCPU x64を変更し、保存しておく必要があります。サービスにx64を使用する際のエラーを確認したとき、AnyCPUに戻しました。

これはすべてにつながります...次に移行を追加しようとしたときに、この投稿の情報に基づいて、サービスの.csprojファイルが「破損」しました。私の場合、サービスの.csprojファイルで次の変更/更新を行いました。

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>Prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>

私の場合、

<PlatformTarget/> 

まだx64として設定されていました。

2
MadSaw

私のように混乱しないでください:

  1. Active PlatformAnyCPConfigurationManagerから変更します(欠落している場合は追加します)
  2. DbContextを含むプロジェクトのプロパティに移動します
  3. Buildタブで、Platform targetAnyCPに変更します。
  4. パッケージマネージャーコンソールで次のコマンドを実行します。Enable-Migrations -ProjectName ProjectNameThatContainsTheDContext
0
Yitzchak

IISマネージャー>アプリケーションプールの表示>デフォルトのアプリケーションツール>詳細設定...> 32ビットをtrueに設定]に移動します

0
Dixon Gutierrez