AnyCPu против ODP.NET

Мой конфиг: Vs2015 / X64 PC / ODP.NET X86

Я написал несколько библиотек DLL в режиме "Any Cpu" и хотел бы написать программы, которые используют эти библиотеки DLL и могут работать на машинах X64 и X86.

Но я ссылался на "Oracle.DataAccess.dll" в моей Dlls, тогда у меня есть предупреждение "ProcessorArchitecture = X86" на Oracle DLL.

Как я могу это сделать (я могу установить ODP.NET X64 при необходимости)?

Thks

3 ответа

Решение

Когда вы компилируете свою DLL с "x86", то также Oracle.DataAccess.dll должна быть версия x86 (т.е. 32-битная версия)

Когда вы компилируете свою DLL с "x64", то также Oracle.DataAccess.dll должна быть версия x64 (то есть 64-битная версия)

Для "AnyCPU" это зависит от того, не существует "AnyCPU" версии Oracle.DataAccess.dll, Если ваше приложение работает в 64-битной Windows, оно будет работать как процесс x64 - таким образом, также Oracle.DataAccess.dll должна быть версия x64. Если ваше приложение работает на 32-битной Windows, оно будет работать как процесс x86 - таким образом, также Oracle.DataAccess.dll должна быть версия x86.

Короче говоря, архитектура Oracle.DataAccess.dll должно быть таким же, как приложение, т.е. ваша DLL.

Следуйте этой инструкции, чтобы запустить оба параллельно: BadImageFormatException. Это произойдет при работе в 64-битном режиме с установленными 32-битными клиентскими компонентами Oracle.

Обновить

В вашем *.csproj соответственно *.vbproj отредактируйте вашу ссылку на ODP.NET следующим образом:

<Reference Include="Oracle.DataAccess">
  <SpecificVersion>False</SpecificVersion>
  <Private>False</Private>
</Reference>

Атрибуты как Version=... или же processorArchitecture=... не требуются. Ваша заявка будет загружена правильно Oracle.DataAccess.dll в зависимости от выбранной архитектуры и целевой платформы.NET (при условии, что она установлена ​​правильно)

Все вышеупомянутые решения являются правильными, но я просто чувствую необходимость упомянуть Oracle.ManagedDataAcces, так как ему все равно, что такое битность.

Самое простое решение - нацелить на x86 - 64-разрядная операционная система может по-прежнему загружать и запускать 32-разрядные приложения, и это означает, что ваше приложение может работать как на компьютерах с архитектурой x86, так и с архитектурой x64.

Недостатком является то, что ваше приложение должно работать как 32-битные процессы, т.е. ваш процесс будет иметь максимальное адресное пространство 4 ГБ и не сможет загружать 64-битные сборки. Если вы попытаетесь загрузить dll в 64-битном процессе (например, потому что IIS не был настроен на использование 32-битного пула приложений), вы получите BadImageFormatException,

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

Другие вопросы по тегам