Запустятся ли бизнес-приложения на Windows on Arm — эмуляция x64 (Prism) и реальность нативных DLL и COM

· Обновлено: · · Windows on Arm, Arm64, эмуляция x64, нативная интеграция, P/Invoke, COM, драйверы, C#, .NET, разработка Windows, техническая консультация

История изменений (1 обновлений, последнее 30 Aug 2026)

Журнал изменений этой статьи. Там, где версия до правки была заархивирована, она остаётся доступной для чтения по постоянной ссылке с DOI.

Русский текст переписан как полноценный технический перевод, а не калька с японского. Утверждения статьи не менялись.
Первая публикация
Цитирование статьи(DOI (зарегистрированный архив): 10.5281/zenodo.21620048)

Приведённые ниже DOI относятся к ранее зарегистрированным архивным версиям, которые могут отличаться от текущего текста. Для ссылки на текущий текст используйте URL этой страницы.

Го Комура (2026). Запустятся ли бизнес-приложения на Windows on Arm — эмуляция x64 (Prism) и реальность нативных DLL и COM. KomuraSoft LLC. https://comcomponent.com/ru/blog/windows-on-arm-business-apps/

DOI (зарегистрированный архив)
10.5281/zenodo.21620048
DOI (последняя зарегистрированная версия)
10.5281/zenodo.21620049

«Со следующего месяца ставим новые ПК — вроде Copilot+ PC. Наша бизнес-система на них запустится?» По мере того как компании начинают закупать ПК на Snapdragon, этот вопрос всё чаще слышат разработчики и ИТ-службы. В описании продукта написано: существующие приложения работают через эмуляцию. Но своё бизнес-приложение за экраном на C# вызывает через P/Invoke нативную DLL вендора, отчёты идут через COM-компонент, плюс ещё драйвер специализированного оборудования. Честно говоря, на «запустится?» с ходу не ответишь.

Короткий ответ: само приложение обычно запускается. Риск — в том, что вокруг него. Эмуляция Windows 11 довольно точно обрабатывает пользовательский код x86/x64. Но есть чёткая зона, которую эмуляция не покрывает: драйверы, расширения оболочки, смешение архитектур внутри процесса. И именно в этой зоне бизнес-приложения привыкли жить.

В статье разбираем, как устроена эмуляция Windows on Arm и где у неё пределы, правило «x64 и Arm64 нельзя смешивать в одном процессе», характерную для .NET проблему сочетания AnyCPU и P/Invoke, и практический порядок проверки «запустится ли наше приложение на Arm-машине» — в пределах того, что можно сверить по Microsoft Learn.

1. Сначала вывод

Если нужно сразу, достаточно этих трёх пунктов.

  1. Само приложение обычно запускается. Windows 11 on Arm выполняет приложения x86/x64 встроенной в ОС эмуляцией, а с 24H2 производительность ещё улучшил Prism.1
  2. Риск — в окружении. Драйверы режима ядра; DLL, которые загружаются в чужой процесс, как расширения оболочки и IME; несовпадение архитектуры нативных DLL и COM. Запустится ли система, решает не само приложение, а это.234
  3. Проверки достаточно в три этапа. Инвентаризация зависимостей → проверка на Arm-машине в сборке x64 → при необходимости перевод на нативный Arm64. Порядок — в главе 6.

Термины Arm64EC и Arm64X разберём в главе 4; запоминать их сейчас не обязательно. Ниже — расшифровка этих трёх пунктов и источники. К деталям можно вернуться, когда они понадобятся.

  • Чисто управляемое (.NET) приложение или обычное десктопное приложение x86/x64 почти наверняка запустится благодаря эмуляции Windows 11 on Arm. Эмуляция встроена в ОС: менять приложение и ставить дополнительные компоненты не нужно.1
  • Эмуляция обрабатывает только код пользовательского режима. Драйверы режима ядра не эмулируются и требуют нативного Arm64. Драйверы UMDF и драйверы принтеров тоже должны совпадать с архитектурой ОС.23
  • Расширения оболочки, IME, средства специальных возможностей — любые DLL, которые загружаются в чужой процесс (Explorer и т. п.), — тоже нужно пересобрать под тот же Arm64, что и система. Эмуляция здесь не поможет.4
  • В одном процессе x64 и Arm64 сосуществовать не могут. Процесс x64/Arm64EC загружает только двоичные файлы x64 и Arm64EC, процесс Arm64 — только Arm64. Из x64-exe нельзя вызвать Arm64-DLL, и наоборот тоже нельзя.5
  • Обойти это ограничение в пределах одного файла помогают Arm64EC (нативный код Arm64, который может жить в одном процессе с x64) и Arm64X (двоичный файл, в котором код Arm64 и Arm64EC совмещены в одном PE и который загружается в процесс любого из этих типов). Именно Arm64X нужен, когда внутрипроцессный COM-сервер или плагин вызывают с обеих архитектур.56
  • .NET официально поддерживает Windows Arm64 начиная с .NET 6 (в актуальных .NET 8/9/10 Arm64-редакции Windows 11/10 прямо указаны в списке поддерживаемых ОС), и нативную публикацию можно сделать с RID win-arm64. Если AnyCPU-приложение запускают на Arm64-рантайме .NET, процесс идёт как Arm64, поэтому P/Invoke к нативной DLL, которая есть только под x64, при загрузке завершится ошибкой — это сочетание стоит держать в уме отдельно.785
  • Тестовую среду, помимо железа (Copilot+ PC и т. п.), можно развернуть на Arm64-VM с Windows 11 в Azure или через ISO Windows 11 Arm64, который подходит для Hyper-V на Arm-машине и для Mac на Apple Silicon. На Hyper-V на x64-машине Arm64-VM создать нельзя.910

На схеме сплошная линия обозначает отношение, которое выполняется всегда, а пунктирная — условное отношение (условия указаны в пояснении к каждому отношению на странице сведений). Полный список отношений (всего 20, с доказательствами и степенью уверенности) и определения основных понятий собраны на странице сведений карты знаний (на японском). Данные: JSON-LD / Turtle

2. Что такое Windows on Arm — ПК на Snapdragon и Prism

Windows on Arm — это Windows, которая работает на процессоре Arm64. С 2024 года большинство «Copilot+ PC» — новой категории ПК на Windows 11 с NPU, способным выполнять более 40 триллионов операций в секунду (40+ TOPS), — используют Arm-чипы серии Snapdragon X, и разработчикам уже нельзя это игнорировать.1112

Совместимость с существующими приложениями обеспечивает эмуляция, встроенная в ОС. Кратко, как она устроена.1

  • Эмулятор выполняет JIT-компиляцию блоков инструкций x86/x64 в инструкции Arm64 и кэширует результат преобразования по модулям, чтобы следующие запуски были быстрее.
  • Windows 11 эмулирует и x86, и x64. Windows 10 on Arm эмулирует только x86, поэтому разговор про x64-бизнес-приложения по сути всегда про Windows 11.
  • В Windows 11 24H2 появился новый эмулятор Prism: по сравнению с прежним выросла производительность и снизилась нагрузка на CPU. Prism оптимизирован под чипы Qualcomm Snapdragon.
  • 32-разрядные (x86) приложения работают поверх того же слоя WOW64, что и в x64-версии Windows, и получают перенаправление файловой системы и реестра. У x64-приложений слоя WOW64 нет: системные двоичные файлы собраны в формате Arm64X (о нём ниже), поэтому x64-приложение обращается ко всей ОС — и к файловой системе, и к реестру — без перенаправления.1

Сведения о процессоре, которые видит приложение под эмуляцией, относятся к «эмулированному виртуальному процессору». Ради совместимости даже GetNativeSystemInfo возвращает эмулированное значение, поэтому чтобы узнать, действительно ли хост — Arm64, используйте IsWow64Process2 или GetMachineTypeAttributes.13

Отдельно: для приложений, у которых под эмуляцией возникают проблемы, Windows даёт способ изменить параметры эмуляции (пресеты «по умолчанию / безопасный / строгий / очень строгий» и отдельные детальные настройки) через правый щелчок по exe → «Свойства» → вкладка «Совместимость». Это обмен: совместимость ценой производительности. Имеет смысл держать в уме как запасной вариант для случаев «на старой Windows on Arm это работало».14

3. Что эмуляция запускает, а что нет

Ответ на «запустится?» определяется не самим приложением, а типом зависимостей. Прежде чем углубляться в детали, полезно зафиксировать где заканчивается зона действия эмуляции — по слоям. Тогда дальше решать быстрее.

Слой Что здесь находится Покрывает ли эмуляция
Пользовательский режим / внутри своего процесса exe своего приложения и набор DLL той же архитектуры Да. Работает без изменений, как x86/x641
Пользовательский режим / смешение архитектур в том же процессе например, загрузка Arm64-DLL в x64-процесс Нет. Обход: Arm64EC, Arm64X или вынос в отдельный процесс (глава 4)5
Пользовательский режим / DLL в чужом процессе расширения оболочки, IME, средства специальных возможностей, плагины чужих приложений Нет. Нужна пересборка под архитектуру процесса-хоста (Arm64)4
Режим ядра драйверы (VPN, средства защиты, USB-донглы, виртуальные принтеры) Нет. В ядре эмуляции нет, нужен Arm6423

Граница проходит по двум осям: внутри своего процесса или снаружи и пользовательский режим или режим ядра. Перечислить зависимости, которые лежат за этими двумя осями, — по сути и есть вся проверка поддержки Arm. Ниже то же самое, но единицами, которые реально разбирают на практике.

Категория Поведение на Windows 11 on Arm Основание / примечание
Пользовательское приложение x86/x64 (exe + набор DLL той же архитектуры) Работает через эмуляцию Без изменений, без дополнительной установки1
.NET-приложение (управляемое) Работает (возможен и нативный запуск под Arm64) См. главу 58
Драйвер режима ядра Не работает. Нужен нативный Arm64 В ядре эмуляции нет23
Драйвер UMDF / драйвер принтера Нужен Arm64, совпадающий с ОС Даже если само приложение идёт через эмуляцию, функции, завязанные на драйвер, недоступны3
Расширение оболочки / IME / средство специальных возможностей (DLL, загружаемая в чужой процесс) Нужна пересборка под Arm64 Контекстное меню Explorer, значки облачных хранилищ и т. п.4
x86-приложения, запрещающие динамическую генерацию кода Под эмуляцией не работают Эмулятор во время выполнения генерирует инструкции Arm64, поэтому нужно ослабить ProcessDynamicCodePolicy4
Игры, зависящие от устаревшего OpenGL или античит-драйверов Могут не работать Барьер — OpenGL выше 3.3 или античит без поддержки Arm15
Периферия (принтеры, сканеры, специализированные устройства) Определяется наличием драйвера Arm64 Нужен драйвер Arm64 — встроенный в ОС или от производителя15
Антивирусы и ПО, которое «меняет поведение Windows» Нужна проверка по каждому продукту Поддержка Arm заметно продвинулась, но проверять по продуктам всё равно стоит15

Если переложить это на язык бизнес-приложений, тревожные сигналы такие:

  • VPN-клиенты, агенты управления активами, средства защиты — по сути набор драйверов режима ядра. Нужно уточнить у вендора, есть ли версия с поддержкой Arm64.
  • Авторизация через USB-донглы, специализированное оборудование (измерительные приборы, платёжные терминалы и т. п.) — решающий фактор: есть ли драйвер устройства под Arm64.
  • Инструменты, которые «добавляют функцию в Explorer» — расширения оболочки загружаются в Arm64-версию Explorer, поэтому в сборке x64 они просто не работают.
  • Даже если само приложение в эти категории не попадает, тот же удар получает случай, когда установщик содержит драйвер (например, вывод в PDF через драйвер виртуального принтера).

4. Смешивать архитектуры внутри процесса нельзя — реальность P/Invoke и COM

Ещё с 32-разрядной эпохи действовало жёсткое правило: «64-разрядный процесс не может загрузить 32-разрядную DLL».16 На Windows on Arm действует то же правило по структуре. Официально, что можно загружать, сведено в такую таблицу.5

Архитектура процесса DLL x64 DLL Arm64EC DLL Arm64 DLL Arm64X
Процесс x64 / Arm64EC Можно загрузить Можно загрузить Нельзя Можно загрузить
Процесс Arm64 Нельзя Нельзя Можно загрузить Можно загрузить

Два механизма ниже — ключ к проектированию поддержки Arm.

  • Arm64EC (Emulation Compatible) — это ABI нативного кода Arm64, который следует соглашению о вызовах, использованию стека и раскладке данных x64 и поэтому может жить в одном процессе с x64-кодом, идущим под эмуляцией. Когда x64-приложение работает в Windows 11 on Arm, бо́льшая часть кода ОС, загружаемого в этот процесс, уже собрана как Arm64EC и выполняется с нативной скоростью, приложение об этом не знает. Зависимые DLL можно оставить x64 и постепенно переводить свой код на Arm64EC, поднимая производительность — это путь поэтапной миграции.5
  • Arm64X — формат двоичного файла, в котором обычный код Arm64 и код Arm64EC совмещены в одном PE-файле. Если загружающий процесс x64, файл ведёт себя как x64-DLL, если Arm64 — как Arm64-DLL. Это удобно для DLL, которую потенциально вызывают процессы обеих архитектур. В официальной документации ситуации, где нужен Arm64X, названы так: «64-разрядный COM-сервер, который вызывают и x64-, и Arm64-приложения», «плагин, загружаемый и в x64-, и в Arm64-приложения», «один двоичный файл, внедряемый в процессы x64/Arm64».6

Разберём, чем это оборачивается для бизнес-приложений.

Случай 1: x64-exe + нативная x64-DLL (P/Invoke). Если весь процесс единообразно x64, он целиком работает внутри эмуляции. «Ускорить только часть», подмешав Arm64-DLL, нельзя (как в таблице выше — загрузка запрещена).

Случай 2: внутрипроцессный COM-сервер. In-proc COM-сервер — это просто DLL, поэтому таблица выше применяется напрямую. x64-клиент может использовать только COM-DLL x64 (или Arm64EC/Arm64X). В момент, когда приложение станет нативным Arm64, x64 COM-DLL перестанет загружаться. Если нужна поддержка обеих архитектур, либо собирайте DLL как Arm64X, либо применяйте приём, проверенный ещё на границе 32/64 бит: разнести по процессам и связать через внепроцессный COM или IPC. Архитектурную границу исторически переходят на границе процессов.166

Случай 3: вы хостите плагин или сами являетесь плагином. Надстройки Excel, плагины бизнес-пакетов, промежуточное ПО для печати и любая схема, где «вашу DLL загружают в чужой процесс», должны совпадать с архитектурой процесса-хоста. И наоборот: если своё приложение само хостит плагины, перевод его на нативный Arm64 отключит все сторонние x64-плагины — зону влияния нужно оценить заранее.

Кстати, к какой архитектуре относится конкретный двоичный файл, можно узнать из командной строки разработчика.5

link /dump /headers MyLibrary.dll

Смотреть нужно только одну строку сразу после FILE HEADER VALUES. В официальной документации показан вывод такого вида.5

File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
    8664 machine (x64) (ARM64X)

Эту строку machine читают так.

Строка machine Тип двоичного файла
8664 machine (x64) x64
8664 machine (x64) (ARM64X) часть пересобрана как Arm64EC (для x64-процесса выглядит как x64)
AA64 machine (ARM64) Arm64
AA64 machine (ARM64) (ARM64X) Arm64X. Загружается и в процесс x64, и в процесс Arm64

Вывод длинный, поэтому на практике удобно оставить одну строку: link /dump /headers MyLibrary.dll | findstr machine. Если той же командой смотреть промежуточные OBJ/LIB, появится A641 machine (ARM64EC) — это внутренний идентификатор MSVC, а не итоговое значение machine у EXE/DLL.5

Если нужно понять уже запущенное приложение, в диспетчере задач на вкладке «Подробности» можно показать столбец «Архитектура». Приложение, чьё исполняемое собрано как Arm64EC, отображается как ARM64 (x64 compatible).5

5. Случай .NET-приложений — ловушка AnyCPU и определение архитектуры

.NET (семейство Core) официально поддерживает Windows Arm64 начиная с .NET 6. В актуальных .NET 8/9/10 Arm64-редакции Windows 11/10 прямо указаны в списке поддерживаемых ОС. Для публикации достаточно указать RID win-arm64.177

<!-- csproj: публикация под нативный Arm64 -->
<PropertyGroup>
  <TargetFramework>net8.0-windows</TargetFramework>
  <RuntimeIdentifiers>win-x64;win-arm64</RuntimeIdentifiers>
</PropertyGroup>
dotnet publish -r win-arm64 -c Release

Если приложение состоит только из управляемого кода, перевод на нативный Arm64 на этом почти закончен. JIT просто генерирует код Arm64, исходники как правило трогать не нужно. Для приложений на .NET Framework нативную поддержку Arm64 добавила версия 4.8.1 (для Arm64-машин под Windows 11; рантайм 4.8.1 не поддерживает нативные Arm64-приложения на Arm-машинах с Windows 10). Приложение на Framework, оставленное в сборке x64, считается работающим через эмуляцию.1819

Проблема — в сочетании, которое возникает при P/Invoke к нативной DLL. На Arm-машине привычка «это .NET, значит AnyCPU запустится где угодно» подводит.

  • При запуске под Arm64-версией SDK/рантайма .NET приложение по умолчанию работает как процесс Arm64.8
  • Процесс Arm64 не может загрузить x64-DLL (таблица в главе 4). То есть свой AnyCPU-код остаётся нетронутым, но загрузка нативной x64-DLL, подключённой через DllImport, завершается ошибкой.5
  • Наоборот, приложение, опубликованное как win-x64, целиком идёт как x64-процесс и работает внутри эмуляции (вместе с нативной x64-DLL). Нативной производительности Arm64 в этом случае нет, зато это конфигурация с максимальной совместимостью.12

То, что выглядит как «то работает, то нет», обычно оказывается несовпадением архитектуры процесса и архитектуры его нативных зависимостей. Первый шаг диагностики — уметь из кода сказать, под какой архитектурой реально выполняется текущий процесс. Тогда разбор сразу становится проще.

using System.Runtime.InteropServices;

// Архитектура самого процесса (X64, если идёт под эмуляцией x64)
Console.WriteLine($"Process: {RuntimeInformation.ProcessArchitecture}");

// Реальная архитектура ОС (Arm64 на Arm-машине)
Console.WriteLine($"OS: {RuntimeInformation.OSArchitecture}");

Важно: OSArchitecture начал возвращать «реальную архитектуру ОС, без эмуляции» только с .NET 7. Раньше под эмуляцией он возвращал X64, поэтому код на .NET 6 и старше, который по этому API решает «это Arm-машина?», ведёт себя не так, как ожидают.2021

Сведём контрольные точки, специфичные для .NET.

  • Нативные файлы в NuGet-пакетах: пакет, в котором есть только runtimes/win-x64/native, при публикации под win-arm64 ничего подставить не может. Проверяйте содержимое пакета (или репозиторий) на ресурсы для win-arm64. RID как раз и нужен для этой «маршрутизации платформенных ресурсов».7
  • Состав SDK на машине разработки: на Arm-машине Arm64-версия .NET обычно стоит в C:\Program Files\dotnet\, а SDK для x64 — в C:\Program Files\dotnet\x64\, и они могут сосуществовать. Под какой архитектурой реально выполняется dotnet run, зависит от того, куда указывают PATH или DOTNET_ROOT. При проверке это нужно учитывать.17
  • Как читать исключение: несовпадение архитектуры в управляемой сборке проявляется как BadImageFormatException (в официальном справочнике прямо сказано, что условие возникновения — «загрузка компонента, предназначенного для другой платформы»).22

6. Чек-лист: готовность своего приложения к Arm

На практике эффективнее проверять в три этапа.

Этап Что сделать Вывод
1. Инвентаризация зависимостей Составить список нативных DLL, вызываемых через P/Invoke, COM-компонентов, встроенных драйверов, расширений оболочки и NuGet-пакетов с нативными файлами Если драйверов и расширений оболочки ноль, перспективы хорошие. Если есть — проверить поддержку Arm64 у каждого вендора34
2. Проверка на устройстве под эмуляцией Установить приложение как есть (сборка x64) на Arm-машину (или Arm64-VM) и пройти основные бизнес-сценарии Если работает, «оставить как x64» становится рабочим вариантом. Где не работает — подозревать несовпадение архитектуры у зависимости1
3. Рассмотреть нативную сборку под Arm64 Для .NET — публикация под win-arm64, для C++ — добавить конфигурацию Arm64 и проверить, проходит ли сборка Типичная причина срыва сборки — нет Arm64-версии зависимой библиотеки. Рассмотреть обновление, замену или переход на Arm64EC23

Сопоставим, на каком этапе всплывают случаи из главы 4.

Случай из главы 4 На каком этапе важен На что смотреть
Случай 1: x64-exe + нативная x64-DLL 2. Проверка на устройстве Весь процесс единообразно x64, так что шанс, что запустится, высокий. Проверять скорее не «запустится ли», а достаточно ли скорости на практике
Случай 2: внутрипроцессный COM-сервер 1. Инвентаризация → решение на этапе 3 Кто поставляет эту COM-DLL. Уточнить, планируется ли версия Arm64X; если нет — рассмотреть вынос во внепроцессный сервер
Случай 3: вы хостите плагин или сами являетесь плагином 1. Инвентаризация (архитектура хоста) Перевод своего приложения на Arm64 отключит сторонние x64-плагины. До этапа 3 зафиксировать зону влияния

Для этапов 2 и 3 тестовую среду можно взять такую.

  • Реальное устройство: машина на Snapdragon вроде Copilot+ PC. Хотя бы одно такое устройство даёт наибольшую уверенность, включая разбор проблем.12
  • VM в Azure: в портале Azure можно отфильтровать образы по Arm64 и создать Arm64-VM с Windows 11 (рекомендуемый размер, например D2ps_v5, на базе Ampere Altra). Плюс в том, что тестирование можно начать, не имея под рукой ни одной Arm-машины.9
  • Локальная VM: официально распространяется ISO Windows 11 Arm64, VM можно создать на Hyper-V на Arm-машине или на Mac с Arm-based Apple Silicon. На Hyper-V на x64-машине Arm64-VM создать нельзя.10

Состояние поддержки сторонних продуктов можно проверить на сайте, на который указывает Microsoft (Windows on Arm Ready Software). Дальше, по проблемам совместимости своих бизнес-приложений (LOB) и приложений ISV есть официальная служба App Assure. То, что канал помощи есть до ситуации «не запускается и деваться некуда», полезно и как аргумент для ИТ-службы.1215

Критерии, подходит ли вам программа, такие.2425

Пункт Содержание
Как устроено Часть преимуществ FastTrack. Входит в подходящие планы Microsoft 365 и Windows без дополнительной платы
Условия участия По правилам FastTrack. Ориентир — не менее 150 лицензий подходящего плана на один тенант. В списке планов названы Microsoft 365 E3/E5, Microsoft 365 Business Premium, Microsoft Intune, Enterprise Mobility + Security и другие
Что покрывает Windows 10/11, Microsoft 365 Apps, Azure Virtual Desktop, Microsoft Edge, Windows on Arm64 PC, Windows 365. Целевые приложения — свои LOB, приложения ISV и продукты Microsoft
Куда обращаться Заявка через форму Request for Assistance. Общее описание программы — aka.ms/appassure
Отдельный канал для разработчиков Для разработчиков, у которых застряла работа по поддержке Arm, также указана заявка в App Assure Arm Advisory Service

Подходит ли ваш набор лицензий, быстрее всего сверить названия планов выше с договором в ИТ-службе и отделе закупок. Порог по числу лицензий и список планов могут меняться, поэтому перед заявкой сверьтесь с актуальной страницей условий FastTrack.

7. Практичное решение на сегодня — три варианта

Поддержка Arm — это не «всё перевести на нативный код». Для многих бизнес-приложений реалистичнее поэтапный выбор по ситуации.

Вариант Когда подходит На что обратить внимание
(а) Оставить x64 и работать под эмуляцией Нет зависимости от драйверов и расширений оболочки, производительности на практике хватает Prism (24H2+) уже улучшил производительность. Держите весь процесс единообразно в x64, не подмешивайте двоичные файлы Arm6415
(б) Уточнить у вендора поддержку Arm64 или подождать Нативная DLL или драйвер — сторонний продукт Уточнить, планируется ли версия Arm64 (или Arm64X). Для драйверов обхода, кроме ожидания, нет323
(в) Нативная сборка под Arm64 Чистое .NET-приложение или случай, когда Arm64-версии всех зависимостей уже есть. Когда в требованиях — производительность или время работы от батареи Условие — публикация под win-arm64 плюс перевод на Arm64 всех нативных зависимостей. Если хостите плагины, учитывайте зону влияния75

Если объём кода на C++ большой, между (а) и (в) есть промежуточный путь — Arm64EC. Свой код можно постепенно переводить на нативный, оставляя зависимые x64-DLL как есть. Это официальный маршрут для случаев «огромное x64-приложение нельзя перевести за один шаг».523

Со стороны инструментов есть нативная под Arm64 версия Visual Studio, а на Arm-машине доступен набор компилятора, который собирает сразу под Arm64, x64 и x86. Сборки для CI можно получать кросс-компиляцией на существующей x64-машине, поэтому конфигурация «на Arm-устройство или VM переносится только запуск тестов» собирается проще.2623

8. Итог

  • Windows 11 on Arm запускает приложения x86/x64 встроенной в ОС эмуляцией, а с 24H2 производительность ещё улучшил Prism. Эмуляция x64 появилась начиная с Windows 11, Windows 10 on Arm поддерживает только x86.
  • Эмуляция покрывает только пользовательский режим. Драйверы режима ядра, UMDF и принтеров, а также DLL, загружаемые в чужой процесс — расширения оболочки, IME, средства специальных возможностей, — требуют нативного Arm64. Запустится ли бизнес-приложение, решает не оно само, а эти окружающие зависимости.
  • Внутри процесса x64 и Arm64 сосуществовать не могут. Процесс x64/Arm64EC загружает x64 и Arm64EC, процесс Arm64 — только Arm64. Внутрипроцессные COM-серверы и плагины подчиняются тому же правилу: стандартный ответ для поддержки обеих архитектур — Arm64X, стандартный ответ для перехода через границу процесса — внепроцессный COM или IPC.
  • .NET умеет публиковать нативно под win-arm64, но AnyCPU-приложение на Arm64-рантайме выполняется как процесс Arm64, поэтому P/Invoke к нативной DLL только под x64 завершится ошибкой. Для диагностики используйте RuntimeInformation.ProcessArchitecture / OSArchitecture (последнее — начиная с .NET 7).
  • Порядок проверки — три этапа: «инвентаризация зависимостей → проверка на устройстве в исходном виде под эмуляцией → при необходимости перевод на нативный Arm64». Тестовую среду можно развернуть через Arm64-VM в Azure или ISO Arm64, корпоративным клиентам доступна поддержка App Assure.
  • На сегодня практичное решение — выбирать по ситуации: «если под эмуляцией работает — оставить как есть», «уточнить у вендоров драйверов и DLL статус поддержки», «перевести на нативный Arm64, если того требуют условия (для C++ возможна и поэтапная миграция через Arm64EC)».

Похожие статьи

Смежные области консультаций

В Komura Software LLC мы занимаемся исследованием готовности существующих бизнес-приложений к Windows on Arm, проектированием миграции архитектуры приложений с нативными DLL и COM-интеграцией, а также анализом первопричин сбоев, которые воспроизводятся только на Arm-машинах.

Справочные материалы

  1. Microsoft Learn, How emulation works on Arm. О том, что эмуляция встроена в ОС и запускает приложения без изменений; что Windows 11 поддерживает и x86, и x64, а Windows 10 on Arm — только x86; о JIT-преобразовании блоков инструкций x86 и кэшировании; о Prism и его оптимизации под Snapdragon в Windows 11 24H2; о том, что x86-приложения получают перенаправление через WOW64, а x64-приложения обходятся без слоя WOW64 и используют системные двоичные файлы в формате Arm64X.  2 3 4 5 6 7 8

  2. Microsoft Learn, How emulation works on Arm. О том, что эмуляция поддерживает только код пользовательского режима и не поддерживает драйверы, а компоненты режима ядра нужно компилировать под Arm64.  2 3 4

  3. Microsoft Learn, Troubleshooting x86 desktop apps. О том, что все драйверы режима ядра, драйверы UMDF и драйверы принтеров должны совпадать с архитектурой ОС, и что функции, завязанные на драйвер, остаются недоступны, даже если само приложение идёт через эмуляцию.  2 3 4 5 6 7

  4. Microsoft Learn, Troubleshooting x86 desktop apps. О том, что приложения, которые загружают свою DLL в процесс Windows (расширения оболочки, IME, средства специальных возможностей), нужно пересобрать под архитектуру системы (Arm64), и что x86-приложения, запрещающие динамическую генерацию кода, не могут выполняться под эмуляцией.  2 3 4 5 6

  5. Microsoft Learn, Arm64EC - Build and port apps for native performance on Arm. О таблице совместимости: процессы x64/Arm64EC загружают двоичные файлы x64 и Arm64EC, процессы Arm64 — только Arm64; о том, что Arm64EC следует программным соглашениям x64 и может жить в одном процессе с x64-кодом; что бо́льшая часть кода ОС, загружаемого в процесс x64-приложения, — это Arm64EC; о проверке типа двоичного файла через link /dump /headers.  2 3 4 5 6 7 8 9 10 11 12 13 14

  6. Microsoft Learn, Arm64X PE files. О том, что Arm64X совмещает код Arm64 и Arm64EC в одном PE и загружается и в процесс x64, и в процесс Arm64; о том, что 64-разрядные COM-серверы, плагины и внедряемые DLL, которые вызывают приложения обеих архитектур, названы ситуациями, где нужен Arm64X.  2 3

  7. Microsoft Learn, .NET RID Catalog. О том, что win-arm64 определён как RID для Windows, и что RID используется для маршрутизации платформенных ресурсов в NuGet-пакетах.  2 3 4

  8. Microsoft Learn, Windows on Arm. О том, что запуск под Arm64-версией SDK .NET по умолчанию идёт как Arm64; что актуальные .NET 8/9/10 указаны как поддерживающие нативное выполнение под Arm64; что существующие x64-приложения .NET работают через эмуляцию x64 в ОС.  2 3

  9. Microsoft Learn, Quickstart: Create a Windows on Arm virtual machine in the Azure portal. О том, что в портале Azure можно отфильтровать образ Arm64 и создать Arm64-VM с Windows 11 (рекомендуемый размер, например D2ps_v5, на базе Ampere Altra).  2

  10. Microsoft Learn, Windows 11 Arm ISO files overview. О том, что распространяется ISO Windows 11 Arm64, что VM можно создать на Hyper-V на Arm-машине или на Mac с Apple Silicon, и что Hyper-V на x64-оборудовании не поддерживает Arm64-VM.  2

  11. Microsoft Learn, Develop AI applications for Copilot+ PCs. О том, что Copilot+ PC — новая категория оборудования на Windows 11 с NPU, способным выполнять более 40 триллионов операций в секунду (40+ TOPS). 

  12. Microsoft Learn, Windows on Arm. О том, что Windows 10 поддерживала x86, а Windows 11 добавила выполнение x64 без изменений; что большинство Copilot+ PC используют серию Snapdragon X; о сайте статуса поддержки Arm (Works on Windows on Arm) и сервисе App Assure Arm Advisory Service.  2 3 4

  13. Microsoft Learn, How emulation works on Arm - Detecting emulation. О том, что приложению под эмуляцией видны сведения об эмулированном виртуальном процессоре, что GetNativeSystemInfo тоже ради совместимости возвращает эмулированное значение, и об использовании IsWow64Process2 или GetMachineTypeAttributes, чтобы определить Arm64-хост. 

  14. Microsoft Learn, Adjust emulation settings on Arm. О том, что параметры эмуляции Prism (пресеты «по умолчанию / безопасный / строгий / очень строгий» и отдельные настройки) можно изменить на вкладке «Совместимость» в свойствах exe. 

  15. Microsoft Learn, Arm-based Surface devices FAQ. Об ограничениях Arm-устройств (драйверы должны быть рассчитаны на Arm, работоспособность периферии зависит от драйверов Arm64, игры с OpenGL выше 3.3 или неподдерживаемым античитом, приложения-кастомизаторы вроде IME, необходимость проверять антивирусное ПО по каждому продукту), а также о поддержке совместимости через App Assure, включая LOB-приложения.  2 3 4

  16. Microsoft Learn, Process Interoperability. О том, что 64-разрядный процесс не может загрузить 32-разрядную DLL (и наоборот), и о стандартном приёме связи через границу архитектур с помощью внепроцессного COM-сервера и RPC.  2

  17. Microsoft Learn, Install .NET on Windows. О том, что Arm64-редакции Windows 11/10 входят в поддержку .NET 8/9/10; что на Arm-машине Arm64-версия .NET ставится в C:\Program Files\dotnet\, а SDK для x64 — в C:\Program Files\dotnet\x64\; что может понадобиться настройка PATH или DOTNET_ROOT.  2

  18. Microsoft Learn, What’s new in .NET Framework. О том, что .NET Framework 4.8.1 добавила нативную поддержку Arm64 с преимуществом в производительности по сравнению с x64-кодом, который на Arm64 идёт под эмуляцией. 

  19. Microsoft Learn, Develop Apps for Windows IoT Enterprise. О том, что нативная поддержка Arm64 в .NET Framework 4.8.1 рассчитана на Windows 11, и что рантайм 4.8.1 не поддерживает нативные Arm64-приложения на устройствах с Windows 10. 

  20. Microsoft Learn, RuntimeInformation.OSArchitecture under emulation. О том, что начиная с .NET 7 OSArchitecture возвращает Arm64 даже для процесса под эмуляцией на Windows Arm64 (раньше возвращалось X64), и что для архитектуры самого процесса следует использовать ProcessArchitecture. 

  21. Microsoft Learn, RuntimeInformation.ProcessArchitecture Property / RuntimeInformation.OSArchitecture Property. Об API для получения архитектуры выполняемого процесса и реальной архитектуры ОС. 

  22. Microsoft Learn, BadImageFormatException Class. О том, что BadImageFormatException возникает, когда компонент приложения предназначен для другой платформы (загрузка сборки несовпадающей архитектуры). 

  23. Microsoft Learn, Add Arm support to your Windows app. О типичных препятствиях для сборки под Arm64 (неподдерживаемые зависимые библиотеки, архитектурно-специфичный код, драйверы режима ядра) и способах их устранения; о варианте пересборки через Arm64EC с сохранением зависимостей от x64; о способах получить Arm-устройство или VM для тестирования; о сочетании кросс-компилированных сборок с тестированием в среде Arm.  2 3 4

  24. Microsoft Learn, App Assure - Compatibility Cookbook. О том, что App Assure — часть преимуществ FastTrack и входит в подходящие планы Microsoft 365 и Windows без дополнительной платы; что в зону поддержки входят Windows 10/11, Microsoft 365 Apps, Azure Virtual Desktop, Microsoft Edge, Windows on Arm64 PC и Windows 365; что программа закрывает проблемы совместимости своих LOB-приложений, приложений ISV и продуктов Microsoft; что заявку подают через Request for Assistance (aka.ms/appassurerequest). 

  25. Microsoft Learn, Eligibility - FastTrack. О том, что поддержка FastTrack предоставляется при покупке не менее 150 подходящих лицензий на один тенант, и что в списке планов названы Microsoft 365 E3/E5, Microsoft 365 Business Premium, Microsoft Intune, Enterprise Mobility + Security и другие. 

  26. Microsoft Learn, Visual Studio on Arm-powered devices. О том, что нативная под Arm64 версия Visual Studio поддерживает разработку на .NET/C++, и что набор инструментов MSVC на Arm64-хосте может собирать под Arm64, x64 и x86. 

Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.

Эти страницы показывают тему статьи в более широком контексте услуг и решений.

Статья напрямую связана со следующими услугами.

Частые вопросы

Вопросы, которые часто возникают при консультациях по теме статьи.

Запустится ли обычное x64-бизнес-приложение на Windows on Arm?
В большинстве случаев да. В Windows 11 on Arm встроена эмуляция, которая запускает приложения x86/x64 без изменений, а начиная с Windows 11 24H2 новый эмулятор Prism ещё и улучшил производительность. Но эмуляция обрабатывает только код пользовательского режима. Драйверы режима ядра, а также расширения оболочки и IME, которые загружаются в чужие процессы вроде Explorer, требуют нативного Arm64. Смотреть нужно не на само приложение, а на зависимости вокруг него.
Может ли x64-exe вызвать Arm64-DLL?
Нет. Смешивать двоичные файлы x64 и Arm64 в одном процессе нельзя: процесс x64 (или Arm64EC) загружает только двоичные файлы x64 и Arm64EC, процесс Arm64 — только Arm64. В обратную сторону (Arm64-exe вызывает x64-DLL) тоже нельзя. Если нужна одна DLL на обе архитектуры, варианты — формат Arm64X, в котором код Arm64 и Arm64EC живут в одном файле, либо разнести работу по процессам и связать их через IPC.
Что нужно, чтобы подготовить .NET-приложение к Arm64?
.NET 6 и новее официально поддерживают Windows Arm64. В актуальных .NET 8/9/10 Arm64-редакции Windows 11/10 прямо указаны в списке поддерживаемых ОС. Достаточно опубликовать приложение с RID (идентификатором среды выполнения) win-arm64 — получится нативный исполняемый файл под Arm64. Если код чисто управляемый, на этом почти всё. Если есть нативные DLL через P/Invoke или NuGet-пакеты с нативными файлами, для каждого нужно проверить, есть ли сборка под Arm64. Для приложений на .NET Framework нативное выполнение на Arm64 в Windows 11 даёт версия 4.8.1.
Какое ПО не работает на Windows on Arm?
В первую очередь — ПО с драйверами режима ядра. Драйверы не эмулируются, поэтому VPN-клиенты, средства защиты, виртуальные устройства и авторизация через USB-донглы без драйвера Arm64 не заработают. Дальше — расширения оболочки, IME и средства специальных возможностей, которые загружают DLL в процессы самой ОС; приложения, запрещающие динамическую генерацию кода; игры, зависящие от устаревшего OpenGL или античит-драйверов. Периферия тоже зависит от того, есть ли драйвер Arm64.

Об авторе

Страница с профилем автора статьи.

Го Комура

Представитель KomuraSoft LLC

Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.

Публичные ссылки

Вернуться в блог