Развертывание консольного приложения C # со ссылкой на Oracle.DataAccess - PullRequest
0 голосов
/ 21 октября 2011

Я пытался развернуть консольное приложение ac #, которое я сделал на сервере.Я в основном копировал содержимое папки Release на сервер, и все, кажется, работает гладко, за исключением Oracle.На моей машине для разработки (32-битная XP) у меня OracleClient 11.2, а на сервере (64-битный сервер 2008) 11.1.Приложение работает, если я запускаю его на локальном компьютере.

Когда я выполняю развертывание, просто копируя папку Release и пытаясь запустить приложение, я получаю следующую ошибку:

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Oracle.DataAccess, Version=2.111.7.0, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. The system cannot find the file specified.
File name: 'Oracle.DataAccess, Version=2.111.7.0, Culture=neutral, PublicKeyToken=89b483f429c47342'
   at PDV.AODGateway.StoredProcedures..ctor()
   at PDV.AODGateway.AODGateway.Export()
   at PDV.AODGateway.AODGateway.Main(String[] args)

(не читайте слишком много в поисках версии 111.7. Это говорит о том, что я попытался указать в app.config поиск этой версии. Ранее сообщалось, что не удалось найти 112.1)

Разделкод, в котором происходит сбой, - это место, где я создаю объект OracleConnection.

Если я пытаюсь скопировать dll в папку развертывания с сервера, я получаю похожую ошибку:

Unhandled Exception: System.TypeInitializationException: The type initializer for 'PDV.AODGateway.StoredProcedures' threw an exception. ---> System.BadImageFormatException: Could not load file or assembly 'Oracle.DataAccess, Version=2.111.7.0, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. An attempt was made to load a program with an incorrect format.
File name: 'Oracle.DataAccess, Version=2.111.7.0, Culture=neutral, PublicKeyToken=89b483f429c47342'
   at PDV.AODGateway.StoredProcedures..cctor()

Iв конечном итоге решили проблему, скопировав эти файлы из папки oracleclient на моем компьютере разработчика (то есть на компьютере, который я использовал для построения решения) в каталог приложения на сервере:

Oracle.DataAccess.dll
oci.dll
OraOps11w.dll
oraociei11.dll

Однако этоКажется, это очень плохая практика, так есть ли у кого-нибудь из вас предложения о том, как мне это сделать?Кто-нибудь из вас сталкивался с этой проблемой раньше?

1 Ответ

7 голосов
/ 21 октября 2011

Ранее я сталкивался с подобными проблемами с компонентами доступа к данным Oracle. Я предполагаю, что вы создали свой .exe с помощью цели платформы AnyCPU в конфигурации сборки вашего консольного приложения. Это означает, что при запуске на 32-разрядной машине разработки он будет загружен в 32-разрядный процесс, тогда как на 64-разрядном сервере он будет загружен в 64-разрядный процесс. Проблема в том, что компонент Oracle.DataAccess.dll поставляется в двух разных вариантах: 32-разрядной и 64-разрядной версии. Когда вы копировали 32-разрядную версию в каталог bin развертывания со своего компьютера разработчика, во время выполнения приложение будет пытаться загрузить сборку, явно помеченную как 32-разрядную, в 64-разрядный процесс, который не работает и объясняет, почему вы получаете System.BadImageFormatException.

Так что, возможно, лучшим решением было бы явно указать 64-битную платформу в настройках проекта вашего консольного приложения для конфигурации выпуска и ссылаться на 64-битную версию Oracle.DataAccess.dll. На сервере вам нужно либо установить 64-разрядный Oracle.DataAccess.dll в GAC (как это могло быть при установке ODAC), либо вам необходимо развернуть 64-разрядную сборку вместе с приложением.

Мне показалось, что это неприятно, когда нужно нацелиться на обе платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...