Использование Oracle.DataAccess.DLL уже на ПК, не предоставляя его - PullRequest
3 голосов
/ 20 декабря 2010

Я хочу сделать мою программу более динамичной.Я хотел бы, чтобы он мог поддерживать базу данных Oracle 10g и Oracle 11g с помощью одной и той же программы.Если я собираю программу, используя ссылку .DLL для одной версии, то для другой произойдет сбой.Есть ли способ использовать Oracle.DataAccess.DLL, который уже установлен на компьютере, вместо предоставления библиотеки DLL в моей программе установки?

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 20 декабря 2010

SpecificVersion - это атрибут, который применяется только во время сборки. Он был разработан, чтобы помочь, если в среде сборки существует несколько версий сборки; когда SpecificVersion имеет значение true, он гарантирует, что вы соберете нужную версию и получите ссылку на нее. Однако после сборки целевой сборки ее ссылки содержат строгое имя и номер версии указанной сборки. Поэтому, если SpecificVersion имеет значение false, он будет установлен для ссылки на любую доступную версию ссылки в среде сборки на тот момент.

«Обратите внимание, что свойство« Конкретная версия »является только директивой времени сборки и не влияет на разрешение версии во время выполнения указанной сборки» (http://www.code -magazine.com / article.aspx? Quickid = 0507041 & page = 3).

Однако вы можете использовать перенаправление версий, чтобы явно указать, что вы принимаете любую версию. Поле oldVersion указывает на что угодно (версия, на которой вы построили), а атрибут newVersion будет указывать, с какой из них вы хотите связать, во время выполнения.

  <dependentAssembly>
    <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
    <bindingRedirect oldVersion="1.0.0.0-2.111.9999.9999" newVersion="2.102.2.20"/>
  </dependentAssembly>

(см. http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx.)

Этот узел зависимого узла может быть применен к различным контекстам. Один возможный контекст может быть в файле web.config или app.config как дочерний узел узла конфигурации / времени выполнения / assemblyBinding.

Чтобы ответить на ваш конкретный сценарий поддержки Oracle 10g и 11g? Есть два варианта, первый из которых был предложен пользователем @BQ:

  1. Развертывание только одной версии ODP.NET. Вы должны иметь возможность общаться с обеими версиями сервера базы данных (10g и 11g) из любой версии ODP.NET (10g или 11g). Смотрите ответ @ BQ ниже.
  2. Если вам действительно нужно связать две разные версии сборки, вам понадобятся две разные конфигурации перенаправления версий. Другими словами, вам понадобятся два файла app.config, один из которых содержит перенаправление версии на версию 10g ODP.NET, а другой - на версию 11g ODP.NET.

Еще несколько советов:

  1. Убедитесь, что вы удалили все предоставленные Oracle политики издателя из GAC. Они имеют приоритет над файлами в web / app.config
  2. По умолчанию ошибки привязки кэшируются, поэтому если сборке ODP.NET не удалось выполнить привязку с перенаправлением версии, вам потребуется перезапустить IIS для очистки кэшированных ошибок.
2 голосов
/ 20 декабря 2010

Если вы выберете ссылку в Visual Studio и перейдете в окно «Свойства» (по умолчанию F4), вы увидите опцию с надписью «Конкретная версия».Если для этого параметра задано значение false, проект будет принимать разные версии DLL.

Теперь это не обязательно означает, что проект найдет версию DLL.Если он не находится рядом с .exe (то есть в папке или подпапке) или в GAC, вам придется самостоятельно поработать, чтобы загрузить его.

1 голос
/ 20 декабря 2010

См. Отличный ответ @MattRodatus об использовании перенаправления привязки, если вам нужно, чтобы ваше приложение поддерживало несколько версий Oracle.DataAccess, которые могут быть на компьютере, на котором вы развертываете.

Однако выдолжен иметь доступ к базе данных 10g или 11g с любой версией установки клиента Oracle.

См. ответ @ the.jxc по адресу Oracle: работает ли клиент Oracle 10g с сервером 11g? для краткого изложения, какие клиенты поддерживают какие базы данных.

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