Portieren auf .NET Core – BibliothekenPorting to .NET Core - Libraries

In diesem Artikel wird die Portierung von Bibliothekscode zu .NET Core beschrieben, damit er plattformübergreifend ausgeführt wird.This article discusses porting library code to .NET Core so that it runs cross-platform.

Erforderliche KomponentenPrerequisites

In diesem Artikel wird vorausgesetzt, dass:This article assumes that you:

Sie sollten sich auch mit dem Inhalt in den folgenden Themen vertraut machen:You should also become familiar with the content of the following topics:

.NET-Standard .NET Standard
Dieses Thema beschreibt die formale Spezifikation von .NET-APIs, die in allen .NET-Implementierungen verfügbar sein sollen.This topic describes the formal specification of .NET APIs that are intended to be available on all .NET implementations.

Pakete, Metapakete und Frameworks Packages, Metapackages and Frameworks
In diesem Artikel wird erläutert, wie .NET Core Pakete definiert und verwendet und wie Pakete Code unterstützen, der in mehreren .NET-Implementierungen ausgeführt wird.This article discusses how .NET Core defines and uses packages and how packages support code running on multiple .NET implementations.

Entwickeln von Bibliotheken mit plattformübergreifenden Tools Developing Libraries with Cross Platform Tools
Dieses Thema erläutert, wie Sie mithilfe von plattformübergreifenden CLI-Tools Bibliotheken für .NET schreiben.This topic explains how to write libraries for .NET using cross-platform CLI tools.

Erweiterungen des CSPROJ-Formats für .NET Core Additions to the csproj format for .NET Core
In diesem Artikel werden die Änderungen erläutert, die an die Projektdateien beim Wechsel zu csproj und MSBuild hinzugefügt wurden.This article outlines the changes that were added to the project file as part of the move to csproj and MSBuild.

Portieren auf .NET Core – Analysieren der Abhängigkeiten von Drittanbietern Porting to .NET Core - Analyzing your Third-Party Party Dependencies
In diesem Thema wird die Portabilität von Drittanbieterabhängigkeiten diskutiert und was Sie tun, wenn die Abhängigkeit eines NuGet-Pakets für .NET Core nicht ausgeführt wird.This topic discusses the portability of third-party dependencies and what to do when a NuGet package dependency doesn't run on .NET Core.

.NET Framework-Technologien, die auf .NET Core nicht verfügbar sind.NET Framework technologies unavailable on .NET Core

Einige Technologien, die für .NET Framework-Bibliotheken verfügbar sind, sind für die Verwendung mit .NET Core nicht verfügbar, z.B. AppDomains, Remoting, Codezugriffssicherheit (Code Access Security, CAS) und Sicherheitstransparenz.Several technologies available to .NET Framework libraries aren't available for use with .NET Core, such as AppDomains, Remoting, Code Access Security (CAS), and Security Transparency. Wenn Ihre Bibliotheken eine oder mehrere dieser Technologien benötigen, sollten Sie die unten beschriebenen alternativen Ansätze in Erwägung ziehen.If your libraries rely on one or more of these technologies, consider the alternative approaches outlined below. Für weitere Informationen zur API-Kompatibilität verwaltet das CoreFX-Team eine Liste von verhaltensbasierten Änderungen/Kompatibilitätsunterbrechungen und veraltete/ältere APIs auf GitHub.For more information on API compatibility, the CoreFX team maintains a List of behavioral changes/compat breaks and deprecated/legacy APIs at GitHub.

Nur weil eine API oder Technologie derzeit nicht implementiert ist, bedeutet dies nicht zwangsläufig, dass sie absichtlich nicht unterstützt wird.Just because an API or technology isn't currently implemented doesn't imply it's intentionally unsupported. Melden Sie ein Problem in den dotnet/CoreFX-Repositoryproblemen auf GitHub, um bestimmte APIs und Technologien anzufordern.File an issue in the dotnet/corefx repository issues at GitHub to ask for specific APIs and technologies. Portierte Anfragen in den Problemen sind mit der Bezeichnung port-to-core markiert.Porting requests in the issues are marked with the port-to-core label.

AppDomainsAppDomains

AppDomains isoliert Apps voneinander.AppDomains isolate apps from one another. AppDomains benötigen eine Runtimeunterstützung und sind im Allgemeinen sehr teuer.AppDomains require runtime support and are generally quite expensive. Sie sind nicht in .NET Core implementiert.They're not implemented in .NET Core. Wir planen nicht, diese Funktion in Zukunft hinzuzufügen.We don't plan on adding this capability in future. Für die Codeisolierung empfehlen wir separate Prozesse oder die Verwendung von Containern als Alternative.For code isolation, we recommend separate processes or using containers as an alternative. Für das dynamische Laden von Assemblys wird die neue Klasse AssemblyLoadContext empfohlen.For the dynamic loading of assemblies, we recommend the new AssemblyLoadContext class.

Um die Codemigration von .NET Framework verständlicher zu gestalten, haben wir einiges der AppDomain-API-Oberfläche in .NET Core verfügbar gemacht.To make code migration from .NET Framework easier, we've exposed some of the AppDomain API surface in .NET Core. Manche Elemente der API funktionieren normal (z.B. AppDomain.UnhandledException), einige Member führen keine Aktion aus (z.B. SetCachePath), und einige davon lösen PlatformNotSupportedException aus (z.B. CreateDomain).Some of the API functions normally (for example, AppDomain.UnhandledException), some members do nothing (for example, SetCachePath), and some of them throw PlatformNotSupportedException (for example, CreateDomain). Überprüfen Sie die Typen, die Sie für die System.AppDomain-Verweisquelle im dotnet/CoreFX-GitHub-Repository verwenden. Stellen Sie dabei sicher, dass Sie den Branch auswählen, der mit Ihrer implementierten Version übereinstimmt.Check the types you use against the System.AppDomain reference source in the dotnet/corefx GitHub repository making sure to select the branch that matches your implemented version.

RemotingRemoting

.NET-Remoting wurde als eine problematische Architektur identifiziert..NET Remoting was identified as a problematic architecture. Es wird für die AppDomain-übergreifende Kommunikation verwendet, die nicht mehr unterstützt wird.It's used for cross-AppDomain communication, which is no longer supported. Darüber hinaus erfordert Remoting die Runtimeunterstützung, die teuer in der Wartung ist.Also, Remoting requires runtime support, which is expensive to maintain. Aus diesen Gründen wird .NET-Remoting auf .NET Core nicht unterstützt, und wir planen nicht, zukünftig eine Unterstützung dafür hinzuzufügen.For these reasons, .NET Remoting isn't supported on .NET Core, and we don't plan on adding support for it in the future.

Für die Kommunikation zwischen Prozessen sollten Sie die Mechanismen der prozessübergreifenden Kommunikation (interprocess communication, IPC) als Alternative zu Remoting berücksichtigen, zB die Klassen System.IO.Pipes oder MemoryMappedFile.For communication across processes, consider inter-process communication (IPC) mechanisms as an alternative to Remoting, such as the System.IO.Pipes or the MemoryMappedFile class.

Verwenden Sie computerübergreifend eine netzwerkbasierte Lösung als Alternative.Across machines, use a network-based solution as an alternative. Verwenden Sie vorzugsweise ein Nur-Text-Protokoll mit geringem Verwaltungsaufwand, z.B. HTTP.Preferably, use a low-overhead plain text protocol, such as HTTP. Der Kestrel Webserver, der von ASP.NET Core verwendete Webserver, ist hier eine Option.The Kestrel web server, the web server used by ASP.NET Core, is an option here. Ziehen Sie auch die Verwendung von System.Net.Sockets für netzwerkbasierte, computerübergreifende Szenarios in Erwägung.Also consider using System.Net.Sockets for network-based, cross-machine scenarios. Weitere Optionen finden Sie unter .NET Open Source Developer Projects: Messaging (.NET Open Source-Entwicklerprojekte: Messaging).For more options, see .NET Open Source Developer Projects: Messaging.

Codezugriffssicherheit (Code Access Security, CAS)Code Access Security (CAS)

Das Verwenden einer Sandbox, das sich auf die Runtime oder das Framework verlässt, um einzuschränken, welche Ressourcen eine verwaltete Anwendung oder Bibliothek verwendet oder ausführt, wird in .NET Framework nicht unterstützt. Daher wird es auch in .NET Core nicht unterstützt.Sandboxing, which is relying on the runtime or the framework to constrain which resources a managed application or library uses or runs, isn't supported on .NET Framework and therefore is also not supported on .NET Core. Wir glauben, dass es zu viele Fälle im .NET Framework und in der Runtime gibt, in denen eine Rechteerweiterung CAS weiterhin als Sicherheitsgrenze behandelt.We believe that there are too many cases in the .NET Framework and runtime where an elevation of privileges occurs to continue treating CAS as a security boundary. Darüber hinaus macht CAS die Implementierung komplizierter und führt oft zu Auswirkungen auf die Leistung der Korrektheitsprüfung für Anwendungen, die dies nicht verwenden sollen.In addition, CAS makes the implementation more complicated and often has correctness-performance implications for applications that don't intend to use it.

Verwenden Sie vom Betriebssystem bereitgestellte Sicherheitsgrenzen, wie Virtualisierung, Container oder Benutzerkonten zum Ausführen von Prozessen mit den geringsten Rechten.Use security boundaries provided by the operating system, such as virtualization, containers, or user accounts for running processes with the least set of privileges.

SicherheitstransparenzSecurity Transparency

Ähnlich wie CAS ermöglicht die Sicherheitstransparenz das Trennen von Sandboxcode von sicherheitsrelevantem Code in einer deklarativen Weise, aber sie wird nicht mehr als eine Sicherheitsgrenze unterstützt.Similar to CAS, Security Transparency allows separating sandboxed code from security critical code in a declarative fashion but is no longer supported as a security boundary. Diese Funktion wird oft von Silverlight verwendet.This feature is heavily used by Silverlight.

Verwenden Sie vom Betriebssystem bereitgestellte Sicherheitsgrenzen, wie Virtualisierung, Container oder Benutzerkonten zum Ausführen von Prozessen mit den geringsten Rechten.Use security boundaries provided by the operating system, such as virtualization, containers, or user accounts for running processes with the least set of privileges.

global.jsonglobal.json

Die global.json-Datei ist eine optionale Datei, die es Ihnen erlaubt, die .NET Core-Toolsversion eines Projekts festzulegen.The global.json file is an optional file that allows you to set the .NET Core tools version of a project. Wenn Sie nächtliche Builds von .NET Core verwenden und eine bestimmte Version des SDK angeben möchten, geben Sie die Version mit einer global.json-Datei an.If you're using nightly builds of .NET Core and wish to specify a specific version of the SDK, specify the version with a global.json file. Es befindet sich in der Regel im aktuellen Arbeitsverzeichnis oder in einem seiner übergeordneten Verzeichnisse.It typically resides in the current working directory or one of its parent directories.

{
  "sdk": {
    "version": "2.1.0-preview1-006491"
  }
}

Konvertieren eines PCL-ProjektsConverting a PCL project

Sie können die Ziele des PCL-Projekts auf .NET-Standard konvertieren, indem Sie die Bibliothek in Visual Studio 2017 laden und die folgenden Schritte ausführen:You can convert the targets of a PCL project to .NET Standard by loading the library in Visual Studio 2017 and performing the following steps:

  1. Klicken Sie mit der rechten Maustaste auf die Projektdatei, und klicken Sie auf Eigenschaften.Right-click on the project file and select Properties.
  2. Klicken Sie unter Bibliothek auf Ziel: .NET-Plattform (Standard).Under Library, select Target .NET Platform Standard.

Wenn Ihre Pakete NuGet 3.0 unterstützen, weist das Projekt .NET-Standard neu zu.If your packages support NuGet 3.0, the project retargets to .NET Standard.

Wenn Ihre Pakete NuGet 3.0 nicht unterstützen, erhalten Sie ein Dialogfeld von Visual Studio, das besagt, dass Sie Ihre aktuellen Pakete deinstallieren sollen.If your packages don't support NuGet 3.0, you receive a dialog from Visual Studio telling you to uninstall your current packages. Wenn Sie diesen Hinweis erhalten, führen Sie die folgenden Schritte aus:If you receive this notice, perform the following steps:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt, und klicken Sie auf NuGet-Pakete verwalten.Right-click the project, select Manage NuGet Packages.
  2. Notieren Sie sich die Projektpakete.Make a note of the project's packages.
  3. Deinstallieren Sie die Pakete einzeln.Uninstall the packages one-by-one.
  4. Sie müssen möglicherweise Visual Studio neu starten, um die Deinstallation abzuschließen.You might need to restart Visual Studio to complete the uninstall process. Wenn dies der Fall ist, wird Ihnen die Schaltfläche Neu starten im Fenster NuGet-Paket-Manager angezeigt.If so, a Restart button is presented to you in the NuGet Package Manager window.
  5. Wenn das Projekt erneut geladen wird, ist .NET-Standard das Ziel.When the project reloads, it targets .NET Standard. Fügen Sie die Pakete hinzu, die Sie deinstallieren mussten.Add the packages you were required to uninstall.

Neuzuweisung Ihres .NET Framework-Codes zu .NET Framework 4.6.2Retargeting your .NET Framework code to .NET Framework 4.6.2

Wenn Ihr Code nicht .NET Framework 4.6.2 als Ziel festlegt, wird empfohlen, dass Sie .NET Framework 4.6.2. neu zuweisen.If your code isn't targeting .NET Framework 4.6.2, we recommended that you retarget to .NET Framework 4.6.2. Dadurch wird die Verfügbarkeit der neuesten API-Alternativen für Fälle sichergestellt, in denen .NET-Standard vorhandene APIs nicht unterstützt.This ensures the availability of the latest API alternatives for cases where the .NET Standard doesn't support existing APIs.

Führen Sie für jedes Projekt in Visual Studio, das Sie portieren möchten, die folgenden Schritte durch:For each of your projects in Visual Studio you wish to port, do the following:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt, und klicken Sie auf Eigenschaften.Right-click on the project and select Properties.
  2. Klicken Sie in der Dropdownliste Zielframework auf .NET Framework 4.6.2.In the Target Framework dropdown, select .NET Framework 4.6.2.
  3. Kompilieren Sie Ihre Projekte neu.Recompile your projects.

Da Ihre Projekte jetzt .NET Framework 4.6.2 als Ziel festgelegt haben, verwenden Sie diese Version von .NET Framework als Grundlage zum Portieren von Code.Because your projects now target .NET Framework 4.6.2, use that version of the .NET Framework as your base for porting code.

Bestimmen der Portabilität Ihres CodesDetermining the portability of your code

Führen Sie als nächsten Schritt den API Portability Analyzer (ApiPort) aus, um einen Portabilitätsbericht für die Analyse zu erstellen.The next step is to run the API Portability Analyzer (ApiPort) to generate a portability report for analysis.

Stellen Sie sicher, dass Sie den API Portability Analyzer (ApiPort) verstehen und verstehen, wie Sie Portabilitätsberichte generieren, die .NET Core als Ziel festlegen.Make sure you understand the API Portability Analyzer (ApiPort) and how to generate portability reports for targeting .NET Core. Wie Sie das bewerkstelligen, hängt von Ihren Bedürfnissen und Ihrem persönlichen Geschmack ab.How you do this likely varies based on your needs and personal tastes. Nachfolgend werden ein paar unterschiedliche Ansätze aufgeführt.What follows are a few different approaches. Sie können Schritte dieser Ansätze kombinieren, je nachdem, wie der Code strukturiert ist.You may find yourself mixing steps of these approaches depending on how your code is structured.

Schwerpunktmäßiger Umgang mit dem CompilerDealing primarily with the compiler

Diese Vorgehensweise ist möglicherweise am Besten für kleine Projekte oder für Projekte, die nicht viele .NET Framework-APIs verwenden.This approach may be the best for small projects or projects which don't use many .NET Framework APIs. Der Ansatz ist einfach:The approach is simple:

  1. Führen Sie optional ApiPort auf Ihrem Projekt aus.Optionally, run ApiPort on your project. Wenn Sie ApiPort ausführen, erhalten Sie Informationen aus dem Bericht über Probleme, die Sie behandeln müssen.If you run ApiPort, gain knowledge from the report on issues you'll need to address.
  2. Kopieren Sie Ihren gesamten Code in ein neues .NET Core-Projekt.Copy all of your code over into a new .NET Core project.
  3. Lösen Sie Compilerfehler, bis das Projekt vollständig kompiliert ist, während Sie auf den Portabilitätsbericht verweisen (wenn er generiert wurde).While referring to the portability report (if generated), solve compiler errors until the project fully compiles.

Obwohl dieser Ansatz unstrukturiert ist, führt der codeorientierte Ansatz oft dazu, dass Fehler schnell gelöst werden, und er kann sich auch am besten für kleinere Projekte oder Bibliotheken eignen.Although this approach is unstructured, the code-focused approach often leads to resolving issues quickly and might be the best approach for smaller projects or libraries. Ein Projekt, das nur Datenmodelle enthält, kann möglicherweise ein idealer Kandidat für diesen Ansatz sein.A project that contains only data models might be an ideal candidate for this approach.

Auf dem .NET Framework bleiben, bis Portabilitätsprobleme gelöst sindStaying on the .NET Framework until portability issues are resolved

Dieser Ansatz kann möglicherweise die beste Lösung, wenn Sie lieber über Code verfügen möchten, der während des gesamten Prozesses kompiliert wird.This approach might be the best if you prefer to have code that compiles during the entire process. Die Vorgehensweise sieht wie Folgt aus:The approach is as follows:

  1. Führen Sie ApiPort auf einem Projekt aus.Run ApiPort on a project.
  2. Beheben Sie Probleme mithilfe der verschiedenen APIs, die übertragbar sind.Address issues by using different APIs that are portable.
  3. Notieren Sie alle Bereiche, in denen Sie daran gehindert werden, eine direkte Alternative zu verwenden.Take note of any areas where you're prevented from using a direct alternative.
  4. Wiederholen Sie die vorherigen Schritte für alle Projekte, die Sie portieren, bis Sie sicher sind, dass jedes Projekt in ein neues .NET Core-Projekt kopiert wurde.Repeat the prior steps for all projects you're porting until you're confident each is ready to be copied over into a new .NET Core project.
  5. Kopieren Sie den Code in ein neues .NET Core-Projekt.Copy the code into a new .NET Core project.
  6. Lösen sie alle Probleme, bei denen Sie sich notiert haben, dass keine direkte Alternative existiert.Work out any issues where you noted that a direct alternative doesn't exist.

Dieser sorgfältige Ansatz ist strukturierter als einfach Compilerfehler zu beheben, ist jedoch auch relativ codeorientiert und hat den Vorteil, dass immer Code vorhanden ist, der kompiliert wird.This careful approach is more structured than simply working out compiler errors, but it's still relatively code-focused and has the benefit of always having code that compiles. Die Herangehensweise, wie Sie bestimmte Probleme lösen, die nicht nur durch einfaches Verwenden einer anderen API behoben werden können, variiert stark.The way you resolve certain issues that couldn't be addressed by just using another API varies greatly. Möglicherweise müssen Sie einen umfassenderen Plan für bestimmte Projekte entwickeln, der als weitere Vorgehensweise gilt.You may find that you need to develop a more comprehensive plan for certain projects, which is covered as the next approach.

Entwickeln eines umfassenden VorgehensplansDeveloping a comprehensive plan of attack

Dieser Ansatz ist möglicherweise am besten für größere und komplexere Projekte geeignet, bei denen es womöglich nötig ist, Code umzustrukturieren oder bestimmte Bereiche komplett neu zu schreiben, um .NET Core zu unterstützen.This approach might be best for larger and more complex projects, where restructuring code or completely rewriting certain areas of code might be necessary to support .NET Core. Die Vorgehensweise sieht wie Folgt aus:The approach is as follows:

  1. Führen Sie ApiPort auf einem Projekt aus.Run ApiPort on a project.
  2. Sie müssen verstehen, wo jeder nicht portable Typ verwendet wird und wie sich dies auf die gesamte Portabilität auswirkt.Understand where each non-portable type is used and how that affects overall portability.
    • Verstehen sie die Natur dieser Typen.Understand the nature of those types. Stellen sie nur eine geringe Anzahl dar, werden jedoch oft verwendet?Are they small in number but used frequently? Stellen sie eine hohe Anzahl dar, werden jedoch nicht oft verwendet?Are they large in number but used infrequently? Ist ihre Verwendung auf einen Punkt ausgerichtet oder im gesamten Code verteilt?Is their use concentrated, or is it spread throughout your code?
    • Ist es einfach, Code zu isolieren, der nicht portabel ist, damit Sie effektiver damit umgehen können?Is it easy to isolate code that isn't portable so that you can deal with it more effectively?
    • Müssen Sie Ihren Code umgestalten?Do you need to refactor your code?
    • Gibt es für nicht portable Typen alternative APIs, die die gleiche Aufgabe erfüllen?For those types which aren't portable, are there alternative APIs that accomplish the same task? Wenn Sie z.B. die WebClient-Klasse verwenden, können Sie stattdessen möglicherweise die HttpClient-Klasse verwenden.For example if you're using the WebClient class, you might be able to use the HttpClient class instead.
    • Gibt es unterschiedliche portable APIs, die für die Erfüllung der Aufgabe verfügbar sind, auch wenn es kein direkter Ersatz ist?Are there different portable APIs available to accomplish a task, even if it's not a drop-in replacement? Wenn Sie z.B. XmlSchema verwenden, um XML zu analysieren, aber keine XML-Schemasuche erforderlich ist, können Sie die System.Xml.Linq-APIs verwenden und das Analysieren selbst implementieren, anstatt auf eine API zu vertrauen.For example if you're using XmlSchema to parse XML but don't require XML schema discovery, you could use System.Xml.Linq APIs and implement parsing yourself as opposed to relying on an API.
  3. Wenn Sie über Assemblys verfügen, die schwierig zu portieren sind, bringt es etwas, Sie vorübergehend in .NET Framework zu lassen?If you have assemblies that are difficult to port, is it worth leaving them on .NET Framework for now? Nachfolgend sind einige Dinge aufgeführt, die Sie bedenken sollten:Here are some things to consider:
    • Sie verfügen womöglich über einige Funktionen in Ihrer Bibliothek, die mit .NET Core inkompatibel sind, da es zu sehr auf der bestimmten .NET Framework- oder Windows-Funktionalität basiert.You may have some functionality in your library that's incompatible with .NET Core because it relies too heavily on .NET Framework or Windows-specific functionality. Ist es also vorteilhaft, diese Funktionalität vorübergehend zu ignorieren, und temporär eine .NET Core-Version Ihrer Bibliothek mit weniger Funktionen zu veröffentlichen, bis die Ressourcen verfügbar sind, um die Funktionieren zu portieren?Is it worth leaving that functionality behind for now and releasing a .NET Core version of your library with less features on a temporary basis until resources are available to port the features?
    • Würde eine Umgestaltung helfen?Would a refactor help?
  4. Ist es sinnvoll, eine eigene Implementierung einer nicht verfügbaren .NET Framework-API zu schreiben?Is it reasonable to write your own implementation of an unavailable .NET Framework API? Sie könnten kopieren, ändern und Code aus der .NET Framework Verweisquelle verwenden.You could consider copying, modifying, and using code from the .NET Framework Reference Source. Der Quellcode für den Verweis wird unter der MIT-Lizenz lizenziert. Daher verfügen Sie über eine erhebliche Freiheit, die Quelle als Grundlage für Ihren eigenen Code zu verwenden.The reference source code is licensed under the MIT License, so you have significant freedom to use the source as a basis for your own code. Stellen Sie nur sicher, dass Sie Microsoft ordnungsgemäß Ihrem Code zugeordnet haben.Just be sure to properly attribute Microsoft in your code.
  5. Wiederholen Sie diesen Vorgang für verschiedene Projekte nach Bedarf.Repeat this process as needed for different projects.

Die Analysephase kann je nach Größe Ihrer Codebasis einige Zeit dauern.The analysis phase could take some time depending on the size of your codebase. Sie können sich auf lange Sicht Zeit in dieser Phase sparen, wenn Sie den Umfang der erforderlichen Änderungen verstehen und einen Plan entwickeln, besonders, wenn sie über eine komplexe Codebasis verfügen.Spending time in this phase to thoroughly understand the scope of changes needed and to develop a plan usually saves you time in the long run, particularly if you have a complex codebase.

Ihr Plan kann wichtige Änderungen an Ihrer Codebase erfordern, während Sie noch immer auf .NET Framework 4.6.2 abzielen. Dadurch entsteht eine strukturiertere Version des vorherigen Ansatzes.Your plan could involve making significant changes to your codebase while still targeting .NET Framework 4.6.2, making this a more structured version of the previous approach. Wie Sie Ihren Plan ausführen, hängt von Ihrer Codebasis ab.How you go about executing your plan is dependent on your codebase.

Mischen von AnsätzenMixing approaches

Es ist wahrscheinlich, dass Sie die oben genannten Vorgehensweisen jeweils pro Projekt mischen werden.It's likely that you'll mix the above approaches on a per-project basis. Sie sollten den Ansatz wählen, der am meisten Sinn für Sie und Ihre Codebasis macht.You should do what makes the most sense to you and for your codebase.

Portieren der TestsPorting your tests

Die beste Möglichkeit, um sicherzustellen, dass alles funktioniert, wenn Sie Ihren Code importiert haben, ist das Testen Ihres Codes beim Portieren auf .NET Core.The best way to make sure everything works when you've ported your code is to test your code as you port it to .NET Core. Zu diesem Zweck müssen Sie ein Test-Framework verwenden, das Tests für .NET Core erstellt und ausführt.To do this, you'll need to use a testing framework that builds and runs tests for .NET Core. Derzeit stehen Ihnen drei Optionen zur Verfügung:Currently, you have three options:

Die Arbeit für die Portierung hängt letztendlich schwer davon ab, wie Ihr .NET Framework-Code strukturiert ist.Ultimately, the porting effort depends heavily on how your .NET Framework code is structured. Eine gute Möglichkeit zum Portieren von Code ist der Beginn mit der Basis Ihrer Bibliothek, die aus den grundlegenden Komponenten Ihres Codes besteht.A good way to port your code is to begin with the base of your library, which are the foundational components of your code. Dies sind womöglich Datenmodelle oder einige andere grundlegende Klassen und Methoden, die von allem anderen direkt oder indirekt verwendet werden.This might be data models or some other foundational classes and methods that everything else uses directly or indirectly.

  1. Portieren Sie das Testprojekt, das die Ebene Ihrer Bibliothek testet, die Sie derzeit portieren.Port the test project that tests the layer of your library that you're currently porting.
  2. Kopieren Sie die Basis Ihrer Bibliothek in ein neues .NET Core-Projekt, und wählen Sie die Version von .NET-Standard aus, die Sie unterstützen möchten.Copy over the base of your library into a new .NET Core project and select the version of the .NET Standard you wish to support.
  3. Führen Sie alle erforderlichen Änderungen durch, sodass der Code kompiliert werden kann.Make any changes needed to get the code to compile. Vieles davon erfordert möglicherweise das Hinzufügen von NuGet-Paketabhängigkeiten zu ihrer csproj-Datei.Much of this may require adding NuGet package dependencies to your csproj file.
  4. Führen Sie die Tests aus, und führen Sie erforderliche Anpassungen durch.Run the tests and make any needed adjustments.
  5. Wählen Sie die nächste Codeebene aus, die portiert werden soll, und wiederholen Sie die vorherigen Schritte.Pick the next layer of code to port over and repeat the prior steps.

Wenn Sie mit der Basis Ihrer Bibliothek beginnen und sich von der Basis aus nach außen bewegen, und jede Ebene wie erforderlich testen, ist die Portierung ein schematischer Prozess, bei dem Probleme jeweils auf einer Codeebene isoliert werden.If you start with the base of your library and move outward from the base and test each layer as needed, porting is a systematic process where problems are isolated to one layer of code at a time.