Visual Studio を使用して .NET Core アプリを展開する

.NET Core アプリケーションは、アプリケーション バイナリは含むが、対象のシステムに .NET Core があるかどうかに依存するフレームワークに依存する展開、またはアプリケーションと .NET Core バイナリの両方を含む自己完結型の展開のいずれかで展開できます。 .NET Core アプリケーションの展開の概要については、「.NET Core アプリケーションの展開」を参照してください。

次のセクションでは、Microsoft Visual Studio を使用して、次のような展開を作成する方法を示します。

  • フレームワークに依存する展開
  • サードパーティの依存関係を含む、フレームワークに依存する展開
  • 自己完結型の展開
  • サードパーティの依存関係を含む、自己完結型の展開

Visual Studio を使用して、.NET Core アプリケーションを開発する方法の詳細については、.NET Core の依存関係と要件に関する記事を参照してください。

フレームワークに依存する展開

サードパーティの依存関係を含まない、フレームワークに依存する展開を展開するプロセスには、アプリのビルド、テスト、および発行が含まれます。 C# で記述された次の単純な例は、このプロセスを示しています。

  1. プロジェクトを作成します。

    [ファイル]>[新規作成]>[プロジェクト] を順に選択します。 [新しいプロジェクト] ダイアログの [インストール] プロジェクトの種類ウィンドウでお使いの言語 (C# または Visual Basic) のプロジェクト カテゴリを展開し、 [.NET Core] を選択し、中央のウィンドウで [コンソール アプリケーション (.NET Core)] テンプレートを選択します。 [名前] テキスト ボックスに、"FDD" などのプロジェクト名を入力します。 [OK] ボタンを選択します。

  2. アプリケーションのソース コードを追加します。

    エディターで Program.cs または Program.vb ファイルを開き、自動生成されたコードを次のコードに置き換えます。 テキストの入力を求めるプロンプトが表示されてから、ユーザーが入力した個々の単語が表示されます。 正規表現 \w+ を使用して、入力テキストの単語を分離します。

    using System;
    using System.Text.RegularExpressions;
    
    namespace Applications.ConsoleApps
    {
        public class ConsoleParser
        {
            public static void Main()
            {
                Console.WriteLine("Enter any text, followed by <Enter>:\n");
                String? s = Console.ReadLine();
                ShowWords(s ?? "You didn't enter anything.");
                Console.Write("\nPress any key to continue... ");
                Console.ReadKey();
            }
    
            private static void ShowWords(String s)
            {
                String pattern = @"\w+";
                var matches = Regex.Matches(s, pattern);
                if (matches.Count == 0)
                {
                    Console.WriteLine("\nNo words were identified in your input.");
                }
                else
                {
                    Console.WriteLine($"\nThere are {matches.Count} words in your string:");
                    for (int ctr = 0; ctr < matches.Count; ctr++)
                    {
                        Console.WriteLine($"   #{ctr,2}: '{matches[ctr].Value}' at position {matches[ctr].Index}");
                    }
                }
            }
        }
    }
    
    Imports System.Text.RegularExpressions
    
    Namespace Applications.ConsoleApps
        Public Module ConsoleParser
            Public Sub Main()
                Console.WriteLine("Enter any text, followed by <Enter>:")
                Console.WriteLine()
                Dim s = Console.ReadLine()
                ShowWords(s)
                Console.Write($"{vbCrLf}Press any key to continue... ")
                Console.ReadKey()
            End Sub
    
            Private Sub ShowWords(s As String)
                Dim pattern = "\w+"
                Dim matches = Regex.Matches(s, pattern)
                Console.WriteLine()   
                If matches.Count = 0 Then
                    Console.WriteLine("No words were identified in your input.")
                Else
                    Console.WriteLine($"There are {matches.Count} words in your string:")
                    For ctr = 0 To matches.Count - 1
                        Console.WriteLine($"   #{ctr,2}: '{matches(ctr).Value}' at position {matches(ctr).Index}")
                    Next
                End If
                Console.WriteLine()
            End Sub
        End Module
    End Namespace
    
    
  3. アプリのデバッグ ビルドを作成します。

    [ビルド]>[ソリューションのビルド] を順に選択します。 [デバッグ]>[デバッグ開始] を選択して、アプリケーションのデバッグ ビルドをコンパイルして、実行することも可能です。

  4. アプリを展開します。

    プログラムをデバッグしてテストしたら、アプリと共に配置するファイルを作成します。 Visual Studio から発行するには、次の操作を行います。

    1. アプリの (デバッグではなく) リリース バージョンを構築するために、ツールバーでソリューションの構成を [デバッグ] から [リリース] に変更します。

    2. ソリューション エクスプローラーで (ソリューションではなく) プロジェクトを右クリックし、 [発行] を選択します。

    3. [発行] タブで [発行] を選択します。 Visual Studio が、アプリケーションを構成するファイルをローカル ファイル システムに書き込みます。

    4. これで [発行] タブには、 [FolderProfile] という 1 つのプロファイルが表示されます。 プロファイルの構成設定が、タブの [概要] セクションに表示されます。

    作成されたファイルは、ご自分のプロジェクトの .\bin\release\netcoreapp2.1 サブディレクトリのサブディレクトリ内にある、Publish (Windows の場合) または publish (Unix システムの場合) という名前のディレクトリに配置されます。

アプリケーションのファイルと共に、発行プロセスは、アプリに関するデバッグ情報を含むプログラム データベース (.pdb) ファイルを出力します。 このファイルは、主に例外のデバッグに役立ちます。 これを、アプリケーションのファイルにはパッケージ化しないよう選択できます。 ただし、アプリのリリース ビルドをデバッグする場合のために、保存しておくことをお勧めします。

アプリケーション ファイルの完全なセットは、任意の方法で展開できます。 たとえば、Zip ファイルにパッケージ化したり、単純な copy コマンドを使用したり、任意のインストール パッケージで展開したりできます。 インストールしたら、ユーザーはアプリケーションを、dotnet コマンドを使用し、dotnet fdd.dll などのアプリケーションのファイル名を提供して実行できます。

また、アプリケーション インストールの一環として、インストーラーはアプリケーション バイナリに加えて、共有フレームワーク インストーラーをバンドルするか、または前提条件として共有フレームワークがあるか確認する必要があります。 共有フレームワークのインストールは、コンピューター全体が対象なので、管理者/ルート アクセスを必要とします。

サードパーティの依存関係を含む、フレームワークに依存する展開

1 つ以上のサードパーティの依存関係を備えたフレームワークに依存する展開を展開するには、すべての依存関係をプロジェクトに使用できる必要があります。 アプリをビルドする前に、次の追加手順が必要です。

  1. NuGet パッケージ マネージャーを使用し、プロジェクトに NuGet パッケージへの参照を追加します。このとき、パッケージがシステムにまだない場合はそれをインストールします。 パッケージ マネージャーを開くには、 [ツール]>[NuGet パッケージ マネージャー]>[ソリューションの NuGet パッケージの管理] を順に選択します。

  2. サードパーティの依存関係 (Newtonsoft.Json など) がシステムにインストールされていることを確認し、インストールされていない場合はインストールします。 [インストール済み] タブに、システムにインストールされた NuGet パッケージの一覧が表示されます。 Newtonsoft.Json がそこにない場合、 [参照] タブを選択し、検索ボックスに "Newtonsoft.Json" と入力します。 Newtonsoft.Json を選択し、右側のウィンドウでプロジェクトを選択してから、 [インストール] を選択します。

  3. Newtonsoft.Json が既にシステムにインストールされている場合、 [ソリューション パッケージの管理] タブの右のウィンドウからプロジェクトを選択し、プロジェクトに追加します。

サードパーティの依存関係を含む、フレームワークに依存する展開は、サードパーティの依存関係と同じ移植性を持ちます。 たとえば、サードパーティ ライブラリが macOS のみをサポートする場合、そのアプリを Windows システムに移植することはできません。 この状況は、サードパーティの依存関係自体がネイティブ コードに依存する場合に生じる可能性があります。 このよい例は、libuv に対してネイティブの依存関係が必要な Kestrel サーバーです。 このようなサードパーティの依存関係を含むアプリケーションに対して FDD が作成されると、発行された出力には、ネイティブの依存関係がサポートする (そして、その NuGet パッケージ内に存在する) 各ランタイム識別子 (RID) のフォルダーが含まれます。

サードパーティの依存関係を含まない、自己完結型の展開

サードパーティの依存関係を含まない自己完結型の展開を展開するプロセスには、プロジェクトの作成、csprojファイルの変更、アプリのビルド、テスト、および発行が含まれます。 C# で記述された次の単純な例は、このプロセスを示しています。 フレームワーク依存の展開の場合と同じように、ご自分のプロジェクトの作成、コーディング、テストを開始します。

  1. プロジェクトを作成します。

    [ファイル]>[新規作成]>[プロジェクト] を順に選択します。 [新しいプロジェクト] ダイアログの [インストール] プロジェクトの種類ウィンドウでお使いの言語 (C# または Visual Basic) のプロジェクト カテゴリを展開し、 [.NET Core] を選択し、中央のウィンドウで [コンソール アプリケーション (.NET Core)] テンプレートを選択します。 [名前] テキスト ボックスに、"SCD" などのプロジェクト名を入力し、 [OK] ボタンを選択します。

  2. アプリケーションのソース コードを追加します。

    エディターで Program.cs または Program.vb ファイルを開き、自動生成されたコードを次のコードに置き換えます。 テキストの入力を求めるプロンプトが表示されてから、ユーザーが入力した個々の単語が表示されます。 正規表現 \w+ を使用して、入力テキストの単語を分離します。

    using System;
    using System.Text.RegularExpressions;
    
    namespace Applications.ConsoleApps
    {
        public class ConsoleParser
        {
            public static void Main()
            {
                Console.WriteLine("Enter any text, followed by <Enter>:\n");
                String? s = Console.ReadLine();
                ShowWords(s ?? "You didn't enter anything.");
                Console.Write("\nPress any key to continue... ");
                Console.ReadKey();
            }
    
            private static void ShowWords(String s)
            {
                String pattern = @"\w+";
                var matches = Regex.Matches(s, pattern);
                if (matches.Count == 0)
                {
                    Console.WriteLine("\nNo words were identified in your input.");
                }
                else
                {
                    Console.WriteLine($"\nThere are {matches.Count} words in your string:");
                    for (int ctr = 0; ctr < matches.Count; ctr++)
                    {
                        Console.WriteLine($"   #{ctr,2}: '{matches[ctr].Value}' at position {matches[ctr].Index}");
                    }
                }
            }
        }
    }
    
    Imports System.Text.RegularExpressions
    
    Namespace Applications.ConsoleApps
        Public Module ConsoleParser
            Public Sub Main()
                Console.WriteLine("Enter any text, followed by <Enter>:")
                Console.WriteLine()
                Dim s = Console.ReadLine()
                ShowWords(s)
                Console.Write($"{vbCrLf}Press any key to continue... ")
                Console.ReadKey()
            End Sub
    
            Private Sub ShowWords(s As String)
                Dim pattern = "\w+"
                Dim matches = Regex.Matches(s, pattern)
                Console.WriteLine()   
                If matches.Count = 0 Then
                    Console.WriteLine("No words were identified in your input.")
                Else
                    Console.WriteLine($"There are {matches.Count} words in your string:")
                    For ctr = 0 To matches.Count - 1
                        Console.WriteLine($"   #{ctr,2}: '{matches(ctr).Value}' at position {matches(ctr).Index}")
                    Next
                End If
                Console.WriteLine()
            End Sub
        End Module
    End Namespace
    
    
  3. グローバリゼーション インバリアント モードを使用するかどうかを決定します。

    特にアプリの対象が Linux の場合、グローバリゼーション インバリアント モードを活用することで展開の合計サイズを減らすことができます。 グローバリゼーション インバリアント モードは、全世界を意識するものではなく、インバリアント カルチャの書式設定規則、大文字/小文字の区別規則、文字列比較、並べ替え順序を使用できるアプリケーションにとって便利です。

    インバリアント モードを有効にするには、ソリューション エクスプローラーで (ソリューションではなく) プロジェクトを右クリックし、 [SCD.csproj の編集] または [SCD.vbproj の編集] を選択します。 次の強調表示された行をファイルに追加します。

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <Nullable>enable</Nullable>
      </PropertyGroup>
    
      <ItemGroup>
        <RuntimeHostConfigurationOption Include="System.Globalization.Invariant" Value="true" />
      </ItemGroup> 
    
    </Project>
    
  4. アプリケーションのデバッグ ビルドを作成します。

    [ビルド]>[ソリューションのビルド] を順に選択します。 [デバッグ]>[デバッグ開始] を選択して、アプリケーションのデバッグ ビルドをコンパイルして、実行することも可能です。 このデバッグ手順では、ホスト プラットフォームで実行するときのアプリケーションの問題を特定できます。 引き続き、それぞれのターゲット プラットフォームでテストする必要があります。

    グローバリゼーション インバリアント モードを有効にした場合、カルチャ感度の高いデータの欠如が自分のアプリケーションに適しているのかどうかを特にテストしてください。

デバッグが終了したら、自己完結型の展開を発行できます。

プログラムをデバッグしてテストしたら、アプリと共に展開するファイルをアプリの対象のプラットフォームごとに作成します。

Visual Studio でアプリを発行するには、次の操作を行います。

  1. アプリの対象プラットフォームを定義します。

    1. ソリューション エクスプローラーで (ソリューションではなく) プロジェクトを右クリックし、 [Edit SCD.csproj]\(SCD.csproj の編集\) を選択します。

    2. csproj ファイルの <PropertyGroup> セクションに、アプリの対象のプラットフォームを定義する <RuntimeIdentifiers> タグを作成し、対象とするプラットフォームごとにランタイム識別子 (RID) を指定します。 なお、RID を分離するにはセミコロンを追加する必要があります。 ランタイム識別子の一覧については、ランタイム識別子のカタログに関するページを参照してください。

    たとえば、次の例は、アプリが 64 ビット Windows オペレーティング システムおよび 64 ビット OS X オペレーティング システムで実行されることを示します。

    <PropertyGroup>
       <RuntimeIdentifiers>win-x64;osx-x64</RuntimeIdentifiers>
    </PropertyGroup>
    

    <RuntimeIdentifiers> 要素は、csproj ファイルの任意の <PropertyGroup> に入れることが可能です。 csproj ファイルの完全なサンプルは、このセクションの後の部分で示しています。

  2. アプリケーションを発行します。

    プログラムをデバッグしてテストしたら、アプリと共に展開するファイルをアプリの対象のプラットフォームごとに作成します。

    Visual Studio でアプリを発行するには、次の操作を行います。

    1. アプリの (デバッグではなく) リリース バージョンを構築するために、ツールバーでソリューションの構成を [デバッグ] から [リリース] に変更します。

    2. ソリューション エクスプローラーで (ソリューションではなく) プロジェクトを右クリックし、 [発行] を選択します。

    3. [発行] タブで [発行] を選択します。 Visual Studio が、アプリケーションを構成するファイルをローカル ファイル システムに書き込みます。

    4. これで [発行] タブには、 [FolderProfile] という 1 つのプロファイルが表示されます。 プロファイルの構成設定が、タブの [概要] セクションに表示されます。 [Target Runtime] (ターゲット ランタイム) では、発行されたランタイムを識別し、 [対象の場所] は自己完結型の展開が書き込まれた場所を識別します。

    5. Visual Studio は、発行されたすべてのファイルを、既定で 1 つのディレクトリに書き込みます。 ターゲット ランタイムごとに別のプロファイルを作成し、発行したファイルはプラットフォームごとのディレクトリに配置すると便利なのでお勧めします。 これを行う場合、対象のプラットフォームごとに別の発行プロファイルも作成します。 ここでは、次の手順でプラットフォームごとにアプリケーションを再構築します。

      1. [発行] ダイアログで、 [新しいプロファイルの作成] を選択します。

      2. [発行先を選択]ダイアログで [フォルダーを選択] の場所を bin\Release\PublishOutput\win-x64 に変更します。 [OK] を選択します。

      3. 新しいプロファイル (FolderProfile1) をプロファイルの一覧から選択し、 [Target Runtime] \(ターゲット ランタイム\) が win-x64 であることを確認します。 違う場合は、 [設定] を選択します。 [プロファイルの設定] ダイアログで、 [Target Runtime] \(ターゲット ランタイム\) を win-x64 に変更して、 [保存] を選択します。 それ以外の場合、 [キャンセル] を選択します。

      4. 64 ビットの Windows 10 プラットフォーム用にアプリを発行するために、 [発行] を選択します。

      5. 前の手順を繰り返して、osx-x64 プラットフォームのプロファイルを作成します。 [対象の場所]bin\Release\PublishOutput\osx-x64 で、[ターゲット ランタイム]osx-x64 です。 Visual Studio がこのプロファイルに割り当てる名前は、FolderProfile2 です。

    それぞれの対象の場所には、アプリの起動に必要なファイルの完全なセット (アプリ ファイルとすべての .NET Core ファイルの両方) が含まれています。

アプリケーションのファイルと共に、発行プロセスは、アプリに関するデバッグ情報を含むプログラム データベース (.pdb) ファイルを出力します。 このファイルは、主に例外のデバッグに役立ちます。 これを、アプリケーションのファイルにはパッケージ化しないよう選択できます。 ただし、アプリのリリース ビルドをデバッグする場合のために、保存しておくことをお勧めします。

発行したファイルは、任意の方法で展開できます。 たとえば、Zip ファイルにパッケージ化したり、単純な copy コマンドを使用したり、任意のインストール パッケージで展開したりできます。

このプロジェクトの完全な csproj ファイルを次に示します。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RuntimeIdentifiers>win-x64;osx-x64</RuntimeIdentifiers>
  </PropertyGroup>
</Project>

サードパーティの依存関係を含む、自己完結型の展開

1 つまたは複数のサードパーティの依存関係を含む自己完結型の展開を展開するプロセスには、依存関係の追加が含まれます。 アプリをビルドする前に、次の追加手順が必要です。

  1. NuGet パッケージ マネージャーを使用し、プロジェクトに NuGet パッケージへの参照を追加します。このとき、パッケージがシステムにまだない場合はそれをインストールします。 パッケージ マネージャーを開くには、 [ツール]>[NuGet パッケージ マネージャー]>[ソリューションの NuGet パッケージの管理] を順に選択します。

  2. サードパーティの依存関係 (Newtonsoft.Json など) がシステムにインストールされていることを確認し、インストールされていない場合はインストールします。 [インストール済み] タブに、システムにインストールされた NuGet パッケージの一覧が表示されます。 Newtonsoft.Json がそこにない場合、 [参照] タブを選択し、検索ボックスに "Newtonsoft.Json" と入力します。 Newtonsoft.Json を選択し、右側のウィンドウでプロジェクトを選択してから、 [インストール] を選択します。

  3. Newtonsoft.Json が既にシステムにインストールされている場合、 [ソリューション パッケージの管理] タブの右のウィンドウからプロジェクトを選択し、プロジェクトに追加します。

このプロジェクトの完全な csproj ファイルを次に示します。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RuntimeIdentifiers>win-x64;osx-x64</RuntimeIdentifiers>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
  </ItemGroup>
</Project>

アプリケーションを展開すると、アプリで使用されるすべてのサードパーティの依存関係も、アプリケーション ファイルに含まれています。 アプリが実行されているシステムには、サードパーティ ライブラリは必要ありません。

サードパーティ ライブラリを含む自己完結型の展開は、そのライブラリでサポートされるプラットフォームにのみ展開できます。 これは、フレームワークに依存する展開にサード パーティの依存関係とネイティブの依存関係があり、ネイティブの依存関係は前にインストールしていた場合を除き、対象のプラットフォームにない場合と似ています。

関連項目