Предназначаясь x86 по сравнению с AnyCPU при создании для окна OSes на 64 бита

У меня есть существующее приложение C#, записанное для.NET 2.0 и предназначение AnyCPU в данный момент. Это в настоящее время ссылается на некоторое третье лицо.NET DLLs, который у меня нет источника для (и я не уверен, были ли они созданы для x86, x64 или AnyCPU).

Если я хочу запустить свое приложение конкретно в Windows OS на 64 бита, какую платформу я должен быть нацелен для своего приложения запускать без ошибок? Мое понимание в данный момент состоит в том, чтобы предназначаться:

  • x86: Если по крайней мере одно третье лицо.NET dll создается для x86 или использования p/Invoke для взаимодействия через интерфейс с Win32 DLLs. Приложение будет работать в режиме на 32 бита и на Ose на 64 бита и на на 32 бита.
  • x64: Если все третье лицо.NET dlls уже создается для x64 или AnyCPU. Приложение будет только работать в Ose на 64 бита.
  • AnyCPU: Если все третье лицо.NET dlls уже создается для AnyCPU. Приложение будет работать в режиме на 32 бита на Ose на 32 бита, и 64 обдумал Ose на 64 бита.

Кроме того, я исправляюсь, чтобы полагать, что при предназначении для AnyCPU не генерирует ошибок при создавании приложения, ссылающегося на третье лицо x86.NET DLLs, приложение выдаст исключение на этапе выполнения, когда это попытается загрузить эти DLLs, когда это работает на ОС на 64 бита.

Следовательно, целое одно из моего третьего лица DLLs делает p/Invoke или является x86, я могу только быть нацелен на x86 для этого приложения?

10
задан Cœur 5 August 2017 в 20:59
поделиться

2 ответа

Вы можете сделать P / Invoke из AnyCPU DLL, вам просто нужно быть немного более осторожным с определениями P / Invoke (т.е. чтобы вы случайно не приняли 32-битное или что-то в этом роде). Проблема в том, что довольно сложно понять, правильно ли работает сторонняя DLL без Reflector и дизассемблирования (если, конечно, разработчик специально не заявляет о поддержке 64-битной версии).

Но в остальном вы в значительной степени на высоте.

Если честно, для 99% приложений ориентация на x86 вполне приемлема. Это относительно небольшое количество приложений, которым действительно выгодно быть 64-битными. (Проблемы с производительностью обычно проявляются в виде некоторой промывки: большее количество регистров смещается из-за переименования регистров в режиме x86 и более крупных структур данных, потому что указатели в два раза больше [а в системе с большим количеством ссылок, такой как .NET, это еще хуже])

7
ответ дан 29 October 2019 в 02:11
поделиться

Мне было интересно узнать об этой конкретной части вашего вопроса.

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

Итак, я попробовал. Я создал проект DLL ClassLibrary1 , ориентированный на x86, затем добавил ConsoleApplication1 , ориентированный на AnyCPU, и сослался на другой проект. Я убедился, что действительно использовал класс из проекта ClassLibrary1 в методе Main.

Visual Studio не выдавала мне никаких предупреждений или жалоб по поводу ссылки на приложение или его сборки. Когда я запустил приложение (в 64-битной ОС) и была загружена сборка ClassLibrary1, меня встретило исключение BadImageFormatException.

Если я изменил ConsoleApplication1 на целевой x64, я получаю предупреждения компилятора, но компиляция завершается успешно, и то же исключение возникает во время выполнения.

Итак, отвечая на ваш вопрос, да, вы вполне можете столкнуться с проблемами, если ваши сборки, на которые есть ссылки (или любые сборки, загруженные во время выполнения, если на то пошло), также не скомпилированы для AnyCPU. Если вы не уверены и вам не нужно дополнительное адресное пространство, я бы остановился на x86. Если вы уверены, что ваши зависимости скомпилированы для AnyCPU, вы можете настроить таргетинг на AnyCPU, если хотите, но обязательно проведите много тестов на обеих архитектурах процессора.

7
ответ дан 29 October 2019 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: