Как выбрать архитектуру запуска ARM64X‑приложения

ARM64X объединяет код для разных ABI в одном PE‑файле для Windows на Arm. Файл может содержать как классический ARM64, так и ARM64EC‑код; загружающий процесс получает представление о доступных в файле вариантах, и это представление влияет на совместимость с плагинами и библиотеками.

Когда нужно явно выбирать режим запуска

Если приложение загружает плагины или расширения с разными требованиями к ABI, целесообразно задать архитектуру создаваемого процесса заранее. В типичном сценарии одно расширение ожидает ARM64‑процесс, другое — совместимость с x64 через ARM64EC. Без явного указания процесс может быть запущен в режиме, несовместимом с одним из плагинов, что приведёт к ошибкам загрузки.

Для передачи желаемой архитектуры при создании процесса используется атрибут PROC_THREAD_ATTRIBUTE_MACHINE_TYPE. Вызов UpdateProcThreadAttribute принимает указатель на WORD с константой архитектуры; этот атрибут настраивается в структуре STARTUPINFOEX перед CreateProcess и влияет на режим, в котором будет создан дочерний процесс. Атрибут является механизмом подготовки окружения запуска, а не переключателем для уже работающего процесса.

Практические замечания по реализации

  • Проверяйте требования загружаемых модулей заранее: определите, какие ABI они поддерживают, и выбирайте режим запуска, совместимый со всеми критичными компонентами.
  • Не полагайтесь на автоматическое «переключение» процесса: изменение режима требует создания нового процесса с соответствующими атрибутами.
  • Ограничьте количество перезапусков: при ошибках загрузки DLL реализуйте явную политику повторных попыток и отказа, чтобы избежать бесконечных циклов перезапуска между режимами.
  • Учтите ограничения ОС и оборудования: наличие ARM64X‑файла не гарантирует нативного запуска на любой x64‑машине; совместимость зависит от конкретной версии Windows, реализованных ABI и поддержки соответствующих механизмов загрузки.

Вывод

Если приложение использует плагины с разными ABI, задавайте архитектуру при создании процесса через PROC_THREAD_ATTRIBUTE_MACHINE_TYPE в STARTUPINFOEX. Это поможет обеспечить совместимость и контролировать поведение при загрузке модулей, при этом следует реализовать защиту от бесконечных перезапусков и учитывать ограничения конкретной ОС и ABI.