2

.NET 4および32ビットのバージョン= 1.0.74.0のSQLiteでNHibernateを使用しようとしました。私は 64 ビットの WIN7 を使用していますが、アプリケーションを x86 モード (VS2010 Express のデフォルト) でビルドしています。

同じ SQLite をスタンドアロン アプリケーションとして使用すると正常に動作しますが、NHibernate で使用しようとするとスローされますBadImageFormatExcepion

少しNHibernateをデバッグしたところ、次のステートメントで例外がスローされました

System.Type.GetType("System.Data.SQLite.SQLiteConnection, System.Data.SQLite");

誰かが解決策を知っている可能性はありますか? VS Express でデフォルト モードを使用しているからですか? 他の方法を使用してプラットフォームを指定する必要がありますか? sqlite 用の他の dll をダウンロードしてみますか?

SOに関する他の回答をいくつか確認しましたが、app.configにこれを追加するのが最善でした:

  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite"/>
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite"/>
    </DbProviderFactories>
  </system.data>



 <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
4

1 に答える 1

2

VS Express でプラットフォームを選択できない場合は、.csproj ファイルで手動で設定してみてください。

<PlatformTarget>x86</PlatformTarget>

アプリをビルドしたら、次のことを確認してください。

  • PlatformTarget に入力した内容に応じて、32 ビットまたは 64 ビット アプリとして実行されます (Windows タスク マネージャーまたはプロセス エクスプローラーを使用)。
  • 適切なバージョンのSQLite.Interop.dllが、exe があるフォルダーにコピーされます (この dll はプラットフォームに依存するため、EXE プラットフォームに対応するバージョンをコピーする必要があります)。
  • 対応するバージョンのVisual C++ 2010 SP1 Redistributable Packageがインストールされている

また、設定から削除してみてくださいuseLegacyV2RuntimeActivationPolicy

BadImageFormatExceptionドキュメントから:

... DLL または実行可能ファイルが 64 ビット アセンブリとして読み込まれますが、32 ビットの機能またはリソースが含まれています。たとえば、COM 相互運用機能に依存したり、32 ビット ダイナミック リンク ライブラリのメソッドを呼び出したりします。... この例外に対処するには、プロジェクトのプラットフォーム ターゲット プロパティを (x64 または AnyCPU ではなく) x86 に設定し、再コンパイルします。

于 2011-08-28T05:50:30.340 に答える