Entwickeln von Bibliotheken mit plattformübergreifenden ToolsDeveloping Libraries with Cross Platform Tools

Dieser Artikel behandelt, wie man mithilfe von plattformübergreifenden CLI-Tools Bibliotheken für .NET schreibt.This article covers how to write libraries for .NET using cross-platform CLI tools. Die CLI bietet effiziente Funktionalität auf niedriger Stufe, die auf allen unterstützten Betriebssystemen funktioniert.The CLI provides an efficient and low-level experience that works across any supported OS. Sie können trotzdem noch Bibliotheken mit Visual Studio erstellen. Wenn das Ihre bevorzugte Methode ist, finden Sie weitere Informationen im Handbuch für Visual Studio.You can still build libraries with Visual Studio, and if that is your preferred experience refer to the Visual Studio guide.

Erforderliche KomponentenPrerequisites

Das .NET Core SDK und die CLI müssen auf Ihrem Computer installiert sein.You need the .NET Core SDK and CLI installed on your machine.

Für die Abschnitte dieses Dokuments, in denen es um .NET Framework-Versionen geht, muss das .NET Framework auf einem Windows-Computer installiert sein.For the sections of this document dealing with .NET Framework versions, you need the .NET Framework installed on a Windows machine.

Wenn Sie ältere .NET Framework-Ziele unterstützen möchten, müssen Sie außerdem Pakete zum Festlegen von Zielversionen und Entwicklerpakete für ältere Frameworkversionen installieren. Sie erhalten diese auf der Seite .NET target platforms (.NET Zielplattformen).Additionally, if you wish to support older .NET Framework targets, you need to install targeting/developer packs for older framework versions from the .NET target platforms page. Weitere Informationen finden Sie in dieser Tabelle:Refer to this table:

.NET Framework-Version.NET Framework Version Empfohlene DownloadsWhat to download
4.6.14.6.1 Paket zur Festlegung von Zielversionen für .NET Framework 4.6.1.NET Framework 4.6.1 Targeting Pack
4.64.6 Paket zur Festlegung von Zielversionen für .NET Framework 4.6.NET Framework 4.6 Targeting Pack
4.5.24.5.2 .NET Framework 4.5.2 Entwicklerpaket.NET Framework 4.5.2 Developer Pack
4.5.14.5.1 .NET Framework 4.5.1 Entwicklerpaket.NET Framework 4.5.1 Developer Pack
4.54.5 Windows Software Development Kit für Windows 8Windows Software Development Kit for Windows 8
4.04.0 Windows SDK für Windows 7 und .NET Framework 4Windows SDK for Windows 7 and .NET Framework 4
2.0, 3.0 und 3.52.0, 3.0, and 3.5 .NET Framework 3.5 SP1-Runtime (oder Windows 8+-Version).NET Framework 3.5 SP1 Runtime (or Windows 8+ version)

So legen Sie .NET Standard als Ziel festHow to target the .NET Standard

Wenn Sie noch nicht mit .NET Standard vertraut sind, finden Sie unter .NET-Standard weitere Informationen.If you're not quite familiar with the .NET Standard, refer to the .NET Standard to learn more.

In diesem Artikel finden Sie eine Tabelle, in der die Versionen von .NET Standard zahlreichen Implementierungen zugeordnet werden:In that article, there is a table which maps .NET Standard versions to various implementations:

.NET-Standard 1.0 1.1 1.2 1.3 1.4 1.5 1.6 2.0
.NET Core 1.0 1.0 1.0 1.0 1.0 1.0 1.0 2.0
.NET Framework (mit dem .NET Core 1.x SDK) 4.5 4.5 4.5.1 4.6 4.6.1 4.6.2
.NET Framework (mit dem .NET Core 2.0 SDK) 4.5 4.5 4.5.1 4.6 4.6.1 4.6.1 4.6.1 4.6.1
Mono 4.6 4.6 4.6 4.6 4.6 4.6 4.6 5.4
Xamarin.iOS 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.14
Xamarin.Mac 3.0 3.0 3.0 3.0 3.0 3.0 3.0 3.8
Xamarin.Android 7.0 7.0 7.0 7.0 7.0 7.0 7.0 8.0
Universelle Windows-Plattform 10.0 10.0 10.0 10.0 10.0 vNext vNext vNext
Windows 8.0 8.0 8.1
Windows Phone 8.1 8.1 8.1
Windows Phone Silverlight 8.0
  • Die Spalten stellen die .NET Standard-Versionen dar. Jede Zelle enthält einen Link zu einem Dokument, im dem die APIs angegeben sind, die in dieser Version von .NET Standard hinzugefügt wurden.
  • Die Zeilen stellen die verschiedenen .NET-Implementierungen dar.
  • Die Versionsnummer in jeder Zelle gibt an, welche Version der Implementierung Sie mindestens benötigen, um diese Version von .NET Standard als Ziel zu setzen.

Im Folgenden wird erklärt, was diese Tabelle für das Erstellen einer Bibliothek bedeutet:Here's what this table means for the purposes of creating a library:

Die Version von .NET Standard, die Sie auswählen, bildet einen Kompromiss zwischen dem Zugang zu den neuesten APIs und der Möglichkeit, mehr .NET-Implementierungen und .NET Standard-Versionen nutzen zu können.The version of the .NET Standard you pick will be a tradeoff between access to the newest APIs and the ability to target more .NET implementations and .NET Standard versions. Sie kontrollieren den Bereich der Plattformen, die als Ziel gesetzt werden können, und der Versionen, indem Sie eine netstandardX.X-Version auswählen (X.X steht für eine Versionsnummer) und sie zu Ihrer Projektdatei (.csproj oder .fsproj) hinzufügen.You control the range of targetable platforms and versions by picking a version of netstandardX.X (Where X.X is a version number) and adding it to your project file (.csproj or .fsproj).

Wenn Sie .NET Standard als Ziel festlegen, stehen Ihnen je nach Bedarf drei Optionen zur Verfügung.You have three primary options when targeting the .NET Standard, depending on your needs.

  1. Sie können die Standardversion von .NET Standard verwenden, die von Vorlagen (netstandard1.4) bereitgestellt wurden. Dadurch erhalten Sie Zugriff auf die meisten APIs unter .NET Standard, wobei UWP, .NET Framework 4.6.1 und die bald erscheinende Version .NET Standard 2.0 noch immer kompatibel sind.You can use the default version of the .NET Standard supplied by templates - netstandard1.4 - which gives you access to most APIs on .NET Standard while still being compatible with UWP, .NET Framework 4.6.1, and the forthcoming .NET Standard 2.0.

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFramework>netstandard1.4</TargetFramework>
      </PropertyGroup>
    </Project>
    
  2. Sie können eine niedrigere oder höhere Version von .NET Standard verwenden, indem Sie den Wert im TargetFramework-Knoten Ihrer Projektdatei bearbeiten.You can use a lower or higher version of the .NET Standard by modifying the value in the TargetFramework node of your project file.

    .NET Standard-Versionen sind abwärtskompatibel..NET Standard versions are backward compatible. Das bedeutet, dass netstandard1.0-Bibliotheken auf netstandard1.1-Plattformen und höher ausgeführt werden können.That means that netstandard1.0 libraries run on netstandard1.1 platforms and higher. Es gibt allerdings keine Aufwärtskompatibilität – niedrigere .NET Standard-Plattformen können nicht auf höhere verweisen.However, there is no forward compatibility - lower .NET Standard platforms cannot reference higher ones. Das bedeutet, dass netstandard1.0-Bibliotheken nicht auf Bibliotheken verweisen können, die netstandard1.1 oder höher als Ziel haben.This means that netstandard1.0 libraries cannot reference libraries targeting netstandard1.1 or higher. Wählen Sie die Standard-Version aus, die die beste Mischung aus APIs und Plattformunterstützung für Ihre Anforderungen bietet.Select the Standard version that has the right mix of APIs and platform support for your needs. Wir empfehlen aktuell netstandard1.4.We recommend netstandard1.4 for now.

  3. Wenn Sie die .NET Framework-Version 4.0 oder niedriger als Ziel festlegen wollen, oder Sie eine API verwenden wollen, die in .NET Framework verfügbar ist, aber nicht in .NET Standard (z.B. System.Drawing), lesen Sie die folgenden Abschnitte. Hier lernen Sie, wie man die Zielversion festlegt.If you want to target the .NET Framework versions 4.0 or below, or you wish to use an API available in the .NET Framework but not in the .NET Standard (for example, System.Drawing), read the following sections and learn how to multitarget.

So legen Sie .NET Framework als Ziel festHow to target the .NET Framework

Hinweis

In diesen Anweisungen wird vorausgesetzt, dass .NET Framework auf Ihrem Computer installiert ist.These instructions assume you have the .NET Framework installed on your machine. Informationen zum Installieren von Abhängigkeiten finden Sie unter Erforderliche Komponenten.Refer to the Prerequisites to get dependencies installed.

Bedenken Sie, dass einige der hier verwendeten .NET Framework-Versionen nicht mehr unterstützt werden.Keep in mind that some of the .NET Framework versions used here are no longer in support. Für weitere Informationen über nicht unterstütze Versionen, besuchen Sie .NET Framework Support Lifecycle Policy FAQ (.NET Framework Support Lifecycle-Richtlinien FAQ).Refer to the .NET Framework Support Lifecycle Policy FAQ about unsupported versions.

Wenn Sie so viele Entwickler und Projekte erreichen möchten wie möglich, verwenden Sie das .NET Framework 4.0 als Baseline-Ziel.If you want to reach the maximum number of developers and projects, use the .NET Framework 4.0 as your baseline target. Um .NET Framework als Ziel festzulegen, müssen Sie zuerst den richtigen Zielframeworkmoniker (Target Framework Moniker, TMF) auswählen, der der .NET Framework-Version entspricht, die Sie unterstützen möchten.To target the .NET Framework, you will need to begin by using the correct Target Framework Moniker (TFM) that corresponds to the .NET Framework version you wish to support.

.NET Framework 2.0   --> net20
.NET Framework 3.0   --> net30
.NET Framework 3.5   --> net35
.NET Framework 4.0   --> net40
.NET Framework 4.5   --> net45
.NET Framework 4.5.1 --> net451
.NET Framework 4.5.2 --> net452
.NET Framework 4.6   --> net46
.NET Framework 4.6.1 --> net461
.NET Framework 4.6.2 --> net462
.NET Framework 4.7   --> net47

Sie fügen anschließend TFM in den TargetFramework-Abschnitt Ihrer Projektdatei ein.You then insert this TFM into the TargetFramework section of your project file. Hier sehen Sie zum Beispiel, wie Sie eine Bibliothek schreiben, die das .NET Framework 4.0 als Ziel festlegt:For example, here's how you would write a library which targets the .NET Framework 4.0:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net40</TargetFramework>
  </PropertyGroup>
</Project>

Und das ist schon alles!And that's it! Obwohl dies nur für .NET Framework 4 kompiliert, können Sie die Bibliothek auf neueren Versionen von .NET Framework verwenden.Although this compiled only for the .NET Framework 4, you can use the library on newer versions of the .NET Framework.

So legen Sie die Zielversion festHow to Multitarget

Hinweis

In den folgenden Anweisungen wird vorausgesetzt, dass .NET Framework auf Ihrem Computer installiert ist.The following instructions assume you have the .NET Framework installed on your machine. Im Abschnitt Erforderliche Komponenten finden Sie weitere Informationen darüber, welche Abhängigkeiten Sie installieren müssen, und wo Sie diese herunterladen können.Refer to the Prerequisites section to learn which dependencies you need to install and where to download them from.

Sie müssen möglicherweise ältere Versionen von .NET Framework als Ziel festlegen, wenn Ihr Projekt sowohl .NET Framework als auch .NET Core unterstützt.You may need to target older versions of the .NET Framework when your project supports both the .NET Framework and .NET Core. Wenn Sie neuere APIs und Sprachkonstrukte für die neueren Ziele verwenden möchten, verwenden Sie in diesem Szenario #if-Anweisungen in Ihrem Code.In this scenario, if you want to use newer APIs and language constructs for the newer targets, use #if directives in your code. Sie müssen möglicherweise auch unterschiedliche Pakete und Abhängigkeiten für jede Zielplattform hinzufügen, um verschiedene APIs einzuschließen, die für jeden Fall benötigt werden.You also might need to add different packages and dependencies for each platform you're targeting to include the different APIs needed for each case.

Nehmen wir z.B. einmal an, dass Sie eine Bibliothek haben, die Netzwerkvorgänge über HTTP ausführt.For example, let's say you have a library that performs networking operations over HTTP. Für .NET Standard und die .NET Framework-Versionen 4.5 oder höher können Sie die HttpClient-Klasse aus dem System.Net.Http-Namespace verwenden.For .NET Standard and the .NET Framework versions 4.5 or higher, you can use the HttpClient class from the System.Net.Http namespace. Frühere Versionen von .NET Framework verfügen jedoch nicht über die Klasse HttpClient, daher können Sie für diese stattdessen die Klasse WebClient aus dem Namespace System.Net verwenden.However, earlier versions of the .NET Framework don't have the HttpClient class, so you could use the WebClient class from the System.Net namespace for those instead.

Ihre Projektdatei könnte also Folgendermaßen aussehen:Your project file could look like this:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.4;net40;net45</TargetFrameworks>
  </PropertyGroup>

  <!-- Need to conditionally bring in references for the .NET Framework 4.0 target -->
  <ItemGroup Condition="'$(TargetFramework)' == 'net40'">
    <Reference Include="System.Net" />
  </ItemGroup>

  <!-- Need to conditionally bring in references for the .NET Framework 4.5 target -->
  <ItemGroup Condition="'$(TargetFramework)' == 'net45'">
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Threading.Tasks" />
  </ItemGroup>
</Project>

Sie sehen hier drei große Veränderungen:You'll notice three major changes here:

  1. Der TargetFramework-Knoten wurde durch TargetFrameworks ersetzt, und drei TFMs werden darin dargestellt.The TargetFramework node has been replaced by TargetFrameworks, and three TFMs are expressed inside.
  2. Es gibt einen <ItemGroup>-Knoten für das net40-Ziel, der einen .NET Framework-Verweis einbezieht.There is an <ItemGroup> node for the net40 target pulling in one .NET Framework reference.
  3. Es gibt einen <ItemGroup>-Knoten für das net45-Ziel, der zwei .NET Framework-Verweise einbezieht.There is an <ItemGroup> node for the net45 target pulling in two .NET Framework references.

Das Buildsystem beachtet die folgenden Präprozessorsymbole, die in #if-Anweisungen verwendet werden:The build system is aware of the following preprocessor symbols used in #if directives:

Zielframeworks Symbole
.NET Framework NET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET47, NET471
.NET-Standard NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0
.NET Core NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0

Hier sehen sie ein Beispiel, das die bedingte Kompilierung pro Ziel verwendet:Here is an example making use of conditional compilation per-target:

using System;
using System.Text.RegularExpressions;
#if NET40
// This only compiles for the .NET Framework 4 targets
using System.Net;
#else
 // This compiles for all other targets
using System.Net.Http;
using System.Threading.Tasks;
#endif

namespace MultitargetLib
{
    public class Library
    {
#if NET40
        private readonly WebClient _client = new WebClient();
        private readonly object _locker = new object();
#else
        private readonly HttpClient _client = new HttpClient();
#endif

#if NET40
        // .NET Framework 4.0 does not have async/await
        public string GetDotNetCount()
        {
            string url = "http://www.dotnetfoundation.org/";

            var uri = new Uri(url);

            string result = "";

            // Lock here to provide thread-safety.
            lock(_locker)
            {
                result = _client.DownloadString(uri);
            }

            int dotNetCount = Regex.Matches(result, ".NET").Count;

            return $"Dotnet Foundation mentions .NET {dotNetCount} times!";
        }
#else
        // .NET 4.5+ can use async/await!
        public async Task<string> GetDotNetCountAsync()
        {
            string url = "http://www.dotnetfoundation.org/";

            // HttpClient is thread-safe, so no need to explicitly lock here
            var result = await _client.GetStringAsync(url);

            int dotNetCount = Regex.Matches(result, ".NET").Count;

            return $"dotnetfoundation.org mentions .NET {dotNetCount} times in its HTML!";
        }
#endif
    }
}

Wenn Sie diese Projekt mit dotnet build erstellen, bemerken Sie drei Verzeichnisse unter dem bin/-Ordner:If you build this project with dotnet build, you'll notice three directories under the bin/ folder:

net40/
net45/
netstandard1.4/

Jedes dieser Verzeichnisse enthält die .dll-Dateien für jedes Ziel.Each of these contain the .dll files for each target.

So testen Sie die Bibliotheken unter .NET CoreHow to test libraries on .NET Core

Es ist wichtig, über Plattformen hinweg testen zu können.It's important to be able to test across platforms. Sie können entweder xUnit oder MSTest standardmäßig verwenden.You can use either xUnit or MSTest out of the box. Beide sind bestens für Komponententests für Ihre Bibliothek unter .NET Core geeignet.Both are perfectly suitable for unit testing your library on .NET Core. Wie Sie Ihre Lösung mit Testprojekten einrichten, hängt von der Struktur Ihrer Lösung ab.How you set up your solution with test projects will depend on the structure of your solution. Im folgenden Beispiel wird davon ausgegangen, dass Test- und Quellverzeichnisse im gleichen Verzeichnis auf oberster Ebene vorhanden sind.The following example assumes that the test and source directories live in the same top-level directory.

Hinweis

Es werden einige .NET Core CLI commands (.NET Core-CLI-Befehle) verwendet.This uses some .NET Core CLI commands. Weitere Informationen finden Sie unter dotnet new und dotnet sln.See dotnet new and dotnet sln for more information.

  1. Richten Sie Ihre Projektmappe ein.Set up your solution. Verwenden Sie dazu folgende Befehle:You can do so with the following commands:

    mkdir SolutionWithSrcAndTest
    cd SolutionWithSrcAndTest
    dotnet new sln
    dotnet new classlib -o MyProject
    dotnet new xunit -o MyProject.Test
    dotnet sln add MyProject/MyProject.csproj
    dotnet sln add MyProject.Test/MyProject.Test.csproj
    

    Dadurch werden Projekte erstellt, die zusammen in einer Projektmappe verknüpft werden.This will create projects and link them together in a solution. Ihr Verzeichnis für SolutionWithSrcAndTest sollte in etwa so aussehen:Your directory for SolutionWithSrcAndTest should look like this:

    /SolutionWithSrcAndTest
    |__SolutionWithSrcAndTest.sln
    |__MyProject/
    |__MyProject.Test/
    
  2. Navigieren Sie zum Verzeichnis des Testprojekts, und fügen Sie einen Verweis zu MyProject.Test von MyProject hinzu.Navigate to the test project's directory and add a reference to MyProject.Test from MyProject.

    cd MyProject.Test
    dotnet add reference ../MyProject/MyProject.csproj
    
  3. So stellen Sie Pakete wieder her und erstellen Projekte:Restore packages and build projects:

    dotnet restore
    dotnet build
    

    Hinweis

    Starting with .NET Core 2.0, you don't have to run dotnet restore because it's run implicitly by all commands, such as dotnet build and dotnet run, that require a restore to occur. It's still a valid command in certain scenarios where doing an explicit restore makes sense, such as continuous integration builds in Visual Studio Team Services or in build systems that need to explicitly control the time at which the restore occurs.

  4. Überprüfen Sie, ob xUnit durch Ausführung des dotnet test-Befehls ausgeführt wird.Verify that xUnit runs by executing the dotnet test command. Wenn Sie MSTests verwenden möchten, dann muss stattdessen das MSTest-Konsolenausführungsprogramm ausgeführt werden.If you chose to use MSTest, then the MSTest console runner should run instead.

Und das ist schon alles!And that's it! Jetzt können Sie Ihre Bibliothek mithilfe der Befehlszeilentools über alle Plattformen hinweg testen.You can now test your library across all platforms using command line tools. Nachdem jetzt alles eingerichtet ist, ist das weitere Testen Ihrer Bibliothek sehr einfach:To continue testing now that you have everything set up, testing your library is very simple:

  1. Nehmen Sie Änderungen an Ihrer Bibliothek vor.Make changes to your library.
  2. Führen Sie mit dem Befehl dotnet test in Ihrem Testverzeichnis Tests über die Befehlszeile aus.Run tests from the command line, in your test directory, with dotnet test command.

Der Code wird automatisch neu erstellt, wenn Sie den Befehl dotnet test aufrufen.Your code will be automatically rebuilt when you invoke dotnet test command.

So verwenden Sie mehrere ProjekteHow to use multiple projects

Eine häufige Anforderung an größere Bibliotheken ist es, Funktionalität in verschiedenen Projekten zu bieten.A common need for larger libraries is to place functionality in different projects.

Stellen Sie sich vor, Sie möchten eine Bibliothek erstellen, die in idiomatischem C# und F# benutzt wird.Imagine you wished to build a library which could be consumed in idiomatic C# and F#. Das würde bedeuten, dass Benutzer Ihrer Bibliotheken diese auf eine Art nutzen, die natürlich für C# und F# ist.That would mean that consumers of your library consume them in ways which are natural to C# or F#. In C# z.B. könnten Sie die Bibliothek wie folgt nutzen:For example, in C# you might consume the library like this:

using AwesomeLibrary.CSharp;

public Task DoThings(Data data)
{
    var convertResult = await AwesomeLibrary.ConvertAsync(data);
    var result = AwesomeLibrary.Process(convertResult);
    // do something with result
}

In F# wird wie folgt formuliert:In F#, it might look like this:

open AwesomeLibrary.FSharp

let doWork data = async {
    let! result = AwesomeLibrary.AsyncConvert data // Uses an F# async function rather than C# async method
    // do something with result
}

Solche Nutzungsszenarios bedeuten, dass die APIs, auf die zugegriffen wird, eine andere Struktur für C# und F# haben müssen.Consumption scenarios like this mean that the APIs being accessed have to have a different structure for C# and F#. Eine gängige Methode, dies zu erreichen ist, die gesamte Logik einer Bibliothek in ein Kernprojekt zu zerlegen, in dem C# und F# Projekte die API-Schichten definieren, die das Kernprojekt aufrufen.A common approach to accomplishing this is to factor all of the logic of a library into a core project, with C# and F# projects defining the API layers that call into that core project. Im übrigen Abschnitt werden die folgenden Namen verwendet:The rest of the section will use the following names:

  • AwesomeLibrary.Core – Ein Kernprojekt, das die gesamte Logik für die Bibliothek enthältAwesomeLibrary.Core - A core project which contains all logic for the library
  • AwesomeLibrary.CSharp – Ein Projekt mit öffentlichen APIs, die für den Gebrauch in C# vorgesehen sindAwesomeLibrary.CSharp - A project with public APIs intended for consumption in C#
  • AwesomeLibrary.FSharp – Ein Projekt mit öffentlichen APIs, die für den Gebrauch in F# vorgesehen sindAwesomeLibrary.FSharp - A project with public APIs intended for consumption in F#

Sie können die folgenden Befehle in Ihrem Terminal ausführen, um die gleiche Struktur wie dieses Handbuch zu erstellen:You can run the following commands in your terminal to produce the same structure as this guide:

mkdir AwesomeLibrary && cd AwesomeLibrary
dotnet new sln
mkdir AwesomeLibrary.Core && cd AwesomeLibrary.Core && dotnet new classlib
cd ..
mkdir AwesomeLibrary.CSharp && cd AwesomeLibrary.CSharp && dotnet new classlib
cd ..
mkdir AwesomeLibrary.FSharp && cd AwesomeLibrary.FSharp && dotnet new classlib -lang F#
cd ..
dotnet sln add AwesomeLibrary.Core/AwesomeLibrary.Core.csproj
dotnet sln add AwesomeLibrary.CSharp/AwesomeLibrary.CSharp.csproj
dotnet sln add AwesomeLibrary.FSharp/AwesomeLibrary.FSharp.fsproj

Dadurch werden die drei Projekte von oben in eine Projektmappe hinzugefügt, die sie verknüpft.This will add the three projects above and a solution file which links them together. Durch das Erstellen der Projektmappe und das Verknüpfen der Projekte können Sie Projekte auf oberster Ebene wiederherstellen und erstellen.Creating the solution file and linking projects will allow you to restore and build projects from a top-level.

Projekt-zu-Projekt-VerweiseProject-to-project referencing

Die beste Möglichkeit, auf ein Projekt zu verweisen, ist die Verwendung der .NET Core-CLI, um einen Projektverweis hinzuzufügen.The best way to reference a project is to use the .NET Core CLI to add a project reference. Sie können den folgenden Befehl von den Projektverzeichnissen AwesomeLibrary.CSharp und AwesomeLibrary.FSharp ausführen:From the AwesomeLibrary.CSharp and AwesomeLibrary.FSharp project directories, you can run the following command:

$ dotnet add reference ../AwesomeLibrary.Core/AwesomeLibrary.Core.csproj

Die Projektdateien für AwesomeLibrary.CSharp und AwesomeLibrary.FSharp verweisen nun auf AwesomeLibrary.Core als ProjectReference-Ziel.The project files for both AwesomeLibrary.CSharp and AwesomeLibrary.FSharp will now reference AwesomeLibrary.Core as a ProjectReference target. Sie können dies überprüfen, indem Sie die Projektdateien prüfen und Folgendes darin sehen:You can verify this by inspecting the project files and seeing the following in them:

<ItemGroup>
  <ProjectReference Include="..\AwesomeLibrary.Core\AwesomeLibrary.Core.csproj" />
</ItemGroup>

Sie können diesen Abschnitt jeder Projektdatei manuell hinzufügen, wenn Sie nicht die .NET Core-CLI verwenden möchten.You can add this section to each project file manually if you prefer not to use the .NET Core CLI.

Strukturieren einer ProjektmappeStructuring a solution

Ein weiterer wichtiger Aspekt bei mehreren Projekten in einer Projektmappe ist es, eine gute allgemeine Projektstruktur einzurichten.Another important aspect of multi-project solutions is establishing a good overall project structure. Sie können den Code beliebig organisieren, solange Sie jedes Projekt mit Ihrer Projektmappendatei mit dotnet sln add verknüpfen. Dadurch können Sie dotnet restore und dotnet build auf Projektmappenebene ausführen.You can organize code however you like, and as long as you link each project to your solution file with dotnet sln add, you will be able to run dotnet restore and dotnet build at the solution level.