Arm판 Windows에서 업무 앱은 동작하는가 ── x64 에뮬레이션(Prism)과 네이티브 DLL·COM의 현실

· · Windows on Arm, Arm64, x64 에뮬레이션, 네이티브 연동, P/Invoke, COM, 드라이버, C#, .NET, Windows 개발, 기술 상담

「다음 달부터 쓸 새 PC, Copilot+ PC라는 걸로 하려는데, 우리 업무 시스템은 동작하나요?」── Snapdragon 탑재 PC의 법인 도입이 진행되면서, 이런 질문을 받는 개발 회사·정보시스템 부서가 늘고 있습니다. 카탈로그에는 「기존 앱도 에뮬레이션으로 동작」이라고 적혀 있습니다. 하지만 자사의 업무 앱은 C# 화면 뒤에서 벤더가 제공하는 네이티브 DLL을 P/Invoke하고, 장표는 COM 컴포넌트를 경유하며, 게다가 전용 기기의 드라이버까지 들어 있습니다. 「동작하나요?」에 즉답하지 못하는 것이 솔직한 현실이 아닐까요.

결론부터 말하면, 「앱 본체는 대개 동작한다. 위험한 것은 앱 주변에 있는 녀석들이다」입니다. x86/x64의 사용자 모드 코드는 Windows 11의 에뮬레이션이 상당한 정밀도로 처리해 주는 반면, 드라이버·셸 확장·프로세스 내 아키텍처 혼재라는 「에뮬레이션의 수비 범위 밖」이 분명히 존재합니다. 그리고 이 수비 범위 밖이야말로, 업무 앱이 즐겨 사용해 온 영역입니다.

이 글에서는 Windows on Arm의 에뮬레이션 구조와 한계, x64와 Arm64를 프로세스 내에서 섞을 수 없다는 대원칙, .NET 앱 특유의 조합 문제, 그리고 「자사 앱이 Arm 기기에서 동작하는가」를 확인하는 실무 절차를, Microsoft Learn으로 근거를 확인할 수 있는 범위에서 정리합니다.

1. 먼저 결론

급하신 분은 우선 이 3가지만 보셔도 충분합니다.

  1. 앱 본체는 대개 동작합니다. Windows 11 on Arm은 x86/x64 앱을 OS 내장 에뮬레이션으로 실행할 수 있으며, 24H2 이후에는 Prism으로 성능도 개선되었습니다.1
  2. 위험한 것은 「주변」입니다. 커널 모드 드라이버, 셸 확장이나 IME처럼 다른 프로세스에 로드되는 DLL, 그리고 네이티브 DLL·COM의 아키텍처 불일치. 동작 여부는 앱 본체가 아니라 여기서 결정됩니다.234
  3. 확인은 3단계로 충분합니다. 의존물 목록화 → x64 그대로 Arm 기기에서 실기 확인 → 필요하면 Arm64 네이티브화. 절차는 6장에서 다룹니다.

Arm64EC·Arm64X라는 용어는 4장에서 설명합니다. 여기서 외울 필요는 없습니다. 아래는 이 3가지 항목의 세부 내용과 출처입니다. 세부 사항이 필요할 때 다시 돌아와 주세요.

  • 순수한 매니지드(.NET) 앱이나 일반적인 x86/x64 데스크톱 앱은, Arm판 Windows 11의 에뮬레이션으로 거의 동작합니다. 에뮬레이션은 OS에 내장되어 있어, 앱 수정도 추가 컴포넌트도 필요하지 않습니다.1
  • 에뮬레이션이 처리해 주는 것은 사용자 모드 코드뿐입니다. 커널 모드 드라이버는 에뮬레이션되지 않으며, Arm64 네이티브가 필수입니다. UMDF 드라이버나 프린터 드라이버도 OS의 아키텍처에 맞춰야 합니다.23
  • 셸 확장·IME·지원 기술 등 「다른 프로세스(Explorer 등)에 로드되는 DLL」도, 시스템과 동일한 Arm64로의 재컴파일이 필요합니다. 에뮬레이션으로는 구제할 수 없습니다.4
  • 하나의 프로세스 내에서 x64와 Arm64는 혼재할 수 없습니다. x64/Arm64EC 프로세스가 로드할 수 있는 것은 x64와 Arm64EC 바이너리, Arm64 프로세스가 로드할 수 있는 것은 Arm64 바이너리뿐입니다. x64의 exe에서 Arm64의 DLL은 호출할 수 없고, 그 반대도 마찬가지입니다.5
  • 이 제약을 하나의 파일로 넘어서기 위한 구조가 Arm64EC(x64와 동일 프로세스에서 혼재할 수 있는 네이티브 Arm64 코드)와 Arm64X(Arm64와 Arm64EC를 하나의 PE에 함께 담아, 어느 프로세스에도 로드할 수 있는 바이너리)입니다. 양쪽 아키텍처에서 호출되는 COM 인프로세스 서버나 플러그인은 Arm64X가 나설 차례입니다.56
  • .NET은 .NET 6 이후로 Windows Arm64를 공식 지원하며(현재 지원 중인 .NET 8/9/10에서는 Windows 11/10의 Arm64가 지원 대상 OS로 명시되어 있습니다), RID win-arm64로 네이티브 발행할 수 있습니다. 반면 AnyCPU 앱을 Arm64의 .NET 런타임으로 실행하면 프로세스는 Arm64로 동작하기 때문에, x64 버전만 있는 네이티브 DLL을 P/Invoke하고 있으면 로드에 실패한다는 조합 문제가 발생합니다.785
  • 검증 환경은 실기(Copilot+ PC 등) 외에도, Azure의 Windows 11 Arm64 VM, Arm 기기의 Hyper-V나 Apple Silicon Mac에서 사용할 수 있는 Windows 11 Arm64 ISO로 준비할 수 있습니다. ※x64 기기의 Hyper-V에서는 Arm64 VM을 만들 수 없습니다.910

2. Arm판 Windows란 ── Snapdragon 탑재 PC와 Prism

Arm판 Windows는 Arm64 프로세서 위에서 동작하는 Windows입니다. 2024년 이후 「Copilot+ PC」── 초당 40조 회 이상의 연산(40+ TOPS)이 가능한 NPU를 탑재한 Windows 11 PC의 새로운 카테고리 ── 의 다수가 Arm 기반의 Snapdragon X 시리즈를 채택하면서, 개발자가 의식하지 않을 수 없는 존재가 되었습니다.1112

기존 앱과의 호환성을 뒷받침하는 것이 OS 내장 에뮬레이션입니다. 구조의 요점은 다음과 같습니다.1

  • 에뮬레이터는 x86/x64 명령 블록을 Arm64 명령으로 JIT 컴파일하고, 변환 결과를 모듈 단위로 캐시하여 두 번째 이후 실행 속도를 높입니다.
  • Windows 11은 x86과 x64 양쪽 모두를 에뮬레이션할 수 있습니다. Windows 10 on Arm이 에뮬레이션할 수 있는 것은 x86뿐이므로, x64 업무 앱 이야기는 사실상 Windows 11을 전제로 합니다.
  • Windows 11 24H2에서는 새로운 에뮬레이터 Prism이 도입되어, 기존보다 성능이 향상되고 CPU 사용률이 낮아졌습니다. Prism은 Qualcomm Snapdragon용으로 최적화되어 있습니다.
  • 32bit(x86) 앱은 x64판 Windows와 동일한 WOW64 레이어 위에서 동작하며, 파일 시스템·레지스트리 리다이렉션을 받습니다. 반면 x64 앱에는 WOW64 레이어가 없고, 시스템 바이너리가 후술할 Arm64X 형식으로 컴파일되어 있기 때문에, x64 앱은 리다이렉션 없이 OS 전체(파일 시스템도 레지스트리도)에 접근할 수 있습니다.1

에뮬레이션 하에서 앱에 보이는 CPU 정보는 「에뮬레이트된 가상 프로세서」의 정보입니다. 호환성을 위해 GetNativeSystemInfo조차 에뮬레이트된 값을 반환하므로, 호스트가 Arm64인지 알고 싶다면 IsWow64Process2GetMachineTypeAttributes를 사용합니다.13

참고로 에뮬레이션에서 문제가 발생한 앱을 위해, exe를 마우스 오른쪽 버튼 클릭 → 속성 → 호환성 탭에서 에뮬레이션 설정(기본/안전/엄격/매우 엄격 프리셋과 개별 세부 설정)을 변경하는 기능이 Windows 쪽에 마련되어 있습니다. 호환성과 맞바꿔 성능이 떨어지는 조정이지만, 「예전 Windows on Arm에서는 동작했는데」라는 경우의 탈출구로 기억해 둘 가치가 있습니다.14

3. 에뮬레이션으로 동작하는 것·동작하지 않는 것

「동작하나요?」에 대한 답은 앱 본체가 아니라 의존물의 종류로 결정됩니다. 세부 사항으로 들어가기 전에, 에뮬레이션의 수비 범위가 어디서 끊기는지를 계층별로 짚어 두면 이후의 판단이 빨라집니다.

거기에 있는 것 에뮬레이션으로 구제할 수 있는가
사용자 모드 / 자신의 프로세스 안 자사 앱의 exe와, 같은 아키텍처의 DLL 일습 구제 가능. x86/x64 그대로 수정 없이 동작1
사용자 모드 / 같은 프로세스에 다른 아키텍처를 섞음 x64 프로세스에 Arm64의 DLL을 로드하는 등 구제 불가. Arm64EC·Arm64X, 또는 별도 프로세스화로 회피(4장)5
사용자 모드 / 다른 프로세스에 들어가는 DLL 셸 확장, IME, 지원 기술, 타사 앱의 플러그인 구제 불가. 상대 프로세스(Arm64)에 맞춘 재컴파일이 필요4
커널 모드 각종 드라이버(VPN, 보안 제품, USB 동글, 가상 프린터) 구제 불가. 커널에는 에뮬레이션이 존재하지 않으며 Arm64 필수23

경계는 「자신의 프로세스 안인가 밖인가」, 그리고 「사용자 모드인가 커널 모드인가」라는 2가지입니다. 이 2가지 경계 밖에 있는 의존물을 하나하나 헤아리는 작업이 사실상 Arm 대응 조사의 전부라고 해도 과언이 아닙니다. 아래는 같은 내용을 실제 검토 대상이 되는 단위로 나열한 판단표입니다.

분류 Arm판 Windows 11에서의 취급 근거·비고
x86/x64 사용자 모드 앱(exe + 같은 아키텍처의 DLL 일습) 에뮬레이션으로 동작 수정 없음·추가 설치 불필요1
.NET(매니지드) 앱 동작함(Arm64 네이티브 실행도 가능) 5장 참조8
커널 모드 드라이버 동작하지 않음. Arm64 네이티브 필수 커널에는 에뮬레이션이 없음23
UMDF 드라이버·프린터 드라이버 OS와 동일한 Arm64가 필수 앱 본체는 에뮬레이션으로 동작해도, 드라이버 의존 기능은 사용 불가3
셸 확장·IME·지원 기술(다른 프로세스에 로드되는 DLL) Arm64로의 재컴파일이 필요 탐색기 오른쪽 클릭 메뉴, 클라우드 스토리지 아이콘 표시 등4
동적 코드 생성을 금지한 x86 앱 에뮬레이션으로는 동작하지 않음 에뮬레이터는 실행 시 Arm64 명령을 생성하므로, ProcessDynamicCodePolicy 완화가 필요4
오래된 OpenGL·안티치트 드라이버 의존 게임 동작하지 않는 경우가 있음 OpenGL 3.3 초과나 Arm 미지원 안티치트가 걸림돌15
주변기기(프린터, 스캐너, 전용 디바이스) Arm64 드라이버의 유무로 결정 OS 동봉 또는 제조사 제공의 Arm64 드라이버가 필요15
백신·「Windows의 경험을 바꾸는」계열 소프트웨어 개별 확인 필요 Arm 대응은 진행되었으나 제품별 확인을 권장15

업무 앱의 맥락으로 다시 말하면, 위험 신호는 다음과 같은 것들입니다.

  • VPN 클라이언트, 자산 관리 에이전트, 보안 제품 ── 커널 드라이버 덩어리입니다. Arm64 대응판의 유무를 벤더에 확인해야 합니다.
  • USB 동글 인증, 전용 기기(계측기·결제 단말 등) ── 디바이스 드라이버가 Arm64로 제공되는지가 생명선입니다.
  • 「탐색기에 기능을 추가하는」계열 도구 ── 셸 확장은 Arm64의 탐색기에 로드되기 때문에, x64 그대로는 작동하지 않습니다.
  • 앱 본체가 여기에 해당하지 않더라도, 설치 프로그램이 드라이버를 동봉하고 있는 경우(가상 프린터 드라이버 방식의 PDF 출력 등)는 같은 문제를 겪습니다.

4. 프로세스 내 아키텍처 혼재는 불가능하다 ── P/Invoke와 COM의 현실

32bit 시대부터 「64bit 프로세스는 32bit DLL을 로드할 수 없다」는 철칙이 있었습니다16. Arm판 Windows에도 같은 구조의 철칙이 있습니다. 로드 가능 여부의 규칙은 공식적으로 다음과 같이 정리되어 있습니다.5

프로세스의 아키텍처 x64 DLL Arm64EC DLL Arm64 DLL Arm64X DLL
x64 / Arm64EC 프로세스 로드 가능 로드 가능 불가 로드 가능
Arm64 프로세스 불가 불가 로드 가능 로드 가능

여기서 등장하는 2가지 구조가 Arm 대응 설계를 고민할 때의 핵심입니다.

  • Arm64EC(Emulation Compatible)는 x64의 호출 규약·스택 사용·데이터 레이아웃을 따름으로써, 동일 프로세스 내에서 에뮬레이션 실행되는 x64 코드와 혼재할 수 있는 네이티브 Arm64 코드의 ABI입니다. x64 앱이 Windows 11 on Arm에서 동작할 때, 그 프로세스에 로드되는 OS 코드의 대부분은 Arm64EC로 컴파일되어 있으며, 앱이 알아채지 못한 채 네이티브 속도로 실행되고 있습니다. 의존 DLL이 x64 그대로라도, 자신의 코드부터 순서대로 Arm64EC화하여 성능을 높여 가는 단계적 이행에 사용할 수 있습니다.5
  • Arm64X는 기존의 Arm64 코드와 Arm64EC 코드를 하나의 PE 파일에 함께 담은 바이너리 형식입니다. 로드하는 프로세스가 x64라면 x64의 DLL로, Arm64라면 Arm64의 DLL로 동작하기 때문에, 양쪽 아키텍처의 프로세스에서 호출될 가능성이 있는 DLL에 적합합니다. 공식 문서는 Arm64X가 필요한 상황으로 「x64와 Arm64 양쪽 앱에서 호출되는 64bit COM 서버」, 「x64/Arm64 어느 쪽 앱에도 로드되는 플러그인」, 「x64/Arm64 프로세스에 주입되는 단일 바이너리」를 들고 있습니다.6

업무 앱에서의 실질적인 피해를 구체화해 봅시다.

케이스 1: x64의 exe + x64의 네이티브 DLL(P/Invoke). 프로세스 전체가 x64로 통일되어 있다면, 통째로 에뮬레이션 안에서 동작합니다. 「일부만 빠르게 하고 싶다」며 Arm64의 DLL을 섞을 수는 없습니다(위 표대로 불가능합니다).

케이스 2: COM 인프로세스 서버. COM의 in-proc 서버는 그냥 DLL이므로, 위 표의 규칙이 그대로 적용됩니다. x64 클라이언트에서는 x64(또는 Arm64EC/Arm64X)의 COM DLL만 사용할 수 있으며, 앱을 Arm64 네이티브화하는 순간 x64의 COM DLL은 로드할 수 없게 됩니다. 양쪽 모두 지원해야 한다면, DLL을 Arm64X화하거나, 32bit↔64bit에서 실적이 있는 아웃프로세스 COM/IPC 분리(프로세스를 나누어 프로세스 간 통신으로 연결) 정석을 적용합니다. 아키텍처의 벽은 프로세스 경계에서 넘는 것이 예로부터의 기본형입니다.166

케이스 3: 자신이 플러그인을 호스팅하거나, 호스팅되는 경우. Excel 애드인, 업무 패키지의 플러그인, 인쇄 미들웨어 등 「상대 프로세스에 자신의 DLL이 로드되는」형태는 상대의 아키텍처에 맞춰야 합니다. 반대로 자사 앱이 플러그인을 호스팅하고 있다면, 자사 앱을 Arm64화하면 x64의 서드파티 플러그인이 전멸한다는 영향 범위를 미리 파악해 둘 필요가 있습니다.

참고로 수중의 바이너리가 어느 것인지는 개발자 명령 프롬프트에서 확인할 수 있습니다.5

link /dump /headers MyLibrary.dll

확인할 것은 FILE HEADER VALUES 바로 다음 1줄뿐입니다. 공식 문서에는 다음과 같은 형태의 출력이 제시되어 있습니다.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처럼 연결해서 이 1줄만 추출하는 것이 실무적입니다. 참고로 빌드 도중의 OBJ/LIB를 같은 명령으로 조사하면 A641 machine (ARM64EC)로 표시되지만, 이는 MSVC 내부 식별자이며 최종 EXE/DLL의 machine 값은 아닙니다.5

이미 실행 중인 앱만 조사하고 싶다면, 작업 관리자의 「자세히」탭에 「아키텍처」열을 표시하는 방법도 있습니다. 실행 파일이 Arm64EC로 컴파일된 앱은 ARM64 (x64 compatible)로 표시됩니다.5

5. .NET 앱의 경우 ── AnyCPU의 함정과 아키텍처 판정

.NET(Core 계열)은 .NET 6 이후로 Windows Arm64를 공식 지원하며, 현재 지원 중인 .NET 8/9/10에서는 Windows 11/10의 Arm64가 지원 대상 OS로 명시되어 있습니다. 발행은 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 앱의 경우에는 .NET Framework 4.8.1이 Arm64 네이티브 지원을 추가했습니다(Windows 11의 Arm64 기기용. 4.8.1 런타임은 Windows 10의 Arm 기기에서는 네이티브 Arm64 앱을 지원하지 않습니다). x64 빌드 그대로의 Framework 앱은 에뮬레이션으로 동작하는 취급입니다.1819

문제는 네이티브 DLL을 P/Invoke하고 있는 경우의 조합입니다. Arm 기기에서는 「.NET 앱이니까 AnyCPU로 어디서든 동작한다」는 오랜 감각이 배신당합니다.

  • Arm64의 .NET SDK/런타임으로 실행하면, 앱은 기본값으로 Arm64 프로세스로 실행됩니다.8
  • Arm64 프로세스는 x64의 DLL을 로드할 수 없습니다(4장의 표). 즉 AnyCPU인 자사 코드는 멀쩡해도, DllImport하고 있는 x64 네이티브 DLL을 로드하는 부분에서 실패합니다.5
  • 반대로 win-x64로 발행한 앱은 프로세스 전체가 x64가 되어, 에뮬레이션 안에서(x64 네이티브 DLL까지 포함해) 동작합니다. 이 경우 Arm64 네이티브의 성능은 얻을 수 없지만, 동작 호환성은 가장 높은 구성입니다.12

「동작하기도 하고 안 하기도 하는」것처럼 보이는 정체는, 대부분 프로세스의 아키텍처와 네이티브 의존물의 아키텍처 불일치입니다. 원인 분리의 첫걸음으로, 실행 중인 프로세스가 무엇으로 동작하고 있는지를 코드로 확인할 수 있게 해 두면 조사가 단숨에 편해집니다.

using System.Runtime.InteropServices;

// 프로세스 자체의 아키텍처(x64 에뮬레이션 하에서라면 X64)
Console.WriteLine($"Process: {RuntimeInformation.ProcessArchitecture}");

// OS 본래의 아키텍처(Arm 기기라면 Arm64)
Console.WriteLine($"OS: {RuntimeInformation.OSArchitecture}");

주의할 점으로, OSArchitecture가 「에뮬레이션을 걷어낸 본래의 OS 아키텍처」를 반환하게 된 것은 .NET 7부터입니다. 그 이전에는 에뮬레이션 하에서 X64를 반환했기 때문에, .NET 6 이전에서 「Arm 기기인지 여부」를 이 API로 판정하는 코드는 기대한 대로 동작하지 않습니다.2021

.NET 고유의 체크포인트를 정리합니다.

  • NuGet 패키지의 네이티브 자산: runtimes/win-x64/native만 가진 패키지는 win-arm64 발행 시 의지할 것이 없습니다. 패키지 내용(또는 리포지토리)에서 win-arm64 자산의 유무를 확인합니다. RID는 바로 이 「플랫폼 고유 자산의 분류」를 위한 구조입니다.7
  • 개발 기기의 SDK 구성: Arm 기기에서는 Arm64판 .NET이 일반적인 C:\Program Files\dotnet\에, x64판 SDK는 C:\Program Files\dotnet\x64\에 설치되어 공존할 수 있습니다. PATH나 DOTNET_ROOT가 어느 쪽을 가리키는지에 따라 dotnet run의 실행 아키텍처가 달라지므로, 검증 시에는 유의하시기 바랍니다.17
  • 예외를 읽는 법: 매니지드 어셈블리의 아키텍처 불일치는 BadImageFormatException으로 나타납니다(공식 레퍼런스에도 「다른 플랫폼을 대상으로 하는 컴포넌트의 로드」가 발생 조건으로 명시되어 있습니다).22

6. 자사 앱의 Arm 대응 체크리스트

실무에서는 다음 3단계로 확인하는 것이 효율적입니다.

단계 할 일 판단
① 의존물 목록화 P/Invoke하고 있는 네이티브 DLL, COM 컴포넌트, 동봉된 드라이버, 셸 확장, 네이티브 자산이 포함된 NuGet을 목록화한다 드라이버·셸 확장이 제로라면 유망. 있다면 각 벤더의 Arm64 대응을 확인34
② 에뮬레이션에서의 실기 확인 x64 빌드 그대로 Arm 기기(또는 Arm64 VM)에 설치하여 주요 업무 시나리오를 한 바퀴 돈다 동작하면 「x64 그대로 운용」이 선택지가 됨. 동작하지 않는 부분은 의존물과 아키텍처 불일치를 의심1
③ Arm64 네이티브 빌드 검토 .NET이라면 win-arm64 발행, C++라면 Arm64 구성을 추가하여 빌드가 통과하는지 확인한다 통과하지 않는 원인은 의존 라이브러리의 Arm64판 부재가 전형적. 갱신·교체·Arm64EC 활용을 검토23

4장에서 살펴본 케이스가 어느 단계에서 영향을 미치는지도 대응시켜 둡니다.

4장의 케이스 주로 영향을 미치는 단계 확인 포인트
케이스 1: x64의 exe + x64의 네이티브 DLL ②실기 확인 프로세스 전체가 x64로 통일되어 있으므로, 동작할 가능성이 높음. 확인할 것은 동작 여부보다 속도가 실용 범위인지 여부
케이스 2: COM 인프로세스 서버 ①목록화 → ③의 판단 그 COM DLL을 누가 제공하는가. Arm64X판 제공 예정을 확인하고, 없다면 아웃프로세스 분리를 검토
케이스 3: 플러그인을 호스팅하거나, 호스팅됨 ①목록화(상대 아키텍처) 자사 앱을 Arm64화하면 x64의 서드파티 플러그인을 사용할 수 없게 됨. ③으로 진행하기 전에 영향 범위를 확정

②③을 위한 검증 환경은 다음과 같은 선택지가 있습니다.

  • 실기: Copilot+ PC 등의 Snapdragon 탑재 기기. 1대 있으면 트러블 조사까지 포함해 가장 확실합니다.12
  • Azure VM: Azure 포털에서 이미지를 Arm64로 필터링하여, Windows 11의 Arm64 VM(권장 크기 D2ps_v5 등, Ampere Altra 기반)을 만들 수 있습니다. 수중에 Arm 기기가 한 대도 없어도 검증을 시작할 수 있다는 것이 장점입니다.9
  • 로컬 VM: Windows 11 Arm64의 ISO가 공식 배포되고 있어, Arm 기기의 Hyper-V나 Arm 기반 Apple Silicon Mac 위에서 VM을 만들 수 있습니다. x64 기기의 Hyper-V에서는 Arm64 VM을 만들 수 없다는 점에 주의하시기 바랍니다.10

서드파티 제품의 대응 현황은 Microsoft가 안내하는 대응 현황 사이트(Windows on Arm Ready Software)에서 확인할 수 있습니다. 그 위에서, 자사 개발 업무 앱(LOB)이나 ISV 제작 앱의 호환성 문제에 대해서는 App Assure라는 공식 지원 창구가 있습니다. 「동작하지 않아서 사면초가」에 빠지기 전에 이용할 수 있는 창구가 있다는 것은, 정보시스템 부서에 대한 설명 자료로서도 유효합니다.1215

자사가 대상인지 판단하는 재료를 정리하면 다음과 같습니다.2425

항목 내용
위치 FastTrack 특전의 일부. 대상 Microsoft 365·Windows 플랜에 추가 비용 없이 포함됨
대상 조건 FastTrack의 대상 조건을 따름. 1테넌트당 대상 플랜의 라이선스를 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. 당장의 현실적 해법 ── 3가지 선택지의 구분 사용

Arm 대응은 「전부 네이티브화」 한 가지 방법만 있는 것이 아닙니다. 오히려 많은 업무 앱에서는 단계적인 구분 사용이 현실적인 해법입니다.

선택지 적합한 경우 주의점
(a) x64 그대로 에뮬레이션으로 운용 드라이버·셸 확장 의존이 없고, 성능도 실용상 충분한 경우 Prism(24H2 이후)으로 성능은 이미 개선됨. 프로세스 전체를 x64로 통일하고, Arm64 바이너리를 섞지 않는다15
(b) 벤더의 Arm64 대응을 확인·대기 네이티브 DLL·드라이버가 서드파티 제품인 경우 「Arm64판 DLL(또는 Arm64X판)의 제공 예정」을 확인. 드라이버는 기다리는 것 외에 회피책이 없음323
(c) Arm64 네이티브 빌드 순수 .NET 앱, 또는 의존물의 Arm64판이 갖춰진 경우. 성능·배터리 지속 시간이 요건인 경우 win-arm64 발행 + 모든 네이티브 의존물의 Arm64화가 조건. 플러그인을 호스팅하는 경우 영향 범위에 주의75

C++ 자산이 큰 경우에는 (a)와 (c)의 중간으로 Arm64EC가 있습니다. x64의 의존 DLL은 그대로 둔 채, 자신의 코드만 단계적으로 네이티브화할 수 있기 때문에, 「거대한 x64 앱을 한 번에 이행할 수 없다」는 경우를 위한 공식 경로입니다.523

개발 환경 측면에서는 Visual Studio에 Arm64 네이티브판이 있어, Arm 기기 위에서 Arm64/x64/x86 모두를 타깃으로 할 수 있는 컴파일러 툴셋이 갖춰져 있습니다. CI용 빌드는 기존의 x64 빌드 머신에서의 크로스 컴파일로도 만들 수 있으므로, 「테스트 실행만 Arm 실기/VM으로 몰아주는」구성을 짜기 쉬워졌습니다.2623

8. 정리

  • Arm판 Windows 11은 x86/x64 앱을 OS 내장 에뮬레이션으로 실행할 수 있으며, 24H2 이후에는 Prism으로 성능도 개선되었습니다. x64 에뮬레이션은 Windows 11부터이며, Windows 10 on Arm은 x86뿐입니다.
  • 에뮬레이션의 수비 범위는 사용자 모드뿐입니다. 커널 모드/UMDF/프린터 각 드라이버, 셸 확장·IME·지원 기술 같은 「다른 프로세스에 로드되는 DLL」은 Arm64 네이티브가 필수입니다. 업무 앱의 동작 가능 여부는 앱 본체가 아니라 이러한 주변 의존물로 결정됩니다.
  • 프로세스 내에서 x64와 Arm64는 혼재할 수 없습니다. x64/Arm64EC 프로세스는 x64+Arm64EC를, Arm64 프로세스는 Arm64만을 로드할 수 있습니다. COM 인프로세스 서버도 플러그인도 같은 규칙을 따르며, 양쪽 모두 지원하려면 Arm64X, 프로세스 경계를 넘으려면 아웃프로세스 COM/IPC가 정석입니다.
  • .NET은 win-arm64로 네이티브 발행할 수 있지만, Arm64 런타임 상의 AnyCPU 앱은 Arm64 프로세스로 동작하기 때문에, x64 전용 네이티브 DLL을 P/Invoke하고 있으면 실패합니다. RuntimeInformation.ProcessArchitecture / OSArchitecture(.NET 7 이후)로 원인을 구분합니다.
  • 확인 절차는 「의존물 목록화 → x64 그대로 에뮬레이션으로 실기 확인 → 필요하면 Arm64 네이티브화」의 3단계입니다. 검증 환경은 Azure의 Arm64 VM이나 Arm64 ISO로 준비할 수 있으며, 법인은 App Assure의 지원도 받을 수 있습니다.
  • 당장은 「에뮬레이션으로 동작하면 그대로」「드라이버·DLL 벤더의 대응 확인」「요건에 따라 Arm64 네이티브화(C++는 Arm64EC의 단계적 이행도)」라는 구분 사용이 현실적인 해법입니다.

관련 글

관련 상담 영역

합동회사 코무라소프트에서는 기존 업무 앱의 Arm판 Windows 대응 가능 여부 조사, 네이티브 DLL·COM 연계를 포함한 앱의 아키텍처 이행 설계, 「Arm 기기에서만 동작하지 않는」결함의 원인 분석을 다루고 있습니다.

참고 링크

  1. Microsoft Learn, How emulation works on Arm. 에뮬레이션이 OS에 내장되어 있어 수정 없이 앱을 실행할 수 있다는 점, Windows 11이 x86/x64 양쪽을 지원하고 Windows 10 on Arm은 x86뿐이라는 점, x86 명령 블록의 JIT 변환과 캐시 구조, Windows 11 24H2의 Prism과 Snapdragon용 최적화, 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 드라이버·프린터 드라이버가 OS의 아키텍처와 일치해야 한다는 점, 앱 본체가 에뮬레이션으로 동작하더라도 드라이버 의존 기능은 사용할 수 없다는 점에 대해.  2 3 4 5 6 7

  4. Microsoft Learn, Troubleshooting x86 desktop apps. Windows의 프로세스에 자신의 DLL을 로드시키는 앱(셸 확장·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 앱의 프로세스에 로드되는 OS 코드의 대부분이 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 어느 프로세스에도 로드할 수 있다는 점, 양쪽 아키텍처의 앱에서 호출되는 64bit COM 서버·플러그인·주입 DLL이 Arm64X를 필요로 하는 상황으로 언급되고 있다는 점에 대해.  2 3

  7. Microsoft Learn, .NET RID Catalog. Windows의 RID로 win-arm64가 정의되어 있다는 점, RID가 NuGet 패키지의 플랫폼 고유 자산 분류에 사용된다는 점에 대해.  2 3 4

  8. Microsoft Learn, Windows on Arm. Arm64판 .NET SDK로 실행하면 기본값으로 Arm64로 실행된다는 점, 현재 지원 중인 .NET 8/9/10이 네이티브 Arm64 실행 대상으로 안내되고 있다는 점, 기존의 x64 .NET 앱은 OS의 x64 에뮬레이션으로 동작한다는 점에 대해.  2 3

  9. Microsoft Learn, Quickstart: Create a Windows on Arm virtual machine in the Azure portal. Azure 포털에서 Arm64 이미지를 필터링하여 Windows 11의 Arm64 VM(권장 크기 D2ps_v5, Ampere Altra 기반)을 만들 수 있다는 점에 대해.  2

  10. Microsoft Learn, Windows 11 Arm ISO files overview. Windows 11 Arm64의 ISO가 배포되고 있으며, Arm 기기의 Hyper-V나 Apple Silicon Mac에서 VM을 만들 수 있다는 점, x64 하드웨어의 Hyper-V는 Arm64 VM을 지원하지 않는다는 점에 대해.  2

  11. Microsoft Learn, Develop AI applications for Copilot+ PCs. Copilot+ PC가 초당 40조 회를 넘는 연산(40+ TOPS)이 가능한 NPU를 탑재한 Windows 11 하드웨어의 새로운 카테고리라는 점에 대해. 

  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도 호환성을 위해 에뮬레이트된 값을 반환한다는 점, Arm64 호스트 검출에는 IsWow64Process2나 GetMachineTypeAttributes를 사용한다는 점에 대해. 

  14. Microsoft Learn, Adjust emulation settings on Arm. exe 속성의 호환성 탭에서 Prism의 에뮬레이션 설정(기본/안전/엄격/매우 엄격 프리셋과 개별 설정)을 변경할 수 있다는 점에 대해. 

  15. Microsoft Learn, Arm-based Surface devices FAQ. Arm 디바이스의 제약 사항(드라이버는 Arm용 설계가 필요, 주변기기는 Arm64 드라이버에 좌우됨, OpenGL 3.3 초과나 미지원 안티치트 게임, IME 등 커스터마이징 계열 앱, 백신 소프트웨어의 개별 확인)과, LOB 앱을 포함한 App Assure에 의한 호환성 지원에 대해.  2 3 4

  16. Microsoft Learn, Process Interoperability. 64bit 프로세스가 32bit DLL을(반대도 마찬가지로) 로드할 수 없다는 점, 아웃프로세스 COM 서버와 RPC를 통해 아키텍처 경계를 넘어 통신할 수 있다는 정석에 대해.  2

  17. Microsoft Learn, Install .NET on Windows. Windows 11/10의 Arm64가 .NET 8/9/10의 지원 대상이라는 점, Arm 기기에서는 Arm64판 .NET이 C:\Program Files\dotnet\에, x64판 SDK가 C:\Program Files\dotnet\x64\에 설치되며 PATH나 DOTNET_ROOT의 조정이 필요할 수 있다는 점에 대해.  2

  18. Microsoft Learn, What’s new in .NET Framework. .NET Framework 4.8.1이 Arm64 네이티브 지원을 추가했으며, Arm64 상에서 에뮬레이션 실행되는 x64 코드보다 성능 면에서 유리하다는 점에 대해. 

  19. Microsoft Learn, Develop Apps for Windows IoT Enterprise. .NET Framework 4.8.1의 네이티브 Arm64 지원이 Windows 11용이며, 4.8.1 런타임은 Windows 10 디바이스 상의 네이티브 Arm64 앱을 지원하지 않는다는 점에 대해. 

  20. Microsoft Learn, RuntimeInformation.OSArchitecture under emulation. .NET 7부터 OSArchitecture가 Windows Arm64 상의 에뮬레이션 프로세스에서도 Arm64를 반환하게 되었다는 점(그 이전에는 X64를 반환), 프로세스의 아키텍처에는 ProcessArchitecture를 사용해야 한다는 점에 대해. 

  21. Microsoft Learn, RuntimeInformation.ProcessArchitecture Property / RuntimeInformation.OSArchitecture Property. 실행 중인 프로세스의 아키텍처와 OS 본래의 아키텍처를 가져오는 API에 대해. 

  22. Microsoft Learn, BadImageFormatException Class. 앱의 컴포넌트가 서로 다른 플랫폼을 대상으로 하는 경우(다른 아키텍처의 어셈블리 로드)에 BadImageFormatException이 발생한다는 점에 대해. 

  23. Microsoft Learn, Add Arm support to your Windows app. Arm64 빌드를 가로막는 전형적인 요인(미대응 의존 라이브러리, 아키텍처 고유 코드, 커널 드라이버)과 대처법, x64 의존을 남긴 채 Arm64EC로 재빌드하는 선택지, 테스트용 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의 지원이 1테넌트당 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++ 개발을 할 수 있고, Arm64 호스트에서 Arm64/x64/x86을 타깃으로 하는 MSVC 툴셋이 제공된다는 점에 대해. 

같은 태그를 공유하는 최신 기사입니다. 더 가까운 주제로 지식을 넓힐 수 있습니다.

이 기사와 가까운 토픽 페이지입니다. 기사를 출발점 삼아 관련 서비스와 다른 기사로 이어집니다.

ActiveX 이관

COM / ActiveX / OCX 자산을 유지할지, 감쌀지, 교체할지의 단계적 판단을 정리한 토픽 페이지입니다.

이 기사는 다음 서비스 페이지로 이어집니다. 가까운 입구부터 확인해 주세요.

자주 묻는 질문

이 기사 주제에 대해 상담 시 자주 나오는 질문을 모았습니다.

Arm판 Windows에서 일반적인 x64 업무 앱은 동작합니까?
대부분의 경우 동작합니다. Windows 11 on Arm에는 x86/x64 앱을 수정 없이 실행하는 에뮬레이션 기능이 내장되어 있으며, Windows 11 24H2 이후로는 Prism이라는 새로운 에뮬레이터로 성능도 개선되었습니다. 다만 에뮬레이션이 처리해 주는 것은 사용자 모드 코드뿐이며, 커널 모드 드라이버나 Explorer 등 다른 프로세스에 로드되는 셸 확장·IME 같은 것들은 Arm64 네이티브가 필수입니다. 앱 본체보다 주변 의존물이 결정한다고 생각하시면 됩니다.
x64의 exe에서 Arm64의 DLL을 호출할 수 있습니까?
호출할 수 없습니다. 하나의 프로세스 안에서 x64와 Arm64 바이너리를 혼재시킬 수 없으며, x64(또는 Arm64EC) 프로세스가 로드할 수 있는 것은 x64와 Arm64EC 바이너리, Arm64 프로세스가 로드할 수 있는 것은 Arm64 바이너리뿐입니다. 반대 방향(Arm64의 exe에서 x64의 DLL)도 마찬가지로 불가능합니다. 아무래도 양쪽 모두를 지원하는 하나의 DLL이 필요하다면, Arm64와 Arm64EC 코드를 하나의 파일에 함께 담는 Arm64X라는 형식을 쓰거나, 프로세스를 나누어 IPC로 연계하는 구성을 사용합니다.
.NET 앱을 Arm64에 대응시키려면 무엇이 필요합니까?
.NET 6 이후는 Windows Arm64를 공식 지원하며, 현재 지원 중인 .NET 8/9/10에서는 Windows 11/10의 Arm64가 지원 대상 OS로 명시되어 있습니다. RID(런타임 식별자) win-arm64를 지정해 publish하기만 하면 Arm64 네이티브 실행 파일을 만들 수 있습니다. 순수한 매니지드 코드만으로 이루어진 앱이라면 이것으로 거의 완료지만, P/Invoke하고 있는 네이티브 DLL이나 네이티브 자산을 포함한 NuGet 패키지가 있다면 각각의 Arm64 버전이 존재하는지 확인이 필요합니다. .NET Framework 앱의 경우에는 4.8.1이 Windows 11 상에서의 Arm64 네이티브 실행을 지원합니다.
Arm판 Windows에서 동작하지 않는 것은 어떤 소프트웨어입니까?
커널 모드 드라이버를 포함한 소프트웨어가 대표적입니다. 드라이버는 에뮬레이션되지 않기 때문에, VPN 클라이언트, 보안 제품, 가상 디바이스, USB 동글 인증 등은 Arm64 드라이버가 없으면 동작하지 않습니다. 다음으로 셸 확장·IME·지원 기술처럼 OS 쪽 프로세스에 DLL을 로드시키는 소프트웨어, 동적 코드 생성을 금지한 앱, 오래된 OpenGL이나 안티치트 드라이버에 의존하는 게임 등이 해당합니다. 주변기기도 Arm64 드라이버의 유무에 따라 사용 가능 여부가 결정됩니다.

저자 프로필

기사 저자의 프로필 페이지입니다.

Go Komura

합동회사 코무라소프트 대표

Windows 소프트웨어 개발, 기술 상담, 장애 조사를 중심으로 재현이 어려운 장애 조사와 기존 자산이 남아 있는 프로젝트에 강점이 있습니다.

블로그 목록으로 돌아가기