Я создал проект С# на своем компьютере, который использует ODP.net, я импортировал ссылку Oracle.DataAccess. На моем ПК я пытаюсь установить соединение с базой данных, и он работает нормально, однако, если я скопирую файл.exe моего приложения на другом компьютере, он не работает, и я получаю следующую ошибку:
System.IO.FileNotFoundException: Не удалось загрузить файл или сборку "Oracle.DataAccess, Version = 4.112.3.0, Culture = neutral, PublicKeyToken = 89b483f429c47342" или одна из его зависимостей. Система не может найти указанный файл. Имя файла: 'Oracle.DataAccess, Version = 4.112.3.0, Culture = neutral, PublicKeyToken = 89b483f429c47342'
Почему С# не инкапсулирует все файлы, необходимые в.exe? Что я могу сделать, чтобы эта программа работала независимо от исполняемого компьютера?
По просьбе Вито, вот мой комментарий в качестве ответа:
Я предлагаю не использовать "классическую" ODP.NET, которая имеет зависимости от дополнительных установленных компонентов ODP в системе, но вместо этого использует исключительно управляемую версию ODP.NET.
Для управляемого ODP.NET у вас есть одна сборка (то есть DLL), которую вы можете отправить с вашим приложением (например, в папку "bin", если это приложение ASP.NET), и все готово.
Чтобы завершить его, строка подключения в моих случаях выглядит примерно так:
<add
name="ora"
connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyServer)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE))); User Id=MyUser; Password=MyPassword"
providerName="system.data.oracleclient" />
Управляемая версия была действительно большим улучшением с точки зрения простоты использования в моих проектах.
вы должны установить версию базы данных Oracle на каждой машине, на которой вы собираетесь установить приложение.
Другой вариант - перейти в Oracle и загрузить только драйверы. Загрузите из Oracle, затем вам нужно включить их в свой проект, обратитесь к этой DLL.
См. Ответ на аналогичный вопрос, который у меня был. В основном эта проблема oracle.dataaccess.dll
, она создает платформу (32 или 64) и наличие некоторых ее зависимостей (например, OraOps11w.dll
). Эти вещи нужно проверить, чтобы убедиться, что они присутствуют и правильно настроены. Это станет большим в развертывании! Конечно, если вы вызываете библиотеку на уровне машины (не на уровне приложения) из разных приложений, вы должны проверить, зарегистрирована ли она в GAC.
Изменение: в нем простейшая форма:
1 - Вы должны иметь эти DLL в каталоге приложения: OraOps11w.dll
, oci.dll
, orannzsbb11.dll
и oraociei11.dll
.
2 - Вы должны добавить ссылку на Oracle.DataAccess.dll
.
Где можно их получить?
1 - Из установочного каталога Oracle Client (а не сервера), если вы уже установили клиент oracle (включая ODP.NET).
2 - Если вы установили ODT.NET.
3 - Получив ODP.NET (желательно zip-архив, а не установочный пакет).
Здесь есть ТОНЫ возможных причин. Сначала я начал бы копирование всей папки, чем содержащий.EXE файл, а не только сам файл.EXE. В этой папке есть вещи, которые нужны вашему.EXE для запуска. Кроме того, я бы проверял зависимости от компьютера, который не работает с программой Dependency Walker. Все может пойти не так, если вы разрабатываете 32-битную версию и пытаетесь запустить ее на 64-битной основе. Все может пойти не так, если вы работаете в Windows и пытаетесь запустить MAC. Существует много изменений, которые могут измениться с одного компьютера на другой, и ваш код должен быть готов к этому. Зависимость ходок может сказать вам, если вы неправильно подключаетесь к определенным зависимостям (в основном.DLL). Если вы заходите в папку выпуска, содержащую ваш EXE, если в этом же каталоге есть файлы.DLL, эти.DLL, вероятно, необходимы на любом компьютере, который попытается запустить эту программу.
bin
, в GAC ... Может быть, создать установщик :)