クロス プラットフォーム ツールによるライブラリの開発Developing Libraries with Cross Platform Tools

この記事では、クロスプラットフォーム CLI ツールを使用して .NET 用ライブラリを作成する方法について説明します。This article covers how to write libraries for .NET using cross-platform CLI tools. CLI は、サポートされる任意の OS で動作する効率的で低レベルのエクスペリエンスを提供します。The CLI provides an efficient and low-level experience that works across any supported OS. Visual Studio でライブラリを構築することもできます。Visual Studio で構築する場合は、Visual Studio ガイドを参照してください。You can still build libraries with Visual Studio, and if that is your preferred experience refer to the Visual Studio guide.

必須コンポーネントPrerequisites

.NET Core SDK と CLI がコンピューターにインストールされている必要があります。You need the .NET Core SDK and CLI installed on your machine.

このドキュメントで .NET Framework バージョンについて扱うセクションでは、.NET Framework が Windows コンピューターにインストールされている必要があります。For the sections of this document dealing with .NET Framework versions, you need the .NET Framework installed on a Windows machine.

また、古い .NET Framework ターゲットをサポートする場合、.NET ターゲット プラットフォーム ページから古い .NET Framework バージョンの Targeting/Developer Pack をインストールする必要があります。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. 次の表を参照してください。Refer to this table:

.NET Framework のバージョン.NET Framework Version ダウンロードするものWhat to download
4.6.14.6.1 .NET Framework 4.6.1 Targeting Pack.NET Framework 4.6.1 Targeting Pack
4.64.6 .NET Framework 4.6 Targeting Pack.NET Framework 4.6 Targeting Pack
4.5.24.5.2 .NET Framework 4.5.2 Developer Pack.NET Framework 4.5.2 Developer Pack
4.5.14.5.1 .NET Framework 4.5.1 Developer Pack.NET Framework 4.5.1 Developer Pack
4.54.5 Windows 8 用 Windows ソフトウェア開発キットWindows Software Development Kit for Windows 8
4.04.0 Windows SDK for Windows 7 および .NET Framework 4Windows SDK for Windows 7 and .NET Framework 4
2.0、3.0、および 3.52.0, 3.0, and 3.5 .NET Framework 3.5 SP1 Runtime (または Windows 8 以降のバージョン).NET Framework 3.5 SP1 Runtime (or Windows 8+ version)

.NET Standard をターゲット設定する方法How to target the .NET Standard

.NET Standard にあまりなじみがない場合、詳細については、「.NET Standard」をご覧ください。If you're not quite familiar with the .NET Standard, refer to the .NET Standard to learn more.

この記事には、.NET Standard バージョンを多様な実装にマップする表が掲載されています。In that article, there is a table which maps .NET Standard versions to various implementations:

.NET Standard.NET Standard 1.01.0 1.11.1 1.21.2 1.31.3 1.41.4 1.51.5 1.61.6 2.02.0
.NET Core.NET Core 11.0 11.0 11.0 11.0 11.0 11.0 11.0 2.02.0
.NET Framework 1.NET Framework 1 4.54.5 4.54.5 4.5.14.5.1 4.64.6 4.6.14.6.1 4.6.14.6.1 4.6.14.6.1 4.6.14.6.1
MonoMono 4.64.6 4.64.6 4.64.6 4.64.6 4.64.6 4.64.6 4.64.6 5.45.4
Xamarin.iOSXamarin.iOS 10.010.0 10.010.0 10.010.0 10.010.0 10.010.0 10.010.0 10.010.0 10.1410.14
Xamarin.MacXamarin.Mac 3.03.0 3.03.0 3.03.0 3.03.0 3.03.0 3.03.0 3.03.0 3.83.8
Xamarin.AndroidXamarin.Android 7.07.0 7.07.0 7.07.0 7.07.0 7.07.0 7.07.0 7.07.0 8.08.0
ユニバーサル Windows プラットフォームUniversal Windows Platform 10.010.0 10.010.0 10.010.0 10.010.0 10.010.0 10.0.1629910.0.16299 10.0.1629910.0.16299 10.0.1629910.0.16299
WindowsWindows 8.08.0 8.08.0 8.18.1
Windows PhoneWindows Phone 8.18.1 8.18.1 8.18.1
Windows Phone SilverlightWindows Phone Silverlight 8.08.0

1 .NET Framework のバージョン リストは、.NET Core SDK 2.0 以降のバージョンのツールに適用されます。以前のバージョンでは、.NET Standard 1.5 以降で別のマッピングが使用されます。Visual Studio 2017 にアップグレードできない場合は、Visual Studio 2015 用の .NET Core のツールをダウンロードできます。1 The versions listed for .NET Framework apply to .NET Core SDK 2.0 and later versions of the tooling. Older versions used a different mapping for .NET Standard 1.5 and higher. You can download tooling for .NET Core tools for Visual Studio 2015 if you cannot upgrade to Visual Studio 2017.

  • 列は .NET Standard バージョンです。The columns represent .NET Standard versions. 各見出しセルは、そのバージョンの .NET Standard に追加された API に関するドキュメントのリンクになっています。Each header cell is a link to a document that shows which APIs got added in that version of .NET Standard.
  • 行は、各 .NET 実装です。The rows represent the different .NET implementations.
  • 各セルのバージョン番号は、その .NET Standard バージョンをターゲットにするために必要な最小バージョンの実装です。The version number in each cell indicates the minimum version of the implementation you'll need in order to target that .NET Standard version.
  • 対話型のテーブルについては、「.NET Standard バージョン」を参照してください。For an interactive table, see .NET Standard versions.

ライブラリを作成する目的でこの表の意味について説明します。Here's what this table means for the purposes of creating a library:

選択する .NET Standard のバージョンは、最新の API にアクセスできることと、より多くの .NET 実装と .NET Standard バージョンをターゲット設定できることのトレードオフで決まります。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. ターゲット設定可能なプラットフォームとバージョンの範囲は、netstandardX.X のバージョンを選択し (X.X はバージョン番号です)、プロジェクト ファイル (.csproj または .fsproj) に追加することで制御します。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).

.NET Standard をターゲット設定する場合、ニーズに応じて主に 3 つのオプションがあります。You have three primary options when targeting the .NET Standard, depending on your needs.

  1. テンプレートに指定されている既定のバージョンの .NET Standard (netstandard1.4) を使用できます。これで .NET Standard 上のほとんどの API にアクセスできますが、UWP、.NET Framework 4.6.1、近日公開される .NET Standard 2.0 との互換性もあります。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. プロジェクト ファイルの TargetFramework ノードの値を変更することで、.NET Standard の下位または上位バージョンを使用することができます。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 バージョンは下位互換性があります。.NET Standard versions are backward compatible. つまり、netstandard1.0 ライブラリは、netstandard1.1 プラットフォーム以降で実行されます。That means that netstandard1.0 libraries run on netstandard1.1 platforms and higher. ただし、上位互換性はないため、古い .NET Standard プラットフォームは新しいプラットフォームを参照できません。However, there is no forward compatibility - lower .NET Standard platforms cannot reference higher ones. つまり、netstandard1.0 ライブラリは、netstandard1.1 以降をターゲットとするライブラリを参照できません。This means that netstandard1.0 libraries cannot reference libraries targeting netstandard1.1 or higher. API とプラットフォームを適切に組み合わせ、ニーズに対応できる Standard バージョンを選択してください。Select the Standard version that has the right mix of APIs and platform support for your needs. 現時点では netstandard1.4 が推奨されます。We recommend netstandard1.4 for now.

  3. .NET Framework バージョン 4.0 以前をターゲットにする場合、または .NET Framework では利用できて .NET Standard では利用できない API (System.Drawing など) を使用する場合は、マルチターゲットの方法について次のセクションを参照してください。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.

.NET Framework をターゲット設定する方法How to target the .NET Framework

注意

次の手順では、.NET Framework がコンピューターにインストールされていると想定しています。These instructions assume you have the .NET Framework installed on your machine. 依存関係のインストールについては、「前提条件」を参照してください。Refer to the Prerequisites to get dependencies installed.

ここで使用されている .NET Framework バージョンには、現在サポートされていないものもあります。Keep in mind that some of the .NET Framework versions used here are no longer in support. サポートされないバージョンについては、「.NET Framework Support Lifecycle Policy FAQ」(.NET Framework のサポート ライフサイクル ポリシーについてよく寄せられる質問) を参照してください。Refer to the .NET Framework Support Lifecycle Policy FAQ about unsupported versions.

最大数の開発者とプロジェクトを対象にしたい場合、基準となるターゲットは .NET Framework 4.0 です。If you want to reach the maximum number of developers and projects, use the .NET Framework 4.0 as your baseline target. .NET Framework をターゲット設定するには、まず、サポートしたい .NET Framework バージョンに対応する正しいターゲット フレームワーク モニカー (TFM) を使用します。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

この TFM をプロジェクト ファイルの TargetFramework セクションに挿入します。You then insert this TFM into the TargetFramework section of your project file. .NET Framework 4.0 をターゲットとするライブラリを作成する例を次に示します。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>

以上です。And that's it! これは .NET Framework 4 向けにのみコンパイルされていますが、新しいバージョンの .NET Framework のライブラリを使用できます。Although this compiled only for the .NET Framework 4, you can use the library on newer versions of the .NET Framework.

マルチターゲットを設定する方法How to Multitarget

注意

次の手順では、.NET Framework がコンピューターにインストールされている想定です。The following instructions assume you have the .NET Framework installed on your machine. インストールする必要がある依存関係と、そのダウンロードできる場所については、「前提条件」セクションを参照してください。Refer to the Prerequisites section to learn which dependencies you need to install and where to download them from.

プロジェクトが .NET Framework と .NET Core の両方をサポートしている場合、状況によっては古いバージョンの .NET Framework をターゲットにする必要があります。You may need to target older versions of the .NET Framework when your project supports both the .NET Framework and .NET Core. このシナリオで、新しい API と新しいターゲット向けの言語構成を使用する場合、コードで #if ディレクティブを使用します。In this scenario, if you want to use newer APIs and language constructs for the newer targets, use #if directives in your code. また、必要に応じて、ターゲットにする各プラットフォームに応じて異なるパッケージと依存関係追加して、それぞれに異なる必要な API を含めます。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.

たとえば、HTTP 上でネットワークキング操作を行うライブラリがあるとします。For example, let's say you have a library that performs networking operations over HTTP. .NET Standard と .NET Framework バージョン 4.5 以降の場合、System.Net.Http 名前空間の HttpClient クラスを使用できます。For .NET Standard and the .NET Framework versions 4.5 or higher, you can use the HttpClient class from the System.Net.Http namespace. ただし、それより前のバージョンの .NET Framework に HttpClient クラスはないので、代わりに System.Net 名前空間の WebClient クラスを使用できます。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.

プロジェクト ファイルは次のようになります。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>

主な変更点が 3 つあります。You'll notice three major changes here:

  1. TargetFramework ノードは TargetFrameworks で置き換えられ、3 つの TFM が内部に表現されています。The TargetFramework node has been replaced by TargetFrameworks, and three TFMs are expressed inside.
  2. 1 つの .NET Framework 参照を取り込む net40 ターゲットの <ItemGroup> ノードがあります。There is an <ItemGroup> node for the net40 target pulling in one .NET Framework reference.
  3. .NET Framework の参照 2 に取り込む net45 ターゲットの <ItemGroup> ノードがあります。There is an <ItemGroup> node for the net45 target pulling in two .NET Framework references.

ビルド システムは #if ディレクティブで使用される次のプリプロセッサ シンボルを認識します。The build system is aware of the following preprocessor symbols used in #if directives:

ターゲット フレームワークTarget Frameworks シンボルSymbols
.NET Framework.NET Framework NET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET47, NET471, NET472NET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET47, NET471, NET472
.NET Standard.NET Standard NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0
.NET Core.NET Core NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1

次に、ターゲットごとに条件付きコンパイルを利用する例を示します。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
    }
}

dotnet build を使用してこのプロジェクトをビルドすると、bin/ フォルダー以下に 3 つのディレクトリがあることがわかります。If you build this project with dotnet build, you'll notice three directories under the bin/ folder:

net40/
net45/
netstandard1.4/

各ディレクトリには、各ターゲットの .dll ファイルがあります。Each of these contain the .dll files for each target.

.NET Core でライブラリをテストする方法How to test libraries on .NET Core

プラットフォーム全体でテストできることが重要です。It's important to be able to test across platforms. xUnit または MSTest はそのまま利用できます。You can use either xUnit or MSTest out of the box. どちらも、.NET Core 上のライブラリの単体テストに最適です。Both are perfectly suitable for unit testing your library on .NET Core. テスト プロジェクトでソリューションをセットアップする方法は、ソリューションの構造によって異なります。How you set up your solution with test projects will depend on the structure of your solution. 次の例は、テスト ディレクトリとソース ディレクトリが同じ最上位ディレクトリにある場合です。The following example assumes that the test and source directories live in the same top-level directory.

注意

この例ではいくつかの .NET CLI コマンドを使用しています。This uses some .NET Core CLI commands. 詳細については、「dotnet new」と「dotnet sln」を参照してください。See dotnet new and dotnet sln for more information.

  1. ソリューションを設定します。Set up your solution. 次のコマンドで実行することができます。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
    

    これでプロジェクトが作成され、ソリューション内のプロジェクトがリンクされます。This will create projects and link them together in a solution. SolutionWithSrcAndTest のディレクトリは次のようになります。Your directory for SolutionWithSrcAndTest should look like this:

    /SolutionWithSrcAndTest
    |__SolutionWithSrcAndTest.sln
    |__MyProject/
    |__MyProject.Test/
    
  2. テスト プロジェクトのディレクトリに移動し、MyProject から MyProject.Test への参照を追加します。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. パッケージを復元し、プロジェクトをビルドします。Restore packages and build projects:

    dotnet restore
    dotnet build
    

    注意

    .NET Core 2.0 以降、dotnet restore を実行する必要がなくなりました。dotnet newdotnet builddotnet run のような、復元を必要とするあらゆるコマンドによって暗黙的に実行されるためです。Starting with .NET Core 2.0, you don't have to run dotnet restore because it's run implicitly by all commands that require a restore to occur, such as dotnet new, dotnet build and dotnet run. Azure DevOps Services の継続的インテグレーション ビルドなど、明示的な復元が合理的となる一部のシナリオや、復元の時刻を明示的に制御する必要があるビルド システムでは、引き続き有効なコマンドとなります。It's still a valid command in certain scenarios where doing an explicit restore makes sense, such as continuous integration builds in Azure DevOps Services or in build systems that need to explicitly control the time at which the restore occurs.

  4. dotnet test コマンドを実行して、xUnit が実行されることを確認します。Verify that xUnit runs by executing the dotnet test command. MSTest を使用する場合は、MSTest コンソール実行ツールが実行されることを確認します。If you chose to use MSTest, then the MSTest console runner should run instead.

以上です。And that's it! コマンド ライン ツールを使用して、すべてのプラットフォームでライブラリをテストできるようになりました。You can now test your library across all platforms using command line tools. すべてをセットアップしてテストに進む場合、ライブラリのテストはとても単純です。To continue testing now that you have everything set up, testing your library is very simple:

  1. ライブラリに変更を加えます。Make changes to your library.
  2. コマンド ラインから、dotnet test コマンドを使用してテスト ディレクトリでテストを実行します。Run tests from the command line, in your test directory, with dotnet test command.

dotnet test コマンドを呼び出すと、コードは自動的にリビルドされます。Your code will be automatically rebuilt when you invoke dotnet test command.

複数のプロジェクトを使用する方法How to use multiple projects

大規模なライブラリで一般的なニーズは、複数のプロジェクトに機能を配置することです。A common need for larger libraries is to place functionality in different projects.

たとえば、慣用的な C# や F# で使用できるライブラリをビルドするとします。Imagine you wished to build a library which could be consumed in idiomatic C# and F#. これは、ライブラリのユーザーは、C# または F# に対して自然な方法で使用することを意味します。That would mean that consumers of your library consume them in ways which are natural to C# or F#. たとえば、C# の場合、次のようにライブラリを使用できます。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
}

F# の場合は次のようになります。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
}

このような使用シナリオは、アクセスされる API が C# と F# 用に異なる構造を持つ必要があることを示します。Consumption scenarios like this mean that the APIs being accessed have to have a different structure for C# and F#. これを実現する一般的なアプローチとして、ライブラリのすべてのロジックをコア プロジェクトに取り入れ、C# および F# プロジェクトでコア プロジェクトに呼び出す API レイヤーを定義する方法があります。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. 以降のセクションでは、次の名前を使用します。The rest of the section will use the following names:

  • AwesomeLibrary.Core - ライブラリのすべてのロジックを含むコア プロジェクトAwesomeLibrary.Core - A core project which contains all logic for the library
  • AwesomeLibrary.CSharp - C# で使用するためのパブリック API を含むプロジェクトAwesomeLibrary.CSharp - A project with public APIs intended for consumption in C#
  • AwesomeLibrary.FSharp - F# で使用するためのパブリック API を含むプロジェクトAwesomeLibrary.FSharp - A project with public APIs intended for consumption in F#

自分の端末で次のコマンドを実行し、このガイドと同じ構造を作成することができます。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

これで上記の 3 つのプロジェクトと、プロジェクトをリンクするソリューション ファイルが追加されます。This will add the three projects above and a solution file which links them together. ソリューション ファイルとリンクするプロジェクトを作成すると、最上位レベルからプロジェクトを復元し、ビルドできるようになります。Creating the solution file and linking projects will allow you to restore and build projects from a top-level.

プロジェクト間参照Project-to-project referencing

プロジェクトを参照するには、.NET Core CLI を使用してプロジェクト参照を追加することをお勧めします。The best way to reference a project is to use the .NET Core CLI to add a project reference. AwesomeLibrary.CSharpAwesomeLibrary.FSharp のプロジェクト ディレクトリから、次のコマンドを実行できます。From the AwesomeLibrary.CSharp and AwesomeLibrary.FSharp project directories, you can run the following command:

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

AwesomeLibrary.CSharpAwesomeLibrary.FSharp の両方のプロジェクト ファイルは、ProjectReference ターゲットとして AwesomeLibrary.Core を参照するようになります。The project files for both AwesomeLibrary.CSharp and AwesomeLibrary.FSharp will now reference AwesomeLibrary.Core as a ProjectReference target. この参照を確認するには、プロジェクト ファイルに以下の行があることを確認します。You can verify this by inspecting the project files and seeing the following in them:

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

この .NET Core CLI を使用しない場合は、このセクションを各プロジェクト ファイルに手動で追加します。You can add this section to each project file manually if you prefer not to use the .NET Core CLI.

ソリューションの構築Structuring a solution

マルチプロジェクト ソリューションのもう 1 つの重要な側面は、全体のプロジェクト構造を適切に構築することです。Another important aspect of multi-project solutions is establishing a good overall project structure. ただし、dotnet sln add でソリューション ファイルに各プロジェクト ファイルがリンクされ、ソリューション レベルで dotnet restoredotnet build を実行できる限り、好みに応じてコードを整理することができます。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.