.NET とは何ですか? 概要

.NET は、次のようなさまざまな種類のアプリをビルドするための無料のオープンソース開発プラットフォームです。

クラス ライブラリを使用して、異なるアプリとアプリの種類の間で機能を共有します。

.NET を使用すると、ビルドするアプリの種類に関係なく、コードおよびプロジェクト ファイルの外観が同じになります。 各アプリで同じランタイム、API、および言語の機能にアクセスできます。

クロス プラットフォーム

次のような多くのオペレーティング システム用の .NET アプリを作成できます。

  • Windows
  • macOS
  • Linux
  • Android
  • iOS
  • tvOS
  • watchOS

サポートされているプロセッサ アーキテクチャは次のとおりです。

  • X64
  • x86
  • ARM32
  • ARM64

.NET の場合、オペレーティング システム API などのプラットフォーム固有の機能を使用することができます。 例として、Windows 上の Windows フォームと WPF、および Xamarin からの各モバイル プラットフォームへのネイティブ バインドがあります。

詳細については、サポートされている OS ライフサイクル ポリシー.NET RID カタログに関するページを参照してください。

無料かつオープン ソース。

.NET は無料かつオープン ソースであり、MIT および Apache 2 ライセンスを使用します。 .NET は .NET Foundation のプロジェクトです。

詳細については、GitHub.com のプロジェクト リポジトリの一覧を参照してください。

サポート

.NET は、Windows、macOS、および Linux 上で Microsoft によってサポートされています。 セキュリティと品質に関する更新は、毎月第 2 火曜日に定期的に行われます。

Microsoft からの .NET のバイナリ配布は、Azure 内の Microsoft が管理するサーバーでビルドされてテストされ、Microsoft のエンジニアリングおよびセキュリティ プラクティスに従っています。

Red Hat Enterprise Linux (RHEL) 上の .NET は Red Hat によってサポートされています。 Red Hat とマイクロソフトが共同して、.NET Core が RHEL 上で適切に動作するようにします。

Tizen プラットフォーム上の .NET は Tizen によってサポートされています。

詳細については、「.NET Core および .NET 5 のリリースとサポート」を参照してください。

.NET Core、.NET Framework、Mono、UWP

.NET にはさまざまな種類があります。それは正式には "実装" と呼ばれています。 .NET 5+ (.NET Core など) は最新の実装であり、あらゆるプラットフォームで実行されます。 .NET Framework は .NET のオリジナル実装であり、Windows でのみ実行されます。 Mono は小さなランタイムが必要なときに使用されます。 ユニバーサル Windows プラットフォーム (UWP) は、最新の Windows アプリのビルドに使用されます。

各実装にはランタイムとクラス ライブラリが含まれます。 アプリケーション フレームワークと開発ツールも含まれることがあります。

.NET Standard は .NET の実装ではなく、.NET の複数実装のためのクラス ライブラリ開発を可能にする API 仕様です。

詳細については、「.NET 実装」を参照してください。

ツールと生産性

.NET を使用すると、言語、統合開発環境 (IDE)、およびその他のツールを選択できます。

プログラミング言語

.NET によって、次の 3 つのプログラミング言語がサポートされます。

  • C#

    C# ("シー シャープ" と読みます) は、最新のタイプ セーフなオブジェクト指向のプログラミング言語です。 C# は C 言語ファミリーをルーツとしているため、C、C++、Java、JavaScript のプログラマーであればすぐに使いこなすことができます。

  • F#

    F# は、簡潔、堅牢かつパフォーマンスに優れたコードを作成するための、オープンソースでクロスプラットフォームの相互運用可能なプログラミング言語です。 プログラミングの細部ではなく、ご自身の問題領域に集中し続けることができます。 F# プログラミングはデータ指向であり、コードでは関数を使用してデータを変換する必要があります。

  • Visual Basic

    .NET 言語の中で Visual Basic の構文は通常の人間の言語に最も近いため、より簡単に習得できます。 Microsoft が新機能を積極的に開発している C# や F# とは異なり、Visual Basic 言語は安定しています。 Visual Basic は Web アプリではサポートされていませんが、Web API ではサポートされています。

.NET 言語でサポートされる機能をいくつか以下に示します。

IDE

.NET 用の統合開発環境には、次のようなものがあります。

  • Visual Studio

    Windows でのみ実行されます。 .NET で動作するように設計された豊富な機能が組み込まれています。 Community Edition は無料であり、学生、オープンソースの共同作成者、および個人向けです。

  • Visual Studio Code

    Windows、macOS、Linux 上で実行される。 無料かつオープン ソース。 拡張機能は、.NET 言語での作業に使用できます。

  • Visual Studio for Mac

    macOS でのみ実行されます。 iOS、Android、および Web 用の .NET アプリとゲームを開発するためのものです。

  • GitHub Codespaces

    オンラインの Visual Studio Code 環境 (現在はベータ版)。

SDK とランタイム

.NET SDK は、.NET アプリケーションを開発および実行するためのライブラリとツールのセットです。

.NET をダウンロードするときに、.NET ランタイムや ASP.NET Core ランタイムなどの、SDK または "ランタイム" を選択できます。

  • .NET アプリを実行するために準備するコンピューターに、マネージド プログラムの実行環境であるランタイムをインストールします。
  • 開発に使用するコンピューター上に SDK をインストールします。 SDK をダウンロードすると、それと共にランタイムを自動的に取得することになります。

SDK のダウンロードには次のコンポーネントが含まれます。

  • .NET CLI。 ローカル開発および継続的インテグレーション スクリプトに使用できるコマンドライン ツール。
  • dotnetdotnet。 フレームワーク依存アプリを実行する CLI コマンド。
  • Roslyn および F# プログラミング言語コンパイラ。
  • MSBuild ビルド エンジン。
  • .NET ランタイム。 型システム、アセンブリ読み込み、ガベージ コレクター、ネイティブ相互運用機能、およびその他の基本的なサービスを提供します。
  • ランタイム ライブラリ。 プリミティブ データ型および基本的なユーティリティを提供します。
  • ASP.NET Core ランタイム。 Web アプリ、IoT アプリ、モバイル バックエンドなど、インターネットに接続されたアプリ用の基本的なサービスを提供します。
  • デスクトップ ランタイム。 Windows フォームや WPF など、Windows デスクトップ アプリ用の基本的なサービスを提供します。

ランタイムのダウンロードには、次のコンポーネントが含まれます。

  • (省略可能) デスクトップまたは ASP.NET Core ランタイム。
  • .NET ランタイム。 型システム、アセンブリ読み込み、ガベージ コレクター、ネイティブ相互運用機能、およびその他の基本的なサービスを提供します。
  • ランタイム ライブラリ。 プリミティブ データ型および基本的なユーティリティを提供します。
  • dotnetdotnet。 フレームワーク依存アプリを実行する CLI コマンド。

詳細については、次のリソースを参照してください。

プロジェクト システムと MSBuild

.NET アプリは、MSBuild を使用してソース コードからビルドされます。 プロジェクト ファイル ( .csproj.fsproj、または .vbproj) により、ターゲットと、コードのコンパイル、パッキング、公開を行う関連タスクが指定されます。 ターゲットとタスクの標準コレクションを参照する SDK 識別子があります。 これらの識別子を使用すると、プロジェクト ファイルのサイズを小さく保つのに役立ち、操作しやすくなります。 たとえば、次のようなコンソール アプリのプロジェクト ファイルです。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>
</Project>

Web アプリの場合は次のようになります。

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>
</Project>

これらの例では、Project 要素の Sdk 属性によって、プロジェクトをビルドする一連の MSBuild ターゲットとタスクが指定されます。 TargetFramework 要素によって、アプリが依存する .NET のバージョンが指定されます。 プロジェクト ファイルを編集して、プロジェクトに固有のターゲットとタスクをさらに追加することができます。

詳細については、.NET プロジェクト SDK の概要 に関するページと、ターゲット フレームワークに関するページを参照してください。

CI/CD

MSBuild と .NET CLI は、次のようなさまざまな継続的インテグレーション ツールと環境で使用できます。

詳細については、継続的インテグレーション (CI) での .NET SDK とツールの使用に関するページを参照してください

NuGet

NuGet は、.NET 用に設計されたオープンソースのパッケージ マネージャーです。 NuGet パッケージは、拡張子が .zip ファイルであり、コンパイル済みのコード (DLL)、そのコードに関連する他のファイル、パッケージのバージョン番号などの情報が記述されているマニフェストが含まれます。 開発者はコードを共有して、パッケージを作成し、それらを nuget.org またはパブリック ホストに公開します。 共有コードを使用する開発者はプロジェクトにパッケージを追加し、その後、プロジェクト コードでパッケージによって公開される API を呼び出すことができます。

詳細については、NuGet に関するドキュメントを参照してください。

.NET インタラクティブ

.NET Interactive は、ユーザーが Web、マークダウン、ノートブック全体の対話型エクスペリエンスを作成できるようにする CLI ツールと API のグループです。

詳細については、次のリソースを参照してください。

実行モデル

共通言語ランタイム (CLR) と呼ばれるランタイム環境では、.NET アプリによってマネージド コードが実行されます。

CLR

.NET CLR は、Windows、macOS、Linux のサポートを含むクロスプラットフォーム ランタイムです。 CLR は、メモリの割り当てと管理を行います。 CLR は、アプリの実行だけでなく、Just-In-Time (JIT) コンパイラを使用してコードを生成してコンパイルする仮想マシンでもあります。

詳細については、「共通言語ランタイム (CLR) の概要」を参照してください。

JIT コンパイラと IL

C# などの高レベル .NET 言語は、中間言語 (IL) と呼ばれるハードウェアに依存しない命令セットにコンパイルされます。 アプリを実行すると、JIT コンパイラにより、プロセッサで認識されるマシン コードに IL が変換されます。 JIT コンパイルは、コードが実行されるのと同じマシン上で行われます。

JIT コンパイルはアプリケーションの実行中に行われるため、コンパイル時間は実行時間の一部になります。 したがって、JIT コンパイラを使用して、コードの最適化に要する時間と、結果のコードによって得られる時間の節約のバランスを取る必要があります。 しかし、JIT コンパイラによって実際のハードウェアが認識されるため、開発者は異なるプラットフォームに対して異なる実装を提供する必要がなくなります。

.NET JIT コンパイラを使用すると、"階層型コンパイル" を実行できます。これは、実行時に個々のメソッドを再コンパイルできることを意味します。 この機能を使用すると、すぐにコンパイルできると同時に、頻繁に使用されるメソッドに対して高度に調整されたバージョンのコードを引き続き生成できます。

詳細については、「マネージド実行プロセス」と「階層型コンパイル」を参照してください。

AOT コンパイラ

ほとんどの .NET ワークロードの既定のエクスペリエンスは JIT コンパイラですが、.NET により、次の 2 つの形式の Ahead-Of-Time (AOT) コンパイルが提供されます。

  • 一部のシナリオでは、100% の AOT コンパイルが必要です。 例として、iOS があります。
  • その他のシナリオでは、ほとんどのアプリのコードは AOT コンパイルされますが、一部は JIT コンパイルされます。 一部のコード パターンは AOT には適していません (ジェネリックなど)。 この形式の AOT コンパイルの例として、ready-to-run publish オプションがあります。 この形式の AOT により、欠点のない AOT の利点が提供されます。

自動メモリ管理

"ガベージ コレクター" (GC) によって、アプリケーションのメモリの割り当てと解放が管理されます。 コードで新しいオブジェクトが作成されるたびに、CLR によって、マネージド ヒープからオブジェクトにメモリが割り当てられます。 マネージド ヒープに使用可能なアドレス空間がある限り、ランタイムは新しいオブジェクト用に領域の割り当てを続けます。 十分な空きアドレス空間が残っていない場合、GC により、アプリケーションで使用されなくなったマネージド ヒープ内のオブジェクトが確認されます。 その後、そのメモリが再利用されます。

GC は、"メモリの安全性" の確保に役立つ CLR サービスの 1 つです。 割り当てられているメモリのみにプログラムがアクセスする場合、そのプログラムはメモリ セーフです。 たとえば、ランタイムでは、配列の範囲を超えた割り当てられていないメモリにアプリがアクセスしていないことを確認します。

詳細については、「自動メモリ管理」と「ガベージ コレクションの基礎」を参照してください。

アンマネージ リソースの操作

コードで "アンマネージ リソース" を参照する必要がある場合があります。 アンマネージ リソースは、.NET ランタイムで自動的に維持されないリソースです。 たとえば、ファイル ハンドルは、アンマネージ リソースです。 FileStream オブジェクトはマネージ オブジェクトですが、アンマネージドのファイル ハンドルを参照します。 FileStream の使用が終わったら、ファイル ハンドルを明示的に解放する必要があります。

.NET では、アンマネージ リソースを参照するオブジェクトは IDisposable インターフェイスを実装します。 オブジェクトの使用が終わったら、すべてのアンマネージ リソースを解放する、オブジェクトの Dispose() メソッドを呼び出します。 .NET 言語によって、便利な using ステートメント (usingF#VB) が提供されます。これにより、 メソッドが確実に呼び出されます。

詳細については、「アンマネージ リソースのクリーンアップ」を参照してください。

デプロイ モデル

.NET アプリは、次の 2 つの異なるモードで公開できます。

  • アプリを "自己完結型" として公開すると、.NET ランタイムライブラリ、およびアプリケーションとその依存関係を含む実行可能ファイルが生成されます。 そのアプリケーションのユーザーは、.NET ランタイムがインストールされていないコンピューター上でそれを実行することができます。 自己完結型アプリはプラットフォーム固有であり、必要に応じて、AOT コンパイルの形式を使用して公開できます。

  • アプリを "フレームワーク依存" として公開すると、アプリケーション自体とその依存関係のみを含む実行可能ファイルとバイナリ ファイル ( .dll ファイル) が生成されます。 そのアプリケーションのユーザーは、.NET ランタイムを個別にインストールする必要があります。 実行可能ファイルはプラットフォーム固有ですが、フレームワークに依存するアプリケーションの .dll ファイルはクロスプラットフォームです。

    複数のバージョンのランタイムを並行してインストールし、異なるバージョンのランタイムをターゲットとするフレームワーク依存アプリを実行することができます。 詳細については、ターゲット フレームワークに関するページを参照してください。

実行可能ファイルは、ランタイム識別子 (RID) で指定する特定のターゲット プラットフォームに対して生成されます。

詳細については、.NET アプリケーションの公開の概要に関するページと「.NET および Docker の概要」を参照してください。

ランタイム ライブラリ

.NET には、ランタイム ライブラリフレームワーク ライブラリ、または基本クラス ライブラリ (BCL) と呼ばれるクラス ライブラリの広範な標準セットが用意されています。 これらのライブラリによって、多くの汎用およびワークロード固有の型とユーティリティ機能の実装が提供されます。

.NET ランタイム ライブラリで定義されている型の例をいくつか以下に示します。

詳細については、「ランタイム ライブラリの概要」を参照してください。 ライブラリのソース コードは GitHub の dotnet/runtime リポジトリにあります。

ランタイム ライブラリの拡張機能

一般的に使用される一部のアプリケーション機能のライブラリは、ランタイム ライブラリには含まれませんが、次のような NuGet パッケージで使用できます。

NuGet パッケージ ドキュメント
Microsoft.Extensions.Hosting アプリケーションの有効期間の管理 (汎用ホスト)
Microsoft.Extensions.DependencyInjection 依存関係の挿入 (DI)
Microsoft.Extensions.Configuration Configuration
Microsoft.Extensions.Logging Logging
Microsoft.Extensions.Options オプションのパターン

詳細については、GitHub の dotnet/extensions リポジトリを参照してください。

データ アクセス

.NET によって、オブジェクト リレーショナル マッパー (ORM) と、コードで SQL クエリを記述する方法が提供されます。

Entity Framework Core

Entity Framework (EF) Core は、オープン ソースのクロスプラットフォーム データアクセス テクノロジであり、ORM として使用できます。 EF Core を使用すると、コードで .NET オブジェクトを参照してデータベースを操作できます。 これにより、書き込みとテストに必要なデータアクセス コードの量が減ります。 EF Core では多くのデータベース エンジンがサポートされます。

詳細については、「Entity Framework Core」と「データベース プロバイダー」を参照してください。

LINQ

統合言語クエリ (LINQ) を使用すると、データを操作するための宣言型コードを記述できます。 データは (メモリ内オブジェクト、SQL データベース、XML ドキュメントなどの) さまざまな形式にすることができますが、記述する LINQ コードは通常、どのデータ ソースでも違いがないように見えます。

詳細については、LINQ (統合言語クエリ) の概要に関するページを参照してください。

用語

時間の経過と共に一部の用語の使用法がどのように変わったかを知っておくと、.NET に関するドキュメントを理解するのに役立ちます。

.NET Core および .NET 5+

2002 年に、Microsoft によって、Windows アプリを作成するための開発プラットフォームである .NET Framework がリリースされました。 現在、.NET Framework はバージョン 4.8 であり、引き続き Microsoft によってサポートされます。

2014 年に、Microsoft によって、.NET Framework のクロスプラットフォームのオープンソースの後継版として .NET Core が導入されました。 この新しい .NET の実装では、バージョン 3.1 までは .NET Core という名前が保持されていました。 .NET Core 3.1 の次のバージョンからは .NET 5 という名前になりました。 そのため、.NET 5+ (プラス記号は「以降のバージョン」を意味します) と .NET Core は、.NET の 1 つの同じ実装を指しています。

.NET Framework と .NET Core/5+ 間の混乱を避けるため、バージョン番号 4 はスキップされました。 "Core" という名前は、これが現在、.NET の主な実装であることを明確にするために ".NET Core" から削除されました。 "Core" は、バージョン 5+ の ASP.NET CoreEntity Framework Core という名前に残されています。

ドキュメントで .NET Standard も参照されています。 .NET Standard は、.NET の複数の実装用のクラス ライブラリを開発できる API 仕様です。

オーバーロードされた用語

.NET の用語の一部は混乱を招く可能性があります。これは、異なるコンテキストで同じ単語が異なる方法で使用されるためです。 より顕著な例をいくつか以下に示します。

  • .NET

    .NET は、すべての .NET 実装を含む、開発プラットフォーム全体の総称です。 より最近では、 .NET という用語は、すべての .NET Core バージョン (1.0 - 3.1) と、.NET 5 や 6 などの、名前から "Core" が削除されたそれ以降のバージョンを含む .NET の実装を特に指すこともあります。

  • ランタイム

    Context "ランタイム" の意味
    共通言語ランタイム (CLR) マネージド プログラムの実行環境。 OS は、ランタイム環境の一部ですが、.NET ランタイムの一部ではありません。
    .NET のダウンロード ページの .NET ランタイム CLR およびランタイム ライブラリ。これらは組み合わせて使用され、フレームワーク依存アプリを実行するためのサポートが提供されます。 このページには、ASP.NET Core サーバー アプリと Windows デスクトップ アプリのランタイムの選択肢が示されます。
    ランタイム識別子 (RID) .NET アプリが実行される OS プラットフォームおよび CPU アーキテクチャ。 次に例を示します。Windows x64、Linux x64。
  • フレームワーク

    Context "フレームワーク" の意味
    .NET Framework .NET の元の Windows のみの実装。 "Framework" の頭文字は大文字です。
    ターゲット フレームワーク .NET アプリまたはライブラリが依存する API のコレクション。 例: .NET Core 3.1、.NET Standard 2.0
    ターゲット フレームワーク モニカー (TFM) TFM は、.NET アプリまたはライブラリのターゲット フレームワークを指定するための標準化されたトークン形式です。 例: .NET Framework 4.6.2 の net462
    フレームワークに依存するアプリ .NET のダウンロード ページからランタイムをインストールしたコンピューター上でのみ実行できるアプリ。 この使用法の "フレームワーク" は、.NET のダウンロード ページからダウンロードする "ランタイム" と同じものです。
    フレームワーク ライブラリ ランタイム ライブラリのシノニムとして使用されることがあります。
  • SDK

    Context "SDK" の意味
    .NET のダウンロード ページの SDK .NET アプリを開発して実行するためにダウンロードしてインストールするツールとライブラリのコレクション。 CLI、MSBuild、.NET ランタイム、およびその他のコンポーネントが含まれています。
    SDK スタイルのプロジェクト 特定の種類のアプリのプロジェクトをビルドする方法を指定する、一連の MSBuild ターゲットとタスク。 この意味での SDK は、プロジェクト ファイル内の Project 要素の Sdk 属性を使用して指定されます。
  • platform

    Context "プラットフォーム" の意味
    クロス プラットフォーム この用語での "プラットフォーム" は、オペレーティング システムとそれが動作するハードウェア (Windows、macOS、Linux、iOS、Android) を意味します。
    .NET プラットフォーム 使用法はさまざまです。 .NET の 1 つの実装 (.NET Framework や .NET 5+ など)、またはすべての実装を含む .NET の包括的な概念を指す場合があります。
  • CLI

    頭字語が示す意味 説明
    コマンド ライン インターフェイス .NET アプリケーションを開発、ビルド、実行、発行するためのクロスプラットフォーム ツールチェーン。
    共通言語基盤 CLR で実装される仕様。

.NET の用語の詳細については、「.NET 用語集」を参照してください。

高度なシナリオ

以下のセクションでは、高度なシナリオで役立つ .NET のいくつかの機能について説明します。

ネイティブ相互運用

どのオペレーティング システムにも、システム サービスを提供するアプリケーション プログラミング インターフェイス (API) が含まれています。 .NET には、その API を呼び出すためのいくつかの方法が用意されています。

ネイティブ API と相互運用する主な方法は、"プラットフォーム呼び出し" (略して P/Invoke) を使用するものです。 P/Invoke は、Linux および Windows プラットフォーム全体でサポートされています。 Windows 限定で相互運用を行う方法は "COM 相互運用" と呼ばれます。これは、マネージド コードで COM コンポーネントを操作する場合です。 これは、P/Invoke インフラストラクチャ上に構築されますが、動作は少し異なります。

詳細については、「ネイティブ相互運用性」を参照してください。

アンセーフ コード

言語サポートに応じて、CLR の unsafe コードによって、ネイティブ メモリにアクセスしたりポインターの算術演算を実行したりできるようになります。 この操作は、特定のアルゴリズムおよびシステム相互運用性のために必要です。 アンセーフ コードの使用は強力ですが、システム API との相互運用を行ったり、最も効率的なアルゴリズムを実装したりする必要がなければ、推奨されません。 アンセーフ コードは、環境が異なると同じように実行されない可能性があり、さらにガベージ コレクターとタイプ セーフの利点が得られない場合があります。 可能な限りアンセーフ コードのみに制限し、そのコードを徹底的にテストすることをお勧めします。

詳細については、アンセーフ コードとポインターに関するページを参照してください。

次のステップ