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
,
Если это неприемлемо для вас, вы можете попытаться определить версию процесса и динамически загрузить правильную сборку в соответствии с ответом на переполнение стека.