2013-06-25 2 views
1

У меня есть приложение .NET winforms, которое использует ODP для подключения к oracle db. Установка ODP - 32 бит. Я разрабатываю приложение на Win 7 64 bit machine. Я устанавливаю платформу как x86 на машине разработки, и она работает нормально. Но когда я тестировал приложение на Win Server 2003 64 bit machine он дал исключениеODP.NET 32 бит на Win 7 64 бит и Win Server 2003 64 бит

The type initializer for 'Oracle.DataAccess.Client.OracleCommand' threw an exception.            

UNHANDLED EXCEPTION STACK TRACE:at Oracle.DataAccess.Client.OracleCommand.Dispose(Boolean disposing) 
at System.ComponentModel.Component.Finalize() 

UNHANDLED EXCEPTION SOURCE: Oracle.DataAccess 

UNHANDLED EXCEPTION INNER EXCEPTION: Oracle.DataAccess.Client.OracleException The provider is not compatible with the version of Oracle client at Oracle.DataAccess.Client.OracleInit.Initialize() 
at Oracle.DataAccess.Client.OracleCommand..cctor() 

UNHANDLED EXCEPTION DATA: System.Collections.ListDictionaryInternal 

UNHANDLED EXCEPTION MESSAGE: The type initializer for 'Oracle.DataAccess.Client.OracleCommand' threw an exception. 

И когда я установил целевой платформы для Any CPU на Windows 7 64 бит, что дает исключение:

Could not load file or assembly 'Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. An attempt was made to load a program with an incorrect format. 

версии ODP на развитие машина (Win 7 64 бит) равна 11.2.0 и на тестовой машине (Win Server 2003 64 бит) также является 11.2.0

Что мне делать для запуска приложения на обеих машинах? Есть идеи?

+0

Существует 'ORACLE_BASE \ ORACLE_HOME \ odp.net \ bin \ 2.x', но в моей установке ODP нет' ORACLE_BASE \ ORACLE_HOME \ odp.net \ bin \ 4'. – gesus

ответ

0

IMO Есть несколько вариантов:

  1. Compile для x86 и установить 32 битную Oracle Client на вашем 64-битном сервере (может работать бок о бок, если вы измените ORACLE_HOME, TNS_ADMIN, ... системные переменные);
  2. Компиляция для x86 и упаковка всех DLL для 32-разрядного Oracle Instant Client вместе с вашими двоичными файлами (убедитесь, что системная переменная TNS_ADMIN установлена, иначе вы не сможете использовать LDAP или tnsnames);
  3. Скомпилируйте приложение для любого процессора, но создайте другой набор dll для x64 и x86 бит (Oracle.DataAcess.dll скомпилирован для конкретной архитектуры, есть версия для x64 и одна для x86);
  4. Oracle работает с a managed Oracle driver, больше не требуется клиент Oracle, большинство кодов легко конвертируются, но имейте в виду, что он еще не полностью завершен и поддерживает только базы данных Oracle 11+.
+0

По большей части согласен. # 1 НЕ требует изменений в oracle_home или tns_admin - более новые версии провайдера сначала используют реестр для поиска неуправляемых библиотек DLL. Второе - # 3 - достаточно просто установить 64-разрядную версию на dev-машине. Оттуда вы НЕ скопировали Oracle.DataAccess.dll с машины на машину и вместо этого полагались бы на то, что зарегистрировано в GAC. –