Использование библиотек PresentationCore и WindowsBase в среде x64 и x86 - PullRequest
5 голосов
/ 07 декабря 2011

PresentationCore.dll и WindowsBase.dll включены в Microsoft .NET Framework 3.0, и на диск установлены две версии каждой библиотеки DLL:

  • x64-версия в C: \ Program Files\ Справочные сборки \ Microsoft \ Framework \ v3.0
  • Версия x86 в C: \ Program Files (x86) \ Справочные сборки \ Microsoft \ Framework \ v3.0

Додобавив ссылки на эти библиотеки, наше веб-приложение ASP.NET было скомпилировано для «любого процессора» и без проблем работало бы в 32-битном или 64-битном режиме.После добавления ссылки, скажем, к PresentationCore через стандартный диалог «Добавить ссылку» (Добавить ссылку -> .NET -> PresentationCore), веб-приложение завершает работу в 64-битном режиме со следующей ошибкой:

Не удалось загрузить файл или сборку PresentationCore или одну из ее зависимостей.Была предпринята попытка загрузить программу с неверным форматом.

Очевидно, это связано с тем, что 64-битный пул приложений пытается и не может загрузить 32-битную версию библиотеки PresentationCore.

Теперь меня это немного смущает ...

  1. Кажется, что другие библиотеки .NET Framework легко переключаются между своими версиями x64 и x86 (загрузка из Microsoft.NET/Framework64 или Microsoft.NET / Framework соответственно).Почему PresentationCore и WindowsBase отличаются друг от друга?
  2. Почему Visual Studio предлагает только 32-разрядную версию на вкладке «.NET» в диалоговом окне «Добавить ссылку»?Если я хочу 64-битную версию, мне нужно «просмотреть» ее.
  3. Есть ли какой-нибудь простой способ автоматически выбрать правильную dll, как это происходит в других библиотеках .NET Framework?

Мы всегда можем написать немного MSBuild xml, который будет автоматически обмениваться ссылками во время сборки на основе разрядности целевой среды, но это похоже на то, что мы не должны делать для библиотек .NET Framework.Что дает?

Спасибо!

1 Ответ

3 голосов
/ 07 декабря 2011

Можно условно ссылаться на каждый файл .dll, соответствующий вашей активной конфигурации сборки. Вам нужно будет вручную отредактировать файл вашего проекта. Добавьте ссылку на 32-битную DLL. Затем сохраните проект и отредактируйте файл .csproj в текстовом редакторе.

Найдите добавленную вами ссылку и добавьте Condition = "$ (Platform) == 'x86'" в качестве атрибута элемента Reference. Затем сделайте еще одну копию элемента Reference и настройте его для версии x64. Вот пример с драйверами Oracle ODP.NET:

<Reference Include="Oracle.DataAccess, Version=2.111.6.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64" Condition="$(Platform) == 'x64'">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>lib\x64\Oracle.DataAccess.dll</HintPath>
  <Private>True</Private>
</Reference>
<Reference Include="Oracle.DataAccess, Version=2.111.6.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86" Condition="$(Platform) == 'x86'">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>lib\x86\Oracle.DataAccess.dll</HintPath>
  <Private>True</Private>
</Reference>

Важно отметить, что вы больше не сможете использовать конфигурацию AnyCPU. Вам нужно будет иметь явные конфигурации сборки для x86 или x64. .Dll, которую вы пытаетесь использовать, вероятно, выполняет собственные вызовы в библиотеки ОС, поэтому ваш проект больше не может быть независимым от платформы.

Если вы хотите сохранить только одну конфигурацию сборки, вы можете использовать x86 и использовать только версию x86 / 32-bit. Если это веб-приложение, вам нужно перевести пул приложений в 32-разрядный режим.

Отредактировано, чтобы ответить на ваши первоначальные вопросы

  • У вас есть несколько опций платформы, когда вы создаете dll / исполняемый файл: любой процессор, x86, x64 или Itanium. Код, который написан на 100% в управляемом коде и не зависит от собственных библиотек, обычно компилируется и распространяется как AnyCPU. Это связано с тем, что полученный в результате код промежуточного языка (IL), сгенерированный компилятором, может работать в версиях .NET Framework x86, x64 и Itanium. На библиотеки, предназначенные для любого ЦП, можно безопасно ссылаться из приложений, которые зависят от платформы (x86, x64, IA64). Причина, по которой PresentationCore и WindowsBase различаются, заключается в том, что они зависят от собственного кода. В отличие от IL-кода, который интерпретируется во время выполнения, в нативном коде нет концепции Any CPU. Из-за зависимостей собственного кода библиотеки PresentationCore и WindowsBase .NET необходимо было распространять как x86 и x64, поскольку AnyCPU невозможно.
  • В диалоговом окне «Добавить ссылку» должны отображаться только библиотеки, совместимые с целевой платформой. Если вашей целевой платформой является x86, она должна показывать только любые библиотеки CPU и x86.
  • К сожалению, нет. Если вы не можете использовать какой-либо ЦП, но по-прежнему должны поддерживать x86 и x64, вам нужно настроить несколько конфигураций сборки (одну для x86 и одну для x64) и условно ссылаться на 32-битные и 64-битные dll, которые вам нужны. Единственный способ сделать это - отредактировать файл проекта, как описано выше. Вам нужно будет создать обе конфигурации и распространять отдельные 32-битные и 64-битные версии вашего кода. Если кто-то зависит от вашего кода, ему нужно будет прыгать через те же обручи.
...