В Visual Studio, как правильно создать приложение для 64-разрядных машин?

Существует также удар встроенная команда 'expr':

INPUT="someletters_12345_moreleters.ext"  
SUBSTRING=`expr match "$INPUT" '.*_\([[:digit:]]*\)_.*' `  
echo $SUBSTRING
5
задан weilin8 27 July 2009 в 21:50
поделиться

6 ответов

Когда программа компилируется на «ЛЮБОМ ЦП», это означает, что она не зависит от архитектуры - она ​​может выполняться как в 64-битном процессе, так и в 32-битном процессе. Это определяется платформой, на которой выполняется программа. Если это 64-битная платформа, программа, встроенная в ЛЮБОЙ ЦП, будет загружаться как 64-битный процесс. С другой стороны, если это 32-битная платформа, программа, встроенная в ЛЮБОЙ ЦП, будет загружаться в 32-битном процессе.

Однако вы не можете собрать все как «ЛЮБОЙ ЦП», потому что у вас могут быть зависимости, требующие ту или иную платформу.

Программа должна быть построена в режиме x64, если она имеет зависимости x64 (полагаясь на другие библиотеки, которые построены в x64). Это также требует, чтобы программа выполнялась на 64-битной платформе

. Программа должна быть построена в режиме x86, если она имеет неуправляемые 32-битные зависимости или если она имеет управляемые библиотеки, встроенные в x86.

Программа программы имеет ни x64-битная зависимость, ни неуправляемые 32-битные зависимости не могут быть построены в «любом процессоре».

Однако, независимо от этих правил, если вы встраиваете ЛЮБОЙ ЦП, вы должны тщательно тестировать как на 64-битной, так и на 32-битной платформе. В этом посте более подробно обсуждаются другие возможные проблемы.

Подробнее о ЛЮБОМ ЦП

6
ответ дан 18 December 2019 в 13:17
поделиться

Разрядность приложения определяется исполняемым файлом, который загружает библиотеки DLL. Пока процесс запуска настроен для целевой x64, тогда библиотеки DLL будут загружаться как x64, если они настроены как x64 или Any CPU. Таким образом, вам не нужно настраивать все библиотеки DLL как x64, только запускающее приложение. Остальные можно оставить как Любой ЦП, если у них нет особых 64-битных зависимостей.

только запускающее приложение. Остальные можно оставить как Любой ЦП, если у них нет особых 64-битных зависимостей.

только запускающее приложение. Остальные можно оставить как Любой ЦП, если у них нет особых 64-битных зависимостей.

3
ответ дан 18 December 2019 в 13:17
поделиться

Для меня все сводится к тому, от чего я зависим. Или, точнее, от чего зависит транзитивное закрытие зависимостей DLL для моего приложения. Если какой-либо из них имеет определенную зависимость от архитектуры (x86 или amd64), я устанавливаю для своего проекта такую ​​же зависимость. Таким образом я гарантирую, что любая проблема с загрузкой на неправильную платформу проявится как можно раньше.

Если нет зависимости от платформы и в моем коде ее нет, я устанавливаю AnyCPU до тех пор, пока не найду какую-либо причину сделать иначе.

2
ответ дан 18 December 2019 в 13:17
поделиться

Если есть одна 64-битная зависимость, вам нужно собрать каждый компонент как 64-битный.

0
ответ дан 18 December 2019 в 13:17
поделиться

Чтобы добавить к другим отличным ответам. Я нашел полезную информацию в MSDN

В 64-битной операционной системе Windows :

  • Сборки, скомпилированные с помощью / platform: x86 будут выполняться в 32-битной среде CLR, работающей под WOW64.
  • Исполняемые файлы скомпилирован с помощью / platform: anycpu будет выполняться в 64-битной среде CLR.
  • DLL, скомпилированные с помощью / platform: anycpu, будут выполняться в той же среде CLR, что и процесс, в который он загружается.

Также обратите внимание, что библиотеки DLL x86 не может быть загружен в 64-битный процесс. Если невозможно получить версию библиотеки DLL x64, альтернативой является запуск библиотеки DLL x86 в 32-битном (WOW64) процессе и выполнение межпроцессного взаимодействия (IPC) обратно с 64-битным процессом. Подробнее .

2
ответ дан 18 December 2019 в 13:17
поделиться

В прошлом году была большая дискуссия об этом на .NET Rocks, здесь , это действительно помогло мне понять все нюансы

1
ответ дан 18 December 2019 в 13:17
поделиться