Ответ 1
Ссылка на биты Access Interop
не имеет ничего общего с вашим исключением, и Access Interop не требуется использовать классы в System.Data.OleDb
.
Проблема возникает, когда у вас есть приложение, скомпилированное для AnyCPU Platform
, вы работаете на 64-битной системе, а установленный поставщик ADO.NET(Microsoft ACE.OLEDB.12.0) - это 32-разрядная версия.
При использовании целевой платформы AnyCpu
ваш код будет выполнен как 64-битный код на 64-битных системах и 32-битный код на 32-битных системах. Приложение, выполненное как 64-битное, не может использовать 32-битные драйверы (и наоборот). Теперь добавьте в смесь тот факт, что Microsoft.ACE.OLEDB.12.0 имеет две разные версии. Один для 64-битного и один для 32-битного, и они не могут быть установлены вместе на одном компьютере.
Простейшим обходным решением является изменение целевой платформы вашего приложения через меню Visual Studio
BUILD -> Configuration Manager -> Active Solution Platform -> x86
Если параметр x86
еще не существует, выберите NEW, назовите его x86
, Copy Settings from AnyCPU
и проверьте Create new project platforms
Если вы считаете, что использование 32-битного приложения в 64-битной операционной системе - это потеря производительности или чего-то, чего следует избегать, тогда подумайте дважды и прочитайте эта ссылка где критически рассматриваются PRO и CONS AnyCpu. Если у вас нет конкретной причины использовать AnyCpu
, лучше остановиться с x86
.
Конечно, еще один вариант - удалить 32-битную версию и установить 64-битную версию ACE здесь, а затем запустить приложение как AnyCpu on 64-битные системы. Но это может быть кошмаром для ваших сценариев развертывания. Что делать, если версия 32-разрядного Microsoft Office установлена на вашей целевой машине x64? Office устанавливает свою бит-совместимую версию ACE и, как сказано, невозможно установить 32-битную и 64-битную ACE на одном компьютере.
Теперь вы также должны попросить своего клиента переустановить Office на 64 бит, чтобы ваше приложение с 64-битным интерфейсом было счастливым.
UPDATE
Ситуация немного изменилась с новейшими версиями Visual Studio. Теперь есть новый вариант, который является стандартом для новых проектов. Он называется AnyCPU Предпочитайте 32-битный режим. Подробнее об этой ссылке: Что AnyCPU действительно имеет значение с .NET 4.5 и Visual Studio 11, и еще один интересный пост (хотя и для Sql Server Compact) этот Проблема с любым процессором - Предпочитаете 32-разрядный-BadImageFormatException