Имеет ли значение настройка платформы при компиляции приложения С#? - программирование
Подтвердить что ты не робот

Имеет ли значение настройка платформы при компиляции приложения С#?

В VS2012 (и предыдущих версиях...) вы можете указать целевую платформу при создании проекта. Мое понимание, однако, в том, что С# получает "скомпилированный" для CIL и затем JIT компилируется при запуске в главной системе.

Означает ли это, что единственными причинами для указания целевой платформы являются намеренное ограничение пользователей на запуск программного обеспечения на определенных архитектурах или принудительное выполнение приложения на 32-разрядной машине на 64-битной машине? Я не вижу, что это будет связано с оптимизацией, так как я предполагаю, что это происходит на стадии CIL → Native, которая происходит по принципу "Just-In-Time" в архитектуре хоста?

Эта MS Link, похоже, не предлагает никаких альтернативных объяснений, и я не могу найти никакого предположения о том, что вы должны, например, освободить отдельные 32/64-разрядные версии одного и того же приложения - казалось бы логичным, что компиляция для "anycpu" должна работать так же хорошо, и, опять же, оптимизация будет применяться на этапе JIT.

4b9b3361

Ответ 1

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

Да, и это важно, если вы используете собственный код, смешанный с вашим управляемым кодом. Однако он не изменяет то, что оптимизируется во время выполнения.

Если ваш код управляется на 100%, то AnyCPU (или новый AnyCPU Prefer 32-Bit), скорее всего, прекрасен. Оптимизация компилятора будет одинаковой, и JIT будет оптимизироваться во время выполнения на основе текущей исполняющей платформы.

Я не могу найти никакого предположения о том, что вы должны, например, выпускать отдельные 32/64-битные версии одного и того же приложения

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

Ответ 2

У Рида есть хороший ответ. Однако, я думаю, также важно отметить, что этот параметр является всего лишь флагом в DLL - он почти не имеет никакого эффекта в большинстве ситуаций. Это загрузчик времени выполнения (бит встроенного кода, который запускает выполнение среды выполнения .NET), чтобы посмотреть на этот флаг и направить запущенную версию исполняемой среды .NET.

Из-за этого - флаг будет иметь значение только в том случае, если он установлен в EXE файле, и не имеет эффекта при установке в DLL. Например, если у вас есть библиотека DLL с 32-битным флагом, которая используется либо .NET EXE с 64-битным флагом, либо .NET EXE с флагом с любым значением, и вы запускаете EXE на 64-разрядная машина - тогда загрузчик запустит 64-битную среду выполнения. Когда пришло время загрузить 32-битную DLL, слишком поздно - 64-битная среда исполнения уже выбрана, поэтому ваша программа завершится неудачно (я верю, что вы получите BadImageFormatException).