WisdomSoft - for your serial experiences.

Microsoft .NET

.NET Framework の概要と技術的な構造を説明します。

.NET の概念と構造

Microsoft .NET は、2000 年に Microsoft から発表された新しいアプリケーション実行環境のことです。Microsoft .NET そのものは、アプリケーションをサービスを構築・提供するシステム、またはその戦略的な概念を表すものですが、開発者にとっては OS に依存しない抽象化されたアプリケーションを開発するために定められている仕様であると考えてかまいません。

当然、構想や仕様だけではソフトウェアは動きません。.NET の構想を基に開発された .NET Framework が実在の製品として提供されています。仕様を定めている Microsoft が自身で開発した .NET Framework は、.NET 環境の事実上の標準として位置づけられています。

元々、2000 年前後に .NET が構想として存在していたころは、単に .NET と呼ぶと Microsoft の構想やブランドを指し、.NET 構想を具現化した実行環境を指すときに製品である .NET Framework と呼ぶ傾向がありました。例えば Visual Studio .NET など、製品名にブランドとして使われていたころがありました。しかし、現在では .NET を単体のブランドとして使うことはなくなり、「.NET Framework」に統一されています。

.NET Framework はシステムを抽象化するため、概念上は OS に依存しない仕組みなので他の OS にも実装することができます。ただし、Microsoft は Windows を中心とした自社製品を中心に .NET Framework を提供しています。PC 以外では、同社の音楽プレイヤーである Zune、同社のゲーム機である Xbox 360、携帯電話向けの OS である Windows Phone 等の実装が存在します。

Windows 以外では、オープンソースで開発されている Mono と呼ばれる環境が .NET Framework 互換の実行環境を実現しています。しかし、Microsoft が公式でサポートしている完全な .NET Framework 環境とは異なるため .NET Framework を完全に置き換えられるものではありません。現状では .NET アプリケーションも Windows 専用のアプリケーションと考えるべきでしょう。

.NET Framework に対応したアプリケーションは、.NET Framework に対応しているコンピュータ上であれば OS や CPU アーキテクチャなどの環境が異なっていても、理論上は共通の動作が保証されるという仕組みです。アプリケーション仮想化技術の一種と捉えることもできるでしょう。

.NET Framework は CPU に依存しない独自の機械語として 共通中間言語 (Common Intermediate Language/CIL) を定めており、共通中間言語で書かれている .NET アプリケーションは共通言語ランタイム (Common Language Runtime/CLR)に読み込まれ、共通言語ランタイムによって実行されます。

共通言語ランタイムは .NET アプリケーションに含まれている共通中間言語を読み込み、その意味を解釈して実行する仮想マシン(ソフトウェアで実装された仮想的な CPU)です。ソフトウェアでコンピュータを仮想化するという点では、エミュレータと呼ばれる部類のソフトウェアに近いとも言えます。.NET アプリケーションは、共通言語ランタイムを通して実行されるため OS の種類に関係なく同一のサービスを提供することができます。

.NET Framework は共通言語ランタイムだけではなく、様々な機能をアプリケーションに提供するクラスライブラリによって主要な機能を提供します。.NET Framework が標準でサポートしているクラスのことを基本クラスライブラリ(Base Class Library/BCL)と呼びます。

図1 .NET Framework の構造
.NET Framework の構造

共通言語ランタイムは、.NET アプリケーションからシステムを抽象化しています。.NET アプリケーションのコードを実行し、メモリを管理、コードの安全性の検査、セキュリティなど、アプリケーションを現在のシステムで実行するための様々な管理を代行してくれます。

こうした仕組みから、システムのネイティブなコードはランタイムによって管理されていないという意味からアンマネージコード(またはネイティブコード)と呼び、.NET アプリケーションとなってランタイムによって管理されるコードをマネージコードと呼ぶことがあります。

マネージコードはシステムを隠蔽し、ランタイムによって安全に実行されるため、無効なメモリ領域の参照による突然のクラッシュなど、危険なコードを実行してしまう可能性を少なくすることができます。また、共通言語ランタイムは不要になったメモリ領域を自動的に解放するため、不要なったメモリ領域を永遠に占有し続けてしまうメモリリークなどの問題も発生しません。自動メモリ管理の賜物です。

開発言語

.NET Framework は、開発用プログラミング言語に様々な選択肢を用意しています。共通言語ランタイムによって実行されるのは仮想的な機械語である共通中間言語であるため、共通中間言語を生成できるコンパイラさえ存在すれば、アプリケーションがどのような言語で記述されていたかは問題ではありません。

最も一般的な .NET アプリケーション開発用のプログラミング言語は、従来の Visual Basic 6.0 の性質を継承しつつ、.NET 用の言語拡張を行った Visual Basic .NET、.NET アプリケーション開発用に最適化されて新たに作られた C# 言語、そして C++ 言語に .NET 用の言語拡張を行った C++/CLI などがあります。やや特殊な用途で、関数型の F# という言語も使われています。

  • Visual Basic .NET
  • C#
  • C++/CLI
  • F#

この他に、Java と互換性のある文法を持った J# という言語も存在していますが、開発は停止しています。富士通が開発した NetCOBOL for .NET など、Microsoft 社以外の企業や団体が販売している環境も含めれば、言語の選択は非常に多くあります。

Microsoft は .NET 用に最適化されている C# 言語の使用を最も強く推奨しています。、ホビーストに人気でユーザー数が多い Visual Basic .NET、プロフェッショナルの開発者が多く利用している C++ から移行が容易な C++/CLI の 3 つの言語を、.NET 開発用言語の中心に位置づけていると考えられます。

どの言語を使っても、コンパイルの結果として生成されるのは共通中間言語を含んだ .NET アプリケーションです。例えば、C# 言語で開発したクラスライブラリを他の言語から利用するということも可能です。開発言語は共通中間言語を生成するための手段でしかなく、生成されたプログラムはどの言語から作られていようと同じ結果となります。

開発から実行までの流れ
開発から実行までの流れ

共通言語ランタイムは共通中間言語を含むアセンブリと呼ばれる実行単位を読み込んで実行します。アセンブリには、共通中間言語の他にも様々な情報を含んでいます。例えば、依存する他のアセンブリの情報や、プログラムから利用することができる何らかのリソース(イメージやアイコンなど)などが含まれます。

ここで言うアセンブリとは、実際には .exe や .dll など、従来の Windows アプリケーションと同じ実行ファイルとして提供されます。これらの実行ファイルは内部にアセンブリを含み、実行時に共通言語ランタイムに読み込まれて処理されます。よって、一般の利用者は .NET アプリケーションと標準の Windows アプリケーションを区別する必要はありません。

もちろん、.NET Framework が適切にインストールされていない場合は、.NET 対応アプリケーションを実行しようとしても、共通言語ランタイムを発見できないためエラーダイアログが表示されて終了するだけです。