System.Data.SQLite BadImageFormatException с NHibernate, работает в автономном режиме - PullRequest
2 голосов
/ 28 августа 2011

Я пытался использовать NHibernate с SQLite, версия = 1.0.74.0 для .NET 4 и 32 бит.Я использую 64-битную WIN7, но собираю приложение в режиме x86 (по умолчанию в VS2010 express).

Когда я использую тот же SQLite, что и отдельное приложение, оно работает нормально, но когда я пытаюсь использовать его с NHibernate, оноthrows BadImageFormatExcepion

Я отладил немного NHibernate, и исключение выдается в следующем выражении

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

Есть ли шансы, что кто-нибудь знает решение?Это потому, что я использую режим по умолчанию в VS Express?Нужно ли указывать платформу другим методом?Попробовать загрузить какой-нибудь другой dll для sqlite?

Я проверил некоторые другие ответы на 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>

1 Ответ

2 голосов
/ 28 августа 2011

Если VS express не позволяет вам выбрать платформу, вы можете попробовать настроить ее вручную в файле .csproj

<PlatformTarget>x86</PlatformTarget>

После создания приложения убедитесь, что:

  • оно выполняется как 32- или 64-разрядное приложение в зависимости от того, что вы положили в PlatformTarget (с помощью диспетчера задач Windows или Process Explorer)
  • правильная версия SQLite.Interop.dll копируется в папку, в которой находится ваш exe (эта dll зависит от платформы, поэтому вам необходимо скопировать версию, соответствующую платформе EXE)
  • Соответствующая версия Распространяемый пакет Visual C ++ 2010 SP1 установлен

Также попробуйте удалить useLegacyV2RuntimeActivationPolicy из конфигурации.

С BadImageFormatException Документ:

... DLL или исполняемый файл загружается как 64-разрядная сборка, но содержит 32-битные функции или ресурсы. Например, это зависит от взаимодействия COM или вызывает методы в 32-битной динамической библиотеке ссылок. ... Чтобы устранить это исключение, установите для целевого свойства Platform проекта значение x86 (вместо x64 или AnyCPU) и перекомпилируйте.

...