September 2017
Band 32, Nummer 9
.NET Core: Schreiben von .NET-Apps wie und wo Sie möchten
Von Andrew Hall | September 2017
Hoffentlich haben Sie inzwischen schon davon gehört, dass Microsoft .NET nicht mehr nur für Windows verfügbar ist. .NET Core bietet nun die Möglichkeit, in der von Ihnen bevorzugten Sprache (C#, Visual Basic oder F#) Anwendungen zu schreiben, die unter jedem Betriebssystem (Windows, macOS oder Linux) ausgeführt werden können. Natürlich erwarten Sie beim Schreiben von Anwendungen für die Plattform ihrer Wahl die gleichen beliebten Entwicklertools, die immer das Markenzeichen der .NET-Entwicklung waren. Die gute Nachricht ist zuerst: Nicht nur die Anzahl der von uns unterstützten Plattformen ist gewachsen, sondern auch die Auswahl an Tools, die zum Erstellen großartiger .NET-Anwendungen verfügbar ist.
In diesem Artikel stellen wir die verfügbaren Entwicklungstools für Ihre persönliche Arbeitsweise und das ausgewählte Betriebssystem vor. Wir beginnen mit den im SDK enthaltenen Befehlszeilentools, die Sie mit einem beliebigen Editor kombinieren können (empfohlen wird Visual Studio Code), dann beschäftigen wir uns mit den leistungsfähigen neuen Funktionen von Visual Studio 2017, und anschließend stellen wir Ihnen das neueste Mitglied der Visual Studio-Produktfamilie vor: Visual Studio für Mac. Schließlich zeigen wir Ihnen, wie Sie mithilfe dieser Tools Softwarecontainer nutzen und Ihre Apps nahtlos in der Microsoft Azure-Cloud testen können.
Grundlegende Konzepte
In diesem Artikel verwenden wir die Bezeichnung „.NET Core“ aus Gründen der Konsistenz durchgängig. Dieser Name steht jedoch für zwei wichtige Technologien: .NET Core und .NET Standard. .NET Core ist die plattformübergreifende Laufzeit, die Anwendungen ausführt. .NET Standard ist eine vom Compiler erzwungene Sammlung von APIs, die als Ziel für Klassenbibliotheken verwendet wird, damit eine einzelne Bibliothek mit jeder Laufzeit ausgeführt werden kann, die den Standard unterstützt. .NET Core 2.0, .NET Framework 4.6.1 und Mono 4.8 unterstützen z. B. .NET Standard 2.0 (und frühere) Klassenbibliotheken. Lesen Sie den begleitenden Artikel „Entmystifizierung von .NET Core und .NET Standard“ in dieser Ausgabe, um dieses Konzept besser zu verstehen.
Die von .NET Core und .NET Standard 2.0 unterstützten Sprachen sind ebenfalls erwähnenswert. Auf einer hohen Ebene unterstützen beide Technologien in Version 2.0 C#, Visual Basic und F#. In diesem Release war unser Ziel für Visual Basic die Aktivierung von .NET Standard 2.0-Klassenbibliotheken. Dies bedeutet, dass Visual Basic nur Vorlagen für Klassenbibliotheken bietet, während C# und F# auch Vorlagen für ASP.NET Core 2.0-Apps enthalten.
Verbesserte gemeinsame Projektdatei
Beim Arbeiten mit .NET Core-Projekten fällt zuerst auf, dass sie ein stark vereinfachtes Projektformat gemeinsam verwenden. Dies bedeutet, dass ein Projekt, das mit einem Tool erstellt wurde (z. B. mit den Befehlszeilentools) überall dort funktioniert, wo .NET Core unterstützt wird (z. B. in Visual Studio oder Visual Studio für Mac). Durch unser neues Projektdateiformat sind keine GUIDs mehr erforderlich, und das explizite Auflisten eingeschlossener Dateien entfällt ebenfalls. Auf diese Weise werden Mergekonflikte beim Committen von Updates an die Versionskontrolle erheblich verringert. Der folgende Code zeigt den gesamten Inhalt der Projektdatei für eine neue C# .NET Core-Konsolen-App:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
</Project>
Das gemeinsame Format bedeutet außerdem, dass die Mitglieder des gleichen Teams mit den Geräten und der Plattform ihrer Wahl arbeiten können. Wenn ein Teammitglied auf einem Mac, ein anderes unter Windows und ein drittes unter Linux arbeiten möchte, können sie alle problemlos zum gleichen Projekt beitragen. Weitere Informationen zum aktualisierten Projektformat finden Sie unter aka.ms/newprojectfile.
Befehlszeilentools
Die Grundlage jedes Entwicklertools ist das SDK (Software Development Kit). Dies gilt auch für .NET Core. Ein integraler Bestandteil des .NET Core SDK ist die Befehlszeilenschnittstelle (Command-Line Interface, CLI), mit der Sie Apps über die Befehlszeile codieren, erstellen und ausführen können. Mit der CLI können Sie Ihren bevorzugten Editor zum Erstellen von Apps verwenden, ohne schwergewichtigere Tools installieren zu müssen. Installieren Sie als ersten Schritt das kostenlose .NET Core SDK (von dot.net verfügbar).
Nachdem das SDK installiert wurde, öffnen Sie Ihre bevorzugte Eingabeaufforderung und führen „dotnet --help“ aus, um eine Liste aller verfügbaren Befehle anzuzeigen. Der Befehl „dotnet“ ist der Treiber für die .NET-CLI. Die Syntax lautet „dotnet <verb> [parameter]“. Wenn Sie z. B. alle zum Erstellen verfügbaren Projekttypvorlagen anzeigen möchten, geben Sie „dotnet new“ ein. Zum Erstellen eines neuen Projekts geben Sie den Kurznamen als Parameter für die Aktion „new“ an. „dotnet new razor“ erstellt z. B. eine C# ASP.NET Core-Web-App mit den neuen .NET Core 2.0-Razor-Seiten (weitere Informationen zu diesem großartigen neuen Feature finden Sie unter aka.ms/razorpages). Wenn Sie die Anwendung ausführen möchten, geben Sie „dotnet run“ ein. Die Anwendung wird dann erstellt und ausgeführt. Wenn Sie einen Browser mit der URL öffnen, die in der Ausgabezeichenfolge angegeben wird (z. B. http://localhost:5000), können Sie mit der App interagieren, die Sie erstellen. Ab jetzt ist die Entwicklung einfach: Sie wählen nur Ihren bevorzugten Editor aus, um die App zu erstellen und auszuführen.
Komponententests
Sobald über eine App verfügen, möchten Sie dieser relativ früh im Lebenszyklus wahrscheinlich Komponententests hinzufügen. Komponententests funktionieren mit Ihrer IDEs wie erwartet. Sie können Komponententests jedoch auch direkt über die .NET-CLI erstellen und ausführen.
Möglicherweise ist Ihnen aufgefallen, dass „dotnet new“ zwei verschiedene Projekttypen für Komponententests bereitstellt: „xunit“ und „mstest“. Erstellen Sie als ersten Schritt mit Ihrem bevorzugten Komponententest-Testframework ein Komponententestprojekt, z. B. mit „dotnet new xunit“. Geben Sie dann in Ihrem Testprojektordner „dotnet add reference <pfad zum zu testenden projekt>“ ein, damit die CLI den Verweis auf die Projektdatei hinzufügt. Sobald Sie über ein Komponententestprojekt verfügen, führen Sie Ihre Testprojekte über die CLI mit dem Befehl „dotnet test“ aus. Unabhängig davon, welchen Projekttyp Sie auswählen, werden xunit- und mstest-Projekte von Visual Studio und Visual Studio für Mac sowie von der CLI unterstützt.
Visual Studio Code
Es steht Ihnen frei, einen beliebigen Editor Ihrer Wahl zu verwenden. Wir empfehlen jedoch Visual Studio Code für Benutzer, die nach einer schlanken Bearbeitungsmöglichkeit in Kombination mit der .NET Core-CLI suchen. Visual Studio Code ist unser schlanker, plattformübergreifender Editor mit integrierter Quellcodeverwaltung und Debugunterstützung. Wenn Sie die .NET-CLI mit Visual Studio Code verwenden, können Sie .NET-Anwendungen auf jeder Plattform Ihrer Wahl erstellen. Als ersten Schritt müssen Sie wie bereits erwähnt das .NET Core SDK installieren. Sobald sich das SDK auf Ihrem Computer befindet, installieren Sie Visual Studio Code von code.visualstudio.com. Anschließend installieren Sie die C#-Erweiterung von Microsoft (C# für Visual Studio Code, unterstützt von OmniSharp), indem Sie die Registerkarte „Erweiterung“ auf der linken Seite von Visual Studio Code auswählen. (Wenn Sie F# verwenden sollten Sie auch die Erweiterung „Ionide-fsharp“ installieren. Beachten Sie, dass die C#-Erweiterung für .NET Core-Build- und -Debugunterstützung erforderlich ist.) Sie sind nun bereit, .NET Core-Projekte mit Visual Studio Code zu entwickeln.
Die C#-Erweiterung ermöglicht, dass Visual Studio Code die CLI in Ihrem Auftrag zum Erstellen und Ausführen von Anwendungen zu Debugzwecken aufrufen kann. Nachdem Sie Ihr Projekt erstellt haben, öffnen Sie Visual Studio Code und wählen dann im Menü „Datei“ die Option „Ordner öffnen“ aus. Beim Öffnen einer C#-Datei (CS-Datei) wird eine Eingabeaufforderung angezeigt: eine Vorschlagleiste oben im Editor, die Ihnen anbietet, die erforderlichen Ressourcen zum Erstellen und Debuggen zu generieren. Abbildung 1 zeigt dies. Wenn Sie „Ja“ auswählen, werden zwei Dateien generiert: „tasks.json“, die das Erstellen aus Visual Studio Code ermöglicht, und „launch.json“, die das Debuggen erlaubt. Sie sind nun bereit, die Bearbeitung, das Kompilieren und das Debuggen direkt aus Visual Studio Code auszuführen.
Abbildung 1: Visual Studio Code-Angebot zum Generieren erforderlicher Dateien für den Buildvorgang und das Debuggen
Visual Studio
Visual Studio unterstützt auch weiterhin Entwicklerfunktionen mit Weltklasseniveau, und die Toolunterstützung für .NET Core steht dem in nichts nach. Unterstützung für .NET Core 2.0 wurde in Visual Studio 2017 (Version 15.3) eingeführt. Damit Sie eine .NET Core 2.0-App in Visual Studio schreiben können, müssen Sie zunächst das .NET Core 2.0 SDK herunterladen und installieren. Sobald das SDK auf Ihrem Computer vorhanden ist, starten Sie Visual Studio neu. Nun wird .NET Core 2.0 als ein Ziel für neue Projekte angezeigt.
Unser erklärtes Ziel war es, Visual Studio 2017 zu der produktivsten Entwicklungsumgebung zu machen, die wir jemals angeboten haben. Hier nur einige Höhepunkte: Wir haben Codenavigationsoptimierungen, eine erhebliche Anzahl neuer Refactoring-/Quick Fix-Befehle, Codeformaterzwingung und Live Unit Testing hinzugefügt.
Navigation und Refactoring: Wir wissen, dass es beim Arbeiten am Code wichtig ist, gute Unterstützung beim Navigieren in der Codebasis zu erhalten. Die folgenden Optimierungen bei der Codenavigation in Visual Studio 2017 sind die beliebtesten:
- Gehe-zu-Implementierung (STRG+F12): Navigiert von jedem beliebigen Basistyp oder Member zu seinen vorherigen Implementierungen.
- Gehe zu allen (STRG+T oder STRG+,): Navigiert direkt zu einer beliebigen Datei-/Typ-/Member-/Symboldeklaration. Sie können die Symbole oben im Feature zum Filtern der Ergebnisliste verwenden oder die Abfragesyntax nutzen (z. B. „f searchTerm“ für Dateien, „t searchTerm“ für Typen usw.).
- Alle Verweise suchen (Umschalt+F12): Durch die Syntaxfarbgebung können die Ergebnisse von „Alle Verweise suchen“ nun benutzerdefiniert anhand einer Kombination aus dem Projekt, der Definition und dem Pfad gruppiert werden. Sie können Ergebnisse auch „sperren“, damit Sie nach weiteren Verweisen suchen können, ohne die ursprünglichen Ergebnisse zu verlieren.
- Einzugsführungslinien: Die punktierten grauen vertikalen Linien dienen nun als Orientierungshilfen im Code, um Kontext innerhalb Ihres Bezugssystems bereitzustellen. Vielleicht kennen Sie diese schon aus den beliebten Productivity Power Tools.
Es reicht nicht aus, dass Sie einfach in der Codebasis navigieren können. Wir wissen, dass Sie Tools für das Refactoring benötigen, wenn Sie Stellen in Ihrem Code ändern oder bereinigen möchten. Zu diesem Zweck haben wir Unterstützung zum Verschieben eines Typs in eine Datei mit dem gleichen Namen, Synchronisieren eines Datei- und Typnamens, Hinzufügen einer NULL-Überprüfung für einen Parameter, Hinzufügen eines Parameters, Hinzufügen eines fehlenden switch-/Select-Falls, Deklarieren einer Methode als synchron, Konvertieren einer Methode in eine Eigenschaft (und umgekehrt) und Auflösen eines Mergekonflikts hinzugefügt, um nur einige Möglichkeiten zu nennen.
Codeformat: In Visual Studio 2017 können Sie die Codierungskonventionen Ihres Teams konfigurieren und erzwingen, um Konsistenz für Ihr gesamtes Repository mit EditorConfig zu gewährleisten. EditorConfig ist ein offenes Dateiformat. Wir haben mit der zugehörigen Community zusammengearbeitet, um das .NET-Codeformat innerhalb dieses Formats zu unterstützen. Teams können Konventionseinstellungen konfigurieren und auswählen, wie die Erzwingung im Editor erfolgt (als Vorschläge, Warnungen oder Fehler). Die Regeln gelten für alle Dateien, die sich in dem Verzeichnis befinden, das die EditorConfig-Datei enthält. Wenn Sie unterschiedliche Konventionen für verschiedene Projekte verwenden, können Sie die Regeln jedes Projekts in verschiedenen EditorConfig-Dateien definieren, wenn sich die Projekte in separaten Verzeichnissen befinden. Da es sich bei EditorConfig letztlich nur um eine Textdatei handelt, ist es einfach, diese in die Quellcodeverwaltung einzuchecken und mit ihrer Quelle zu verknüpfen. Weitere Informationen zur EditorConfig-Unterstützung in Visual Studio finden Sie unter aka.ms/editorconfig.
Live Unit Testing: Sobald Sie über ein MSTest-, xUnit oder NUnit-Testprojekt verfügen, können Sie Live Unit Testing (LUT) für Ihre .NET Core-Projekte aktivieren. LUT ist ein neues Feature, das mit Visual Studio 2017 Enterprise Edition eingeführt wurde. Wenn Sie LUT aktivieren, können Sie Komponententestabdeckung und Feedback zum Bestehen oder Nichtbestehen von Tests live im Code-Editor während der Eingabe nutzen. Abbildung 2 zeigt dies. Dies bedeutet, dass Sie den Editor nicht mehr verlassen müssen, um Komponententests zum Überprüfen von Codeänderungen auszuführen. Sobald Sie Eingaben vornehmen, wird sofortiges Feedback im Editor mit Ergebnissen für alle Tests angezeigt, die von der Codeänderung betroffen sind.
Abbildung 2: Ausführen von Live Unit Testing für ein .NET Core-Projekt
Teams, die mit Leidenschaft um Qualität bemüht sind, und Benutzer, die testgesteuerte Entwicklung (Test-Driven Development, TDD) schätzen, werden von diesem neuen Feature begeistert sein. Navigieren Sie zum Aktivieren von LUT zum Eintrag „Testen“ in der Menüleiste von Visual Studio, und wählen Sie dann „Live Unit Testing“ > „Start“ aus.
Visual Studio für Mac
Visual Studio für Mac ist das neueste Mitglied der Visual Studio-Produktfamilie für Entwickler, die IDEs unter macOS nutzen möchten. Visual Studio für Mac hat sich aus Xamarin Studio entwickelt. Dieses Produkt bietet Unterstützung für C#- und F#-Projekte. Installieren Sie zunächst das .NET Core 2.0 SDK (für den Download von dot.net verfügbar), und wählen Sie „Projekt erstellen“ aus. Wählen Sie dann den Eintrag „App“ unter der .NET Core-Kategorie aus, um die gewünschte Projektvorlage auszuwählen.
Sie verfügen nun über eine IDE mit allen Funktionen zum Entwickeln von .NET Core-Apps auf Ihrem Mac. Abbildung 3 zeigt dies. Eine Sache, an der wir intensiv arbeiten, ist konsistente Funktionalität zwischen Visual Studio und Visual Studio für Mac. Zurzeit sind die meisten Features verfügbar, die Sie an Visual Studio schätzen, z. B. IntelliSense, Codenavigation, Refactoring, Komponententests und Integration der Quellcodeverwaltung. Für die Webentwicklung haben wir Visual Studio für Mac mit den HTML-, CSS- und JSON-Editoren von Visual Studio ausgestattet. Ihnen wird auffallen, dass Razor-Dateien (CSHTML-Dateien) und JavaScript/TypeScript zurzeit nicht unterstützt werden, aber wir arbeiten daran, diese Unterstützung für Visual Studio für Mac in einem zukünftigen Update bereitzustellen.
Abbildung 3: Visual Studio für Mac
Tools vor dem Hintergrund der modernen Cloud
Eines wird klar, wenn man sich die Entwicklung der Technologiewelt ansieht: Mehr und mehr Apps werden von Anfang an für die Ausführung in der Cloud entworfen. Dies bedeutet, dass Ihre Tools Entwurfsmuster und -praktiken ermöglichen müssen, die die moderne Cloud berücksichtigen, und sie müssen Sie in die Lage versetzen, eine App schnell vom lokalen Entwicklungscomputer in die Cloud verschieben zu können. Mit diesem Ziel vor Augen verfügen Visual Studio und Visual Studio für Mac über integrierte Unterstützung für direkte Veröffentlichung in Microsoft Azure sowie für die Paketerstellung von Anwendungen als Docker-Container.
Direktes Veröffentlichen in Azure: Wenn Sie bereit sind, eine Anwendung für die Ausführung in der Cloud bereitzustellen, möchten Sie sie wahrscheinlich mit so wenig Aufwand wie möglich in der Cloud testen. Visual Studio und Visual Studio für Mac ermöglichen das Veröffentlichen einer App direkt von Ihrem Computer in Azure App Service. App Service ist eine vollständig verwaltete Cloudumgebung, die das Ausführen Ihrer App ermöglicht, ohne dass Sie sich um eine komplexe Konfiguration oder Infrastrukturverwaltung kümmern müssen.
Das Veröffentlichen Ihrer App von Ihrem lokalen Computer in Azure App Service aus Visual Studio oder Visual Studio für Mac ist außerordentlich einfach: Sie müssen nur mit der rechten Maustaste auf das Projekt klicken und dann „Veröffentlichen“ auswählen. Sie werden dann aufgefordert, einige Informationen einzugeben, z. B. die eindeutige URL für Ihre App, und Sie können einen vorhandenen App Service-Plan (wie viele Ressourcen für die Sammlung von Mitglieds-Apps reserviert werden sollen) auswählen oder einen neuen Plan erstellen, wenn noch kein Plan vorhanden ist. Nachdem Sie diese Informationen eingegeben haben, wird Ihre App innerhalb weniger Minuten in der Cloud ausgeführt.
Containerentwicklungstools: Hinsichtlich der modernen Cloudentwicklung stellt sich inzwischen heraus, dass Container die Art und Weise revolutionieren werden, wie Entwickler Software entwerfen und erstellen. Container ermöglichen das Packen Ihrer Anwendung und aller ihrer Abhängigkeiten (einschließlich einer Kopie der Laufzeit) in einer einzelnen Einheit. So wird garantiert, dass Änderungen am zugrunde liegenden Server niemals zu einer Fehlfunktion Ihrer Anwendung führen. Dies ermöglicht ein Microservicearchitekturmuster, in dem Sie jede Einheit von Programmlogik in Ihrer Anwendung als einen separaten Container mit einem definierten Protokoll für die Kommunikation untereinander bereitstellen. Auf diese Weise können Sie Komponenten der App mit hohem Bedarf wie erforderlich skalieren, ohne die Kosten der Skalierung der gesamten Anwendung tragen zu müssen. Außerdem betreffen Fixes nur den Container, der aktualisiert wird, und nicht die gesamte Anwendung.
Vor diesem Hintergrund besteht eines unserer Ziele für .NET Core darin, dass die Anwendung zur besten Laufzeit zum Erstellen von containerisierten Microservices wird. Visual Studio, Visual Studio für Mac und Visual Studio Code unterstützen alle das Erstellen von Apps als Docker-Container. (Beachten Sie, dass Docker-Toolunterstützung für Visual Studio für Mac zurzeit die Docker Tools-Erweiterung benötigt und dass Microsoft eine Docker-Erweiterung für Visual Studio Code anbietet, um das Erstellen von Docker-Containern zu unterstützen.)
Damit Sie einen Docker-Container erstellen können, benötigen Sie die Tools von Docker für Ihr installiertes Betriebssystem (weitere Informationen und Downloads finden Sie unter docker.com). Nachdem alle Voraussetzungen installiert wurden, müssen Sie nur noch in Visual Studio oder Visual Studio für Mac mit der rechten Maustaste auf das Projekt klicken, „Hinzufügen“ und dann „Docker-Unterstützung“ auswählen . Dies fügt Ihrer Projektmappe ein docker-compose-Projekt und dem Projekt ein „Dockerfile“ hinzu. Diese Ressourcen ermöglichen, dass Ihr Projekt in einem Docker-Container erstellt wird. Wenn Sie die App anschließend aus der IDE ausführen, erfolgen die Ausführung und das Debuggen Ihrer Anwendung in einem Container und nicht direkt auf dem Hostcomputer. Und gut zu wissen: Die hier beschriebene Veröffentlichungsfunktion in Azure App Service unterstützt auch das Veröffentlichen von Linux Docker-Containern.
Zusammenfassung
Wenn Sie bisher noch nicht versucht haben, eine .NET Core-App zu erstellen, bietet sich der jetzige Zeitpunkt geradezu an. Durch .NET Core und .NET Standard 2.0 (wie im Artikel „Entmystifizierung von .NET Core und .NET Standard“ beschrieben) wird das Erstellen einer .NET-Anwendung ganz einfach, und zwar unabhängig von den ausgewählten Tools, dem Betriebssystem, der Sprache und Ihrer Arbeitsweise.
Wir hoffen, dass diese Beschreibung der verfügbaren .NET Core-Tools interessant für Sie war. In unserem Blog unter aka.ms/dotnetblog können Sie die Fortschritte unseres Teams und künftige Verbesserungen weiter verfolgen. Bitte testen Sie die hier vorgestellten Tools und übermitteln uns Feedback dazu, wie wir Ihre Erfahrungen beim Erstellen von .NET Core-Apps weiter verbessern können. Sie können Kommentare zu unseren Blogbeiträgen posten bzw. Fragen stellen oder direkt Feedback an uns senden, indem Sie die in Visual Studio und Visual Studio für Mac integrierten Features „Ein Problem melden“ und „Vorschlag senden“ verwenden.
Andrew Hall arbeitet als Program Manager Lead für die .NET-Sprachen und -Tools in Visual Studio. Nach seinem Collegeabschluss schrieb er Branchenanwendungen, bevor er an die Universität zurückkehrte und einen Masterstudiengang in Computerwissenschaften absolvierte. Nach seinem Masterabschluss wurde er Mitglied des Diagnoseteams von Visual Studio und arbeitete am Debugger sowie an Profilerstellungs- und Codeanalysetools mit. Anschließend arbeitete er im Team für .NET-Sprachen und -Tools an den .NET-Sprachen und den unterstützenden Tools, z. B. an Tools für ASP.NET, Web und Azure App Service. Sie können Hall über Twitter erreichen: @AndrewBrianHall.
Joe Morris arbeitet als Program Manager für .NET Core-Tools und Live Unit Testing in Visual Studio. Er besitzt einen Masterabschluss in Computerwissenschaften. Er begann seinen beruflichen Werdegang in den 1990er Jahren als Anwendungsentwicklerberater für Unternehmen in den USA. Seit 1997 arbeitet er bei Microsoft (zuerst bei Microsoft Consulting Services (Iowa) und später in Redmond). In den letzten zwei Jahren hat er sich schwerpunktmäßig mit der Analyse statischen Codes und mit Tools für die Entwicklerproduktivität beschäftigt. Sie können Morris über Twitter erreichen: @_jomorris.
Unser Dank gilt den folgenden technischen Experten von Microsoft für die Durchsicht dieses Artikels: Dustin Campbell, Phillip Carter, Livar Cunha, Mikayla Hutchinson, Mads Kristensen, Jordan Matthiesen und Kasey Uhlenhuth