Laufen Business-Anwendungen unter Windows on Arm? ── Die Realität von x64-Emulation (Prism) und nativen DLLs/COM
· Go Komura · Windows on Arm, Arm64, x64-Emulation, Native Interoperabilität, P/Invoke, COM, Treiber, C#, .NET, Windows-Entwicklung, Technische Beratung
„Ab nächstem Monat wechseln wir auf einen neuen PC, einen dieser Copilot+-PCs – läuft unser Geschäftssystem darauf?“ Mit der zunehmenden Verbreitung von Snapdragon-basierten PCs in Unternehmen erreicht diese Frage immer mehr Entwicklungsteams und IT-Abteilungen. Die Marketing-Aussage lautet: „Bestehende Anwendungen laufen ebenfalls, per Emulation.“ Doch die eigene Business-Anwendung ruft hinter ihrer C#-Oberfläche per P/Invoke eine vom Hersteller gelieferte native DLL auf, erzeugt Berichte über eine COM-Komponente und hat obendrein einen Treiber für dedizierte Hardware installiert. Ehrlich gesagt lässt sich „läuft das?“ nicht aus dem Stegreif beantworten.
Die kurze Antwort vorweg: „Die Anwendung selbst läuft in der Regel problemlos. Gefährlich ist alles, was an ihr hängt.“ Die Emulation von Windows 11 verarbeitet x86/x64-Code im Benutzermodus mit ziemlich beeindruckender Genauigkeit, doch es gibt eine klar umrissene Zone „außerhalb der Zuständigkeit der Emulation“, bestehend aus Treibern, Shell-Erweiterungen und der Vermischung von Architekturen innerhalb eines Prozesses – und ausgerechnet diese Zone ist genau der Ort, an dem sich Business-Anwendungen historisch besonders gerne aufgehalten haben.
Dieser Artikel arbeitet auf, wie die Emulation von Windows on Arm funktioniert und wo ihre Grenzen liegen, welche grundlegende Regel besagt, dass sich x64 und Arm64 innerhalb eines Prozesses nicht mischen lassen, welches Kombinationsproblem speziell .NET-Anwendungen betrifft, und welche praktischen Schritte zur Prüfung von „läuft unsere Anwendung auf einer Arm-Maschine“ führen – alles gestützt auf das, was sich in Microsoft Learn nachprüfen lässt.
1. Das Wichtigste zuerst
- Eine rein verwaltete (.NET-)Anwendung oder eine gewöhnliche x86/x64-Desktopanwendung läuft unter der Emulation von Arm Windows 11 fast durchweg problemlos. Die Emulation ist im Betriebssystem eingebaut – es ist weder eine Anpassung der Anwendung noch eine zusätzliche Komponente nötig.1
- Die Emulation kümmert sich ausschließlich um Code im Benutzermodus. Kernelmodus-Treiber werden nicht emuliert und benötigen unbedingt native Arm64-Builds. UMDF-Treiber und Druckertreiber müssen ebenso zur Architektur des Betriebssystems passen.23
- Shell-Erweiterungen, IMEs, assistive Technologien – alles, was eine „in einen anderen Prozess geladene DLL“ ist (Explorer und Ähnliches) – muss ebenfalls passend zum System für Arm64 neu kompiliert werden. Die Emulation kann hier nicht helfen.4
- x64 und Arm64 können nicht innerhalb eines einzigen Prozesses koexistieren. Ein x64-/Arm64EC-Prozess kann nur x64- und Arm64EC-Binärdateien laden; ein Arm64-Prozess nur Arm64-Binärdateien. Eine x64-EXE kann keine Arm64-DLL aufrufen, und umgekehrt geht es ebenso wenig.5
- Die Mechanismen, um diese Beschränkung innerhalb einer einzelnen Datei zu umgehen, sind Arm64EC (nativer Arm64-Code, der im selben Prozess mit x64 koexistieren kann) und Arm64X (eine Binärdatei, in der Arm64- und Arm64EC-Code in einer PE-Datei koexistieren und die in beide Prozesstypen geladen werden kann). Arm64X ist genau der Ort, an dem ein COM-In-Process-Server oder ein Plugin, das von beiden Architekturen aus aufgerufen wird, ins Spiel kommt.56
- .NET unterstützt Arm64 offiziell, und Sie können nativ mit der RID
win-arm64veröffentlichen. Andererseits läuft eine AnyCPU-Anwendung auf einer Arm64-.NET-Laufzeit als Arm64-Prozess, sodass das Laden fehlschlägt, wenn Sie per P/Invoke eine native DLL ansprechen, die nur als x64 verfügbar ist – ein Kombinationsproblem, das man kennen sollte.785 - Neben physischer Hardware (etwa einem Copilot+-PC) lässt sich eine Testumgebung mit einer Windows-11-Arm64-VM auf Azure oder dem Windows-11-Arm64-ISO einrichten, nutzbar auf Hyper-V auf einer Arm-Maschine oder auf einem Apple-Silicon-Mac. Beachten Sie, dass Sie auf Hyper-V unter einer x64-Maschine keine Arm64-VM erstellen können.910
2. Was Windows on Arm ist — Snapdragon-PCs und Prism
Windows on Arm ist Windows, das auf einem Arm64-Prozessor läuft. Seit 2024 setzen die meisten „Copilot+-PCs“ – eine neue Kategorie von Windows-11-Geräten mit einer NPU, die mehr als 40 Billionen Operationen pro Sekunde (40+ TOPS) leistet – auf Arm-basierte Chips der Snapdragon-X-Serie, wodurch dieses Thema für Entwicklerinnen und Entwickler nicht mehr zu ignorieren ist.1112
Grundlage der Kompatibilität mit bestehenden Anwendungen ist eine im Betriebssystem eingebaute Emulation. Hier eine kurze Erklärung, wie sie funktioniert.1
- Der Emulator kompiliert Blöcke von x86/x64-Befehlen per JIT in Arm64-Befehle und zwischenspeichert das übersetzte Ergebnis pro Modul, sodass spätere Starts schneller ablaufen.
- Windows 11 kann sowohl x86 als auch x64 emulieren. Windows 10 on Arm kann nur x86 emulieren, sodass jede Diskussion über x64-Business-Anwendungen faktisch Windows 11 voraussetzt.
- Windows 11 24H2 führte einen neuen Emulator namens Prism ein, der gegenüber dem vorherigen die Leistung verbessert und die CPU-Auslastung senkt. Prism ist auf Qualcomm-Snapdragon-Chips optimiert.
- 32-Bit-Anwendungen (x86) laufen über dieselbe WOW64-Schicht wie unter x64-Windows und erhalten eine Umleitung von Dateisystem und Registrierung. x64-Anwendungen hingegen haben keine WOW64-Schicht – da Systembinärdateien im weiter unten beschriebenen Arm64X-Format kompiliert sind, können x64-Anwendungen ohne Umleitung auf das gesamte Betriebssystem zugreifen (sowohl Dateisystem als auch Registrierung).1
Die von einer unter Emulation laufenden Anwendung sichtbaren CPU-Informationen sind die des „emulierten virtuellen Prozessors“. Aus Kompatibilitätsgründen gibt selbst GetNativeSystemInfo den emulierten Wert zurück; möchten Sie feststellen, ob der Host tatsächlich Arm64 ist, verwenden Sie IsWow64Process2 oder GetMachineTypeAttributes.13
Für Anwendungen, die unter der Emulation Probleme bekommen, bietet Windows außerdem die Möglichkeit, Emulationseinstellungen zu ändern (Voreinstellungen Standard/sicher/streng/sehr streng sowie einzelne feingranulare Optionen), indem Sie mit der rechten Maustaste auf die EXE klicken, zu Eigenschaften gehen und den Reiter Kompatibilität öffnen. Das erkauft Kompatibilität mit etwas Leistung, ist aber als Notausgang für den Fall „das lief unter einer älteren Version von Windows on Arm noch“ einen Blick wert.14
3. Was unter Emulation läuft — und was nicht
Die Antwort auf „läuft das?“ bestimmt nicht die Anwendung selbst, sondern die Art der beteiligten Abhängigkeit. Hier eine Entscheidungstabelle.
| Kategorie | Verhalten unter Arm Windows 11 | Grundlage/Anmerkungen |
|---|---|---|
| x86/x64-Anwendung im Benutzermodus (eine EXE plus ein vollständiger Satz gleicharchitektonischer DLLs) | Läuft unter Emulation | Unverändert, keine zusätzliche Installation nötig1 |
| .NET-(verwaltete) Anwendung | Läuft (native Arm64-Ausführung ist ebenfalls möglich) | Siehe Kapitel 58 |
| Kernelmodus-Treiber | Läuft nicht. Erfordert nativ Arm64 | Im Kernel gibt es keine Emulation23 |
| UMDF-Treiber / Druckertreiber | Erfordert dasselbe Arm64 wie das Betriebssystem | Selbst wenn die Anwendung selbst unter Emulation läuft, funktionieren treiberabhängige Funktionen nicht3 |
| Shell-Erweiterung / IME / assistive Technologie (eine in einen anderen Prozess geladene DLL) | Erfordert eine Arm64-Neukompilierung | Explorer-Rechtsklickmenüs, Cloud-Speicher-Symbolüberlagerungen und Ähnliches4 |
| x86-Anwendungen, die dynamische Codeerzeugung verbieten | Laufen nicht unter Emulation | Der Emulator erzeugt zur Laufzeit Arm64-Befehle, daher muss ProcessDynamicCodePolicy gelockert werden4 |
| Spiele, die von älterem OpenGL oder Anti-Cheat-Treibern abhängen | Laufen unter Umständen nicht | OpenGL über 3.3 hinaus oder Anti-Cheat ohne Arm-Unterstützung sind Hindernisse15 |
| Peripheriegeräte (Drucker, Scanner, dedizierte Geräte) | Hängt davon ab, ob ein Arm64-Treiber existiert | Erfordert einen Arm64-Treiber, entweder im Betriebssystem enthalten oder vom Hersteller geliefert15 |
| Antivirensoftware und „Software, die das Verhalten von Windows verändert“ | Erfordert eine produktspezifische Prüfung | Die Arm-Unterstützung ist weit vorangeschritten, dennoch wird eine Prüfung je Produkt empfohlen15 |
Übersetzt in die Begriffswelt von Business-Anwendungen sehen die Warnsignale so aus:
- VPN-Clients, Asset-Management-Agenten, Sicherheitsprodukte – das sind im Wesentlichen Bündel von Kernel-Treibern. Sie müssen beim Hersteller prüfen, ob eine Arm64-unterstützte Version existiert.
- Lizenzdurchsetzung über USB-Dongles, dedizierte Hardware (Messgeräte, Zahlungsterminals usw.) – ob ein Arm64-Gerätetreiber bereitgestellt wird, ist hier der entscheidende Faktor.
- Tools, die „dem Explorer eine Funktion hinzufügen“ – Shell-Erweiterungen werden in den Arm64-Explorer geladen, sodass sie schlicht nicht funktionieren, solange sie x64 bleiben.
- Auch wenn die Anwendung selbst nicht in diese Kategorien fällt, tritt dasselbe Problem auf, wenn der Installer einen Treiber mitbringt (etwa eine über einen virtuellen Druckertreiber realisierte PDF-Ausgabe).
4. Das Mischen von Architekturen innerhalb eines Prozesses ist unmöglich — die Realität von P/Invoke und COM
Seit der 32-Bit-Ära gilt eine eiserne Regel: „Ein 64-Bit-Prozess kann keine 32-Bit-DLL laden.“16 Windows on Arm besitzt eine äquivalente strukturelle Regel. Die offizielle Dokumentation legt die Ladekompatibilität wie folgt dar.5
| Prozessarchitektur | x64-DLL | Arm64EC-DLL | Arm64-DLL | Arm64X-DLL |
|---|---|---|---|---|
| x64-/Arm64EC-Prozess | Ladbar | Ladbar | Nicht ladbar | Ladbar |
| Arm64-Prozess | Nicht ladbar | Nicht ladbar | Ladbar | Ladbar |
Hier tauchen zwei Mechanismen auf, die der Schlüssel zum Durchdenken des Arm-Bereitschafts-Designs sind.
- Arm64EC (Emulation Compatible) ist eine native Arm64-Code-ABI, die der Aufrufkonvention, Stack-Nutzung und dem Datenlayout von x64 folgt, sodass sie im selben Prozess mit unter Emulation laufendem x64-Code koexistieren kann. Läuft eine x64-Anwendung unter Windows 11 on Arm, ist der Großteil des in diesen Prozess geladenen Betriebssystemcodes bereits als Arm64EC kompiliert und läuft mit nativer Geschwindigkeit, ohne dass die Anwendung davon etwas mitbekommt. Das ermöglicht einen schrittweisen Migrationspfad – zunächst nur den eigenen Code Stück für Stück in Arm64EC umzuwandeln, um Leistung zu gewinnen, während abhängige DLLs x64 bleiben.5
- Arm64X ist ein Binärformat, das klassischen Arm64-Code und Arm64EC-Code in einer einzigen PE-Datei koexistieren lässt. Je nachdem, ob der ladende Prozess x64 oder Arm64 ist, verhält es sich wie eine x64-DLL beziehungsweise eine Arm64-DLL, was es gut geeignet macht für eine DLL, die möglicherweise von Prozessen beider Architekturen aufgerufen wird. Die offizielle Dokumentation nennt „einen 64-Bit-COM-Server, der sowohl von x64- als auch von Arm64-Anwendungen aufgerufen wird“, „ein Plugin, das sowohl in x64- als auch in Arm64-Anwendungen geladen wird“ und „eine einzelne Binärdatei, die in x64-/Arm64-Prozesse injiziert wird“ als Situationen, in denen Arm64X benötigt wird.6
Machen wir die realen Auswirkungen auf Business-Anwendungen konkret.
Fall 1: eine x64-EXE plus eine native x64-DLL (P/Invoke). Ist der gesamte Prozess einheitlich x64, läuft er vollständig innerhalb der Emulation. Sie können nicht einfach deshalb eine Arm64-DLL beimischen, weil „nur dieser eine Teil“ schneller sein soll (wie die obige Tabelle zeigt, ist das schlicht nicht ladbar).
Fall 2: ein COM-In-Process-Server. Ein COM-In-Proc-Server ist einfach eine DLL, sodass die obige Tabelle direkt gilt. Ein x64-Client kann nur eine x64- (oder Arm64EC-/Arm64X-)COM-DLL verwenden, und sobald Sie die Anwendung Arm64-nativ machen, wird die x64-COM-DLL nicht mehr ladbar. Benötigen Sie Unterstützung für beides, machen Sie die DLL entweder Arm64X, oder wenden Sie das bewährte Muster aus der 32-Bit-/64-Bit-Ära an: die Trennung in Prozess-externes COM/IPC (Aufteilung in separate, über Interprozesskommunikation verbundene Prozesse). Eine Architekturgrenze an einer Prozessgrenze zu überschreiten, war schon immer der Standardansatz.166
Fall 3: Sie hosten ein Plugin oder sind selbst ein Plugin. Excel-Add-ins, Plugins für Business-Paketsoftware, Druck-Middleware und jede andere Form, bei der „Ihre DLL in den Prozess einer anderen Anwendung geladen wird“, muss zur Architektur des Gegenübers passen. Umgekehrt müssen Sie, wenn Ihre eigene Anwendung Plugins hostet, den Wirkungsradius durchdenken: Machen Sie Ihre eigene Anwendung Arm64-nativ, fallen sämtliche x64-Plugins Dritter aus.
Übrigens können Sie über eine Developer Command Prompt prüfen, welche Architektur eine bestimmte Binärdatei tatsächlich hat.5
link /dump /headers MyLibrary.dll | findstr machine
# 8664 machine (x64) -> x64
# 8664 machine (x64) (ARM64X) -> enthält Arm64EC
# AA64 machine (ARM64) -> Arm64
# AA64 machine (ARM64) (ARM64X) -> Arm64X
5. Der Fall von .NET-Anwendungen — die AnyCPU-Falle und die Architekturerkennung
.NET (die Core-Familie der Laufzeit) unterstützt Windows Arm64 offiziell, und Windows 11/10 Arm64 wird für .NET 8/9/10 ausdrücklich als unterstütztes Betriebssystem aufgeführt. Für die Veröffentlichung genügt es, win-arm64 als RID anzugeben.177
<!-- csproj: Veröffentlichung für nativ Arm64 -->
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<RuntimeIdentifiers>win-x64;win-arm64</RuntimeIdentifiers>
</PropertyGroup>
dotnet publish -r win-arm64 -c Release
Für eine Anwendung, die vollständig aus verwaltetem Code besteht, ist das im Wesentlichen die gesamte Arbeit, um sie Arm64-nativ zu machen. Der JIT erzeugt einfach Arm64-Code, und in der Regel sind keine Quellcodeänderungen nötig. Für .NET-Framework-Anwendungen hat .NET Framework 4.8.1 native Arm64-Unterstützung hinzugefügt (für Arm64-Maschinen unter Windows 11 – die 4.8.1-Laufzeit unterstützt native Arm64-Anwendungen auf Windows-10-Arm-Maschinen nicht). Eine Framework-Anwendung, die weiterhin als x64 gebaut wird, gilt als unter Emulation laufend.1819
Das Problem ist die Kombination, die entsteht, wenn Sie per P/Invoke eine native DLL ansprechen. Auf einer Arm-Maschine wird die lang gehegte Annahme „es ist eine .NET-Anwendung, also läuft AnyCPU einfach überall“ enttäuscht.
- Läuft die Anwendung unter einem Arm64-.NET-SDK/einer Arm64-.NET-Laufzeit, läuft sie standardmäßig als Arm64-Prozess.8
- Ein Arm64-Prozess kann keine x64-DLL laden (siehe die Tabelle in Kapitel 4). Mit anderen Worten: Ihr eigener AnyCPU-Code bleibt unangetastet, aber das Laden der per
DllImportangesprochenen x64-nativen DLL schlägt fehl.5 - Umgekehrt läuft eine als
win-x64veröffentlichte Anwendung vollständig als x64-Prozess und funktioniert innerhalb der Emulation (samt nativer DLL). Diese Konfiguration erreicht keine native Arm64-Leistung, bietet aber die höchste Kompatibilität.12
Was wie „mal geht’s, mal nicht“ aussieht, ist meistens tatsächlich eine Nichtübereinstimmung zwischen der Architektur des Prozesses und der Architektur seiner nativen Abhängigkeiten. Als erster Schritt zur Eingrenzung hilft es enorm, Code zur Hand zu haben, der meldet, welche Architektur der laufende Prozess tatsächlich verwendet.
using System.Runtime.InteropServices;
// Die eigene Architektur des Prozesses (X64, falls unter x64-Emulation laufend)
Console.WriteLine($"Process: {RuntimeInformation.ProcessArchitecture}");
// Die tatsächliche zugrunde liegende Architektur des Betriebssystems (Arm64 auf einer Arm-Maschine)
Console.WriteLine($"OS: {RuntimeInformation.OSArchitecture}");
Ein Punkt, auf den Sie achten sollten: OSArchitecture liefert erst ab .NET 7 die „tatsächliche, um die Emulation bereinigte zugrunde liegende Betriebssystemarchitektur“. Davor gab es auch unter Emulation X64 zurück, sodass Code unter .NET 6 oder früher, der diese API zur Erkennung von „ist dies eine Arm-Maschine?“ verwendet, nicht wie erwartet funktioniert.2021
Hier eine Übersicht der .NET-spezifischen Prüfpunkte.
- Native Assets in NuGet-Paketen: Ein Paket, das nur
runtimes/win-x64/nativemitführt, hat nichts, worauf es beim Veröffentlichen fürwin-arm64zurückgreifen kann. Prüfen Sie den Paketinhalt (oder dessen Repository) auf das Vorhandensein vonwin-arm64-Assets. Der RID-Mechanismus existiert genau für dieses „Routing zu plattformspezifischen Assets“.7 - Das SDK-Layout auf der Entwicklungsmaschine: Auf einer Arm-Maschine installiert sich der Arm64-Build von .NET normalerweise unter
C:\Program Files\dotnet\, während sich das x64-SDK unterC:\Program Files\dotnet\x64\installiert; beide können koexistieren. Welches davondotnet runtatsächlich ausführt, hängt davon ab, wohin PATH oder DOTNET_ROOT zeigen – behalten Sie das beim Testen im Hinterkopf.17 - Wie Sie die Ausnahme lesen: Eine Architektur-Nichtübereinstimmung in einer verwalteten Assembly zeigt sich als
BadImageFormatException(die offizielle Referenz selbst nennt ausdrücklich „das Laden einer Komponente, die auf eine andere Plattform abzielt“ als Auslösebedingung).22
6. Eine Checkliste zur Arm-Bereitschaft der eigenen Anwendung
In der Praxis ist es effizient, in folgenden drei Stufen zu prüfen.
| Stufe | Was zu tun ist | Beurteilung |
|---|---|---|
| 1. Abhängigkeiten inventarisieren | Jede per P/Invoke angesprochene native DLL, COM-Komponente, mitgelieferten Treiber, Shell-Erweiterung und jedes NuGet-Paket mit nativen Assets auflisten | Null Treiber oder Shell-Erweiterungen ist vielversprechend. Gibt es welche, die Arm64-Unterstützung jedes Herstellers prüfen34 |
| 2. Auf echter Hardware unter Emulation testen | Die Anwendung unverändert (weiterhin als x64-Build) auf einer Arm-Maschine (oder einer Arm64-VM) installieren und die wichtigsten Geschäftsszenarien durchspielen | Funktioniert es, wird „weiterhin als x64 laufen lassen“ zu einer tragfähigen Option. Bei Fehlschlägen eine Architektur-Nichtübereinstimmung in einer Abhängigkeit vermuten1 |
| 3. Einen nativen Arm64-Build erwägen | Bei .NET für win-arm64 veröffentlichen; bei C++ eine Arm64-Konfiguration hinzufügen und prüfen, ob der Build gelingt |
Ein Build-Fehlschlag bedeutet in der Regel, dass eine Abhängigkeit keine Arm64-Version hat. Aktualisierung, Ersatz oder ein Ausweichen auf Arm64EC erwägen23 |
Für die Stufen 2 und 3 stehen Ihnen folgende Optionen für eine Testumgebung zur Verfügung.
- Physische Hardware: eine Snapdragon-basierte Maschine wie ein Copilot+-PC. Auch nur eine davon zur Hand zu haben, ist die verlässlichste Option, auch für die Fehlersuche.12
- Azure-VM: Im Azure-Portal Images nach Arm64 filtern und eine Windows-11-Arm64-VM erstellen (eine empfohlene Größe wie D2ps_v5, basierend auf Ampere Altra). Der Vorteil: Sie können mit dem Testen beginnen, ohne selbst eine einzige Arm-Maschine zu besitzen.9
- Lokale VM: Ein Windows-11-Arm64-ISO wird offiziell verteilt, und Sie können eine VM auf Hyper-V auf einer Arm-Maschine oder auf einem Arm-basierten Apple-Silicon-Mac aufbauen. Beachten Sie: Hyper-V auf einer x64-Maschine kann keine Arm64-VM erstellen.10
Die Kompatibilität von Drittanbieterprodukten können Sie auf der von Microsoft veröffentlichten Statusseite prüfen (Works on Windows on Arm), und bei Kompatibilitätsproblemen von Fachanwendungen (LOB-Apps) bietet das Programm App Assure für qualifizierende Unternehmenspläne kostenlosen zusätzlichen Support. Einen offiziellen Kanal zur Hand zu haben, bevor Sie bei „es funktioniert nicht und wir kommen nicht weiter“ landen, ist auch nützliches Material, um die Lage gegenüber der IT-Abteilung zu erklären.1215
7. Eine pragmatische Antwort für den Moment — die Wahl zwischen drei Optionen
Arm-bereit zu sein bedeutet nicht „vollständig nativ, keine andere Wahl“. Tatsächlich ist für viele Business-Anwendungen ein gestuftes, situationsabhängiges Vorgehen die pragmatische Antwort.
| Option | Gut geeignet für | Vorbehalte |
|---|---|---|
| (a) Weiterhin als x64 unter Emulation laufen lassen | Keine Abhängigkeit von Treibern/Shell-Erweiterungen, und die Leistung reicht in der Praxis bereits aus | Prism (24H2+) hat die Leistung bereits verbessert. Den gesamten Prozess einheitlich x64 halten – keine Arm64-Binärdateien beimischen15 |
| (b) Bei Herstellern die Arm64-Unterstützung erfragen oder abwarten | Die betreffende native DLL/der Treiber stammt von einem Drittanbieter | Klären, ob eine „Arm64- (oder Arm64X-)Version geplant ist“. Bei Treibern gibt es außer Abwarten keinen Workaround323 |
| (c) Nativ Arm64 bauen | Eine reine .NET-Anwendung, oder ein Fall, in dem Arm64-Versionen sämtlicher Abhängigkeiten bereits verfügbar sind. Wenn Leistung oder Akkulaufzeit gefordert sind | Erfordert eine Veröffentlichung für win-arm64 sowie die Arm64-Umstellung jeder nativen Abhängigkeit. Hosten Sie Plugins, den Wirkungsradius im Blick behalten75 |
Wenn Sie über eine große C++-Codebasis verfügen, gibt es zwischen (a) und (c) einen Mittelweg: Arm64EC. Es ist der offizielle Weg für den Fall, dass „wir eine riesige x64-Anwendung nicht auf einen Schlag migrieren können“ – Sie lassen abhängige x64-DLLs unverändert, während Sie nur Ihren eigenen Code Stück für Stück nativ portieren.523
Auf der Werkzeugseite gibt es eine native Arm64-Version von Visual Studio sowie ein auf Arm-Hardware verfügbares Compiler-Toolset, das gleichzeitig Arm64, x64 und x86 als Ziel adressieren kann. CI-Builds lassen sich auch per Cross-Compilation auf einer bestehenden x64-Build-Maschine erzeugen, sodass sich leicht eine Konfiguration einrichten lässt, bei der „nur der Testlauf“ auf echter Arm-Hardware oder einer VM stattfindet.2423
8. Zusammenfassung
- Arm Windows 11 kann x86/x64-Anwendungen über eine im Betriebssystem eingebaute Emulation ausführen, und die Leistung hat sich mit Prism ab 24H2 weiter verbessert. Die x64-Emulation ist eine Funktion von Windows 11 – Windows 10 on Arm verarbeitet nur x86.
- Die Zuständigkeit der Emulation beschränkt sich auf den Benutzermodus. Kernelmodus-/UMDF-/Druckertreiber sowie „in einen anderen Prozess geladene DLLs“ wie Shell-Erweiterungen, IMEs und assistive Technologien benötigen unbedingt native Arm64-Builds. Ob eine Business-Anwendung funktioniert, bestimmt weniger die Anwendung selbst als diese umgebenden Abhängigkeiten.
- x64 und Arm64 können nicht innerhalb eines Prozesses koexistieren. Ein x64-/Arm64EC-Prozess kann x64 plus Arm64EC laden; ein Arm64-Prozess nur Arm64. Sowohl COM-In-Process-Server als auch Plugins folgen derselben Regel – Arm64X ist die Standardantwort für die Unterstützung beider Architekturen, und Prozess-externes COM/IPC ist die Standardantwort für das Überschreiten einer Prozessgrenze.
- .NET kann nativ mit
win-arm64veröffentlicht werden, doch eine AnyCPU-Anwendung, die auf der Arm64-Laufzeit läuft, läuft als Arm64-Prozess und schlägt daher fehl, wenn sie per P/Invoke eine nur als x64 verfügbare native DLL anspricht. Zur Eingrenzung dienenRuntimeInformation.ProcessArchitecture/OSArchitecture(Letzteres ab .NET 7). - Das Verifikationsverfahren ist ein dreistufiger Ablauf: „Abhängigkeiten inventarisieren -> unverändert unter Emulation auf echter Hardware testen -> bei Bedarf nativ Arm64 werden.“ Eine Testumgebung lässt sich über eine Azure-Arm64-VM oder das Arm64-ISO einrichten, und Unternehmen können zusätzlich auf den Support von App Assure zurückgreifen.
- Für den Moment lautet die pragmatische Antwort ein situationsabhängiger Mix: „läuft es unter Emulation, unverändert belassen“, „bei Treiber-/DLL-Herstellern den Unterstützungsstatus erfragen“ und „bei entsprechenden Anforderungen nativ Arm64 werden (bei C++ ist auch der gestufte Arm64EC-Migrationspfad möglich)“.
Verwandte Artikel
- Eine native DLL aus C# aufrufen: C++/CLI-Wrapper vs. P/Invoke
- Die Win32-API sicher aus C# aufrufen — ein praktischer P/Invoke-Leitfaden (DllImport / LibraryImport / CsWin32)
- Wie man eine C#-Native-AOT-DLL aus C/C++ aufruft
- Single-File-Distribution für Windows-Anwendungen — Einzelbinärdateien und die Grenzen von OS-Abhängigkeiten
- Ein durchgerechnetes COM-Brücken-Beispiel: eine 64-Bit-DLL aus einer 32-Bit-Anwendung aufrufen
Verwandte Beratungsleistungen
Komura Software LLC übernimmt die Untersuchung, ob eine bestehende Business-Anwendung Arm-bereit ist, den Entwurf von Architekturmigrationen für Anwendungen mit nativen DLLs oder COM-Interop sowie die Ursachenanalyse von Fehlern, die nur auf Arm-Maschinen auftreten.
- Windows-App-Entwicklung
- Technische Beratung und Design-Review
- Fehleranalyse und Ursachenermittlung
- Kontakt
Referenzlinks
-
Microsoft Learn, How emulation works on Arm. Dazu, dass die Emulation im Betriebssystem eingebaut ist und unveränderte Anwendungen ausführen kann, dass Windows 11 sowohl x86 als auch x64 unterstützt, während Windows 10 on Arm nur x86 unterstützt, zur JIT-Übersetzung und modulweisen Zwischenspeicherung von x86-Befehlsblöcken, zu Prism und seiner Snapdragon-Optimierung in Windows 11 24H2, sowie dazu, dass x86-Anwendungen über WOW64 umgeleitet werden, während x64-Anwendungen keine WOW64-Schicht besitzen und stattdessen als Arm64X kompilierte Systembinärdateien nutzen. ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Microsoft Learn, How emulation works on Arm. Dazu, dass die Emulation nur Code im Benutzermodus unterstützt, keine Treiber, und dass Kernelmodus-Komponenten als Arm64 kompiliert werden müssen. ↩ ↩2
-
Microsoft Learn, Troubleshooting x86 desktop apps. Dazu, dass jeder Kernelmodus-Treiber, UMDF-Treiber und Druckertreiber zur Architektur des Betriebssystems passen muss, und dass treiberabhängige Funktionen unbenutzbar bleiben, selbst wenn die Anwendung selbst unter Emulation läuft. ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, Troubleshooting x86 desktop apps. Dazu, dass Anwendungen, die ihre eigene DLL in einen Windows-Prozess laden (Shell-Erweiterungen, IMEs, assistive Technologien), passend zur Architektur des Systems (Arm64) neu kompiliert werden müssen, und dass x86-Anwendungen, die dynamische Codeerzeugung untersagen, nicht unter Emulation laufen können. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Arm64EC - Build and port apps for native performance on Arm. Zur Interoperabilitätstabelle, die zeigt, dass x64-/Arm64EC-Prozesse x64- und Arm64EC-Binärdateien laden können, während Arm64-Prozesse nur Arm64-Binärdateien laden können, dazu, dass Arm64EC den Software-Konventionen von x64 folgt und daher im selben Prozess mit x64-Code koexistieren kann, dass der größte Teil des in den Prozess einer x64-Anwendung geladenen Betriebssystemcodes bereits Arm64EC ist, sowie dazu, wie sich der Typ einer Binärdatei mit link /dump /headers prüfen lässt. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10
-
Microsoft Learn, Arm64X PE files. Dazu, dass Arm64X Arm64- und Arm64EC-Code in einer einzigen PE-Datei koexistieren lässt und sowohl in einen x64- als auch in einen Arm64-Prozess geladen werden kann, sowie dazu, dass 64-Bit-COM-Server/Plugins/injizierte DLLs, die von Anwendungen beider Architekturen aufgerufen werden, als Situationen genannt werden, die Arm64X erfordern. ↩ ↩2 ↩3
-
Microsoft Learn, .NET RID Catalog. Dazu, dass win-arm64 als Windows-RID definiert ist, sowie dazu, dass RIDs verwendet werden, um plattformspezifische Assets in NuGet-Paketen zu routen. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Windows on Arm. Dazu, dass die Ausführung unter einem Arm64-.NET-SDK standardmäßig als Arm64 erfolgt, dass .NET 8 und neuer native Arm64-Ausführung unterstützen, sowie dazu, dass bestehende x64-.NET-Anwendungen unter der x64-Emulation des Betriebssystems laufen. ↩ ↩2 ↩3
-
Microsoft Learn, Quickstart: Create a Windows on Arm virtual machine in the Azure portal. Dazu, dass sich im Azure-Portal nach einem Arm64-Image filtern und eine Windows-11-Arm64-VM erstellen lässt (eine empfohlene Größe wie D2ps_v5, basierend auf Ampere Altra). ↩ ↩2
-
Microsoft Learn, Windows 11 Arm ISO files overview. Dazu, dass das Windows-11-Arm64-ISO verteilt wird, dass sich eine VM auf Hyper-V auf einer Arm-Maschine oder auf einem Apple-Silicon-Mac erstellen lässt, sowie dazu, dass Hyper-V auf x64-Hardware keine Arm64-VM unterstützt. ↩ ↩2
-
Microsoft Learn, Develop AI applications for Copilot+ PCs. Dazu, dass Copilot+-PCs eine neue Kategorie von Windows-11-Hardware mit einer NPU sind, die mehr als 40 Billionen Operationen pro Sekunde (40+ TOPS) leistet. ↩
-
Microsoft Learn, Windows on Arm. Dazu, dass Windows 10 x86 unterstützt und Windows 11 unveränderte x64-Ausführung hinzufügt, dass die meisten Copilot+-PCs die Snapdragon-X-Serie einsetzen, sowie zur Existenz der Kompatibilitätsstatusseite (Works on Windows on Arm) und des App-Assure-Arm-Beratungsdienstes. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, How emulation works on Arm - Detecting emulation. Dazu, dass eine unter Emulation laufende Anwendung Informationen über den emulierten virtuellen Prozessor sieht, dass GetNativeSystemInfo aus Kompatibilitätsgründen ebenfalls den emulierten Wert zurückgibt, sowie dazu, IsWow64Process2 oder GetMachineTypeAttributes zu verwenden, um einen Arm64-Host zu erkennen. ↩
-
Microsoft Learn, Adjust emulation settings on Arm. Dazu, dass sich die Emulationseinstellungen von Prism (Voreinstellungen Standard/sicher/streng/sehr streng sowie Einzeleinstellungen) über den Reiter Kompatibilität der EXE-Eigenschaften ändern lassen. ↩
-
Microsoft Learn, Arm-based Surface devices FAQ. Zu den Einschränkungen von Arm-Geräten (Treiber müssen für Arm ausgelegt sein, Peripheriegeräte hängen von Arm64-Treibern ab, Spiele, die OpenGL über 3.3 hinaus oder nicht unterstütztes Anti-Cheat benötigen, anpassungsartige Anwendungen wie IMEs sowie produktspezifische Prüfung bei Antivirensoftware), sowie zur Kompatibilitätsunterstützung über App Assure, einschließlich für LOB-Anwendungen. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Process Interoperability. Dazu, dass ein 64-Bit-Prozess keine 32-Bit-DLL laden kann (und umgekehrt), sowie zum Standardmuster, einen Prozess-externen COM-Server und RPC zu verwenden, um eine Architekturgrenze zu überschreiten. ↩ ↩2
-
Microsoft Learn, Install .NET on Windows. Dazu, dass Windows 11/10 Arm64 von .NET 8/9/10 unterstützt wird, dass sich auf einer Arm-Maschine der Arm64-Build von .NET unter C:\Program Files\dotnet\ installiert und das x64-SDK unter C:\Program Files\dotnet\x64\, sowie dazu, dass möglicherweise eine Anpassung von PATH oder DOTNET_ROOT nötig ist. ↩ ↩2
-
Microsoft Learn, What’s new in .NET Framework. Dazu, dass .NET Framework 4.8.1 native Arm64-Unterstützung hinzufügt, mit einem Leistungsvorteil gegenüber unter Emulation auf Arm64 laufendem x64-Code. ↩
-
Microsoft Learn, Develop Apps for Windows IoT Enterprise. Dazu, dass sich die native Arm64-Unterstützung von .NET Framework 4.8.1 auf Windows 11 bezieht, sowie dazu, dass die 4.8.1-Laufzeit native Arm64-Anwendungen auf Windows-10-Geräten nicht unterstützt. ↩
-
Microsoft Learn, RuntimeInformation.OSArchitecture under emulation. Dazu, dass OSArchitecture ab .NET 7 auch für einen emulierten Prozess unter Windows Arm64 Arm64 zurückgibt (zuvor gab es X64 zurück), sowie dazu, dass ProcessArchitecture die richtige Wahl für die eigene Architektur des Prozesses ist. ↩
-
Microsoft Learn, RuntimeInformation.ProcessArchitecture Property / RuntimeInformation.OSArchitecture Property. Zu den APIs zum Abrufen der Architektur des laufenden Prozesses und der tatsächlichen zugrunde liegenden Architektur des Betriebssystems. ↩
-
Microsoft Learn, BadImageFormatException Class. Dazu, dass BadImageFormatException auftritt, wenn eine Komponente einer Anwendung auf eine andere Plattform abzielt (das Laden einer Assembly mit nicht übereinstimmender Architektur). ↩
-
Microsoft Learn, Add Arm support to your Windows app. Zu den typischen Hindernissen für einen Arm64-Build (nicht unterstützte abhängige Bibliotheken, architekturspezifischer Code, Kernel-Treiber) und deren Behebung, zum Neubau mit Arm64EC bei unverändert belassenen x64-Abhängigkeiten, dazu, wie sich Arm-Hardware oder eine VM zum Testen beschaffen lässt, sowie zur Kombination von Cross-Compilation-Builds mit Tests in einer Arm-Umgebung. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Visual Studio on Arm-powered devices. Dazu, dass das native Arm64-Visual-Studio .NET-/C++-Entwicklung unterstützt, sowie dazu, dass das auf einem Arm64-Host verfügbare MSVC-Toolset Arm64, x64 und x86 als Ziel adressieren kann. ↩
Verwandte Artikel
Aktuelle Artikel mit denselben Schlagwörtern führen zu verwandten Themen weiter.
Win32-APIs sicher aus C# aufrufen — Ein praxistauglicher P/Invoke-Leitfaden (DllImport / LibraryImport / CsWin32)
Eine praxisnahe Übersicht darüber, worauf beim Aufruf von Win32-APIs und nativen DLLs aus C# über P/Invoke zu achten ist. Behandelt die U...
Wenn die eigene Windows-App als Virus gemeldet wird — Umgang mit Fehlalarmen von Microsoft Defender und den Auswirkungen auf die Leistung
Wir legen dar, wie richtig reagiert wird, wenn Microsoft Defender die eigene Windows-App als Malware meldet: wie moderne Antivirus-Erkenn...
Energiesparmodus, Ruhezustand, Modern Standby und lang laufende Anwendungen ── Design gegen „über Nacht stehengeblieben“
Warum eine lang laufende Windows-Anwendung morgens beim Nachsehen „stehengeblieben“ sein kann, aufgearbeitet anhand der Unterschiede zwis...
MAX_PATH und die Fallstricke von Windows-Pfaden und Dateinamen ── Das 260-Zeichen-Limit, reservierte Namen, abschließende Punkte und Groß-/Kleinschreibung
Ein Überblick über die Pfad- und Dateinamensbeschränkungen hinter dem klassischen Fehler „Datei nicht gefunden“. Behandelt werden die Zus...
Die Fallstricke von Netzlaufwerken und UNC-Pfaden ── Fileserver (Freigabeordner) in Business-Anwendungen richtig einsetzen
Dieser Artikel ordnet die klassischen Probleme, die auftreten, wenn eine Business-Anwendung in einen Freigabeordner schreibt oder ihn übe...
Verwandte Themen
Diese Seiten ordnen den Artikel in einen größeren Leistungs- und Entscheidungskontext ein.
Technische Windows-Themen
Portal zu Windows-Entwicklung, Fehleranalyse und der Nutzung bestehender Assets.
ActiveX-Migration
Entscheidungen zum Beibehalten, Kapseln oder Ersetzen von COM / ActiveX / OCX.
Leistungen zu diesem Thema
Dieser Artikel ist direkt mit den folgenden Leistungen verbunden.
Windows-App-Entwicklung
Geschäftsanwendungen, Geräteintegration und Kommunikationstools von den Anforderungen bis zur Umsetzung.
Nutzung und Migration bestehender Assets
Wiederverwendung und Migration von COM / ActiveX / OCX sowie 32-/64-Bit-Abhängigkeiten.
Häufige Fragen
Fragen, die in Beratungen zu diesem Artikelthema häufig gestellt werden.
- Läuft eine gewöhnliche x64-Business-Anwendung unter Windows on Arm?
- In den meisten Fällen ja. Windows 11 on Arm verfügt über eine integrierte Emulation, die x86/x64-Anwendungen unverändert ausführt, und seit Windows 11 24H2 verbessert ein neuer Emulator namens Prism zusätzlich die Leistung. Die Emulation kümmert sich jedoch ausschließlich um Code im Benutzermodus – Treiber im Kernelmodus sowie Shell-Erweiterungen, IMEs und Ähnliches, die in andere Prozesse wie den Explorer geladen werden, benötigen unbedingt native Arm64-Builds. Betrachten Sie es weniger als Frage zur Anwendung selbst, sondern eher als Frage zu dem, was an ihr hängt.
- Kann eine x64-EXE eine Arm64-DLL aufrufen?
- Nein. Innerhalb eines einzelnen Prozesses lassen sich x64- und Arm64-Binärdateien nicht mischen: Ein x64-Prozess (oder Arm64EC-Prozess) kann nur x64- und Arm64EC-Binärdateien laden, ein Arm64-Prozess nur Arm64-Binärdateien. Die umgekehrte Richtung – eine Arm64-EXE ruft eine x64-DLL auf – ist ebenso unmöglich. Benötigen Sie unbedingt eine einzelne DLL, die beides unterstützt, stehen Ihnen Arm64X zur Verfügung, ein Format, in dem Arm64- und Arm64EC-Code in einer Datei koexistieren, oder die Aufteilung in separate Prozesse mit Kommunikation über IPC.
- Was ist nötig, um eine .NET-Anwendung Arm64-tauglich zu machen?
- .NET 6 und neuer unterstützen Windows Arm64 offiziell, und Sie erzeugen eine native Arm64-ausführbare Datei allein durch Veröffentlichung mit der RID (Runtime Identifier) win-arm64. Für eine Anwendung aus reinem verwaltetem Code ist damit im Wesentlichen die gesamte Arbeit erledigt – nutzen Sie jedoch P/Invoke für eine native DLL oder ein NuGet-Paket mit nativen Assets, müssen Sie für jedes davon prüfen, ob ein Arm64-Build existiert. Für .NET-Framework-Anwendungen unterstützt 4.8.1 die native Ausführung auf Arm64 unter Windows 11.
- Welche Art von Software funktioniert nicht unter Windows on Arm?
- An erster Stelle steht Software mit Kernelmodus-Treibern. Treiber werden nicht emuliert, sodass VPN-Clients, Sicherheitsprodukte, virtuelle Geräte und die Lizenzdurchsetzung über USB-Dongles ohne einen Arm64-Treiber nicht funktionieren. Danach folgen Dinge wie Shell-Erweiterungen, IMEs und assistive Technologien, die DLLs in Prozesse auf Betriebssystemseite laden, Anwendungen, die dynamische Codeerzeugung untersagen, sowie Spiele, die von älterem OpenGL oder Anti-Cheat-Treibern abhängen. Ob Peripheriegeräte funktionieren, hängt ebenfalls davon ab, ob dafür ein Arm64-Treiber existiert.
Autorenprofil
Profilseite des Artikelautors.
Go Komura
Geschäftsführer von KomuraSoft LLC
Spezialisiert auf Windows-Softwareentwicklung, technische Beratung und Fehleranalyse, insbesondere bei bestehenden Systemen und schwer reproduzierbaren Störungen.