WisdomSoft - for your serial experiences.

1.2 .NET Framework

.NET Framework の概要です。

1.2.1 Win32 から .NET へ

ウィンドウを表示したり図形やイメージを描画するプログラムの開発を行う前に、古い Windows 時代から、現代の Windows Vista までの簡単な歴史を話さなければなりません。幸か不幸か、開発においては Windows Vista や Windows XP といった最新の Windows も、Windows 95 のような古い Windows と互換性を保っています。つまり、Windows Vista のアプリケーション開発にも、Windows 95 時代の知識をそのまま使えるのです。

古い Windows では、ウィンドウを表示したり図形やイメージを描画するグラフィカルなアプリケーションを開発するには Windows 32 API と呼ばれる関数セットを使っていました。Windows 32 API は通称 Win32 API と呼ばれ、主に C 言語や C++ 言語から Windows アプリケーションを開発するために使われてきました。最新の Windows でも、基本は Win32 API の上で成り立っていると考えら、Win32 API をそのまま利用することができるのです。

しかし、Win32 API は C 言語用の関数ライブラリなので、再利用性や拡張性、生産性が乏しく、大規模なアプリケーションを構築するには相当な苦労が必要です。また、Win32 API の膨大な関数の関係を理解することも難しく、初心者や入門者には優しくないということも大きな問題です。何も表示しない純粋なウィンドウを表示するだけでも複雑な登録手続きが必要で、C 言語のソースコードで 50 行近くは記述していました。

こうした問題を解決するために C++ 言語のクラスを使って Win32 API 郡を隠蔽したラッパークラス郡を提供する Microsoft Foundation Class を Visual C++ で提供するなどの試みも行われましたが、Microsoft Foundation Class は Visual C++ でしか使えず、移植性も低くなるということから敬遠される傾向がありました。また、多くの専門家から「設計に問題があり、オブジェクト指向的ではない」と批判された こともありました。こうしたことから、Microsoft Foundation Class は Windows アプリケーション開発の標準と呼ばれる地位には到ることができないままです。

こうした問題を抜本的に解決するために、Microsoft は、新しいプログラム動作環境として Microsoft .NET を 2000 年に発表しました。.NET は、具体的な製品名ではなく、抽象化されたプログラミング実行環境を定義する仕様で す。.NET に対応しているアプリケーションは、システムに依存せずに実行することができます。.NET を Windows 上で実装することによって、Windows のバージョンや CPU などの物理的環境の違いを超えて、.NET アプリケーションを異なるシステム間で正しく実行することができるようになります。

最新の Windows Vista を含め、現在でも Windows プログラミングの根幹を支えているのは Win32 API です。しかし、.NET を利用することで、不便な Win32 を直接操作する必要は無くなり、複雑な手続きを簡素に記述することができるようになりました。最新の .NET 環境に移行すれば、生産性や移植性、アプリケーションの安全性を従来のアプリケーションよりも飛躍的に向上させることができるのです。

1.2.2 Microsoft .NET とは?

.NET とは、古い開発モデルだった Win32 API に代わって、システムを抽象化することによって、より生産性、再利用性、移植性、安全性の高いアプリケーションを開発することができる新しい開発環境であり、アプリケーション実行環境であることは前述したとおりです。具体的には、.NET という言葉自体は具体的な製品ではなく、アプリケーションを実行するための環境の約束事をまとめた仕様のことを表します。.NET に従っているシステムであれば、OS やコンピュータが異なっていても .NET アプリケーションを実行することができる、ということを意味します。

Microsoft が提供している .NET を実現した具体的な製品としては、Microsoft .NET Framework があります。.NET Framework は .NET の仕様にしたがった Windows プラットフォーム用の .NET 実行環境です。実質的に、現在市場で使われている .NET 環境は .NET Framework しか存在していませんが、Microsoft 社以外でも、.NET の仕様に従った仮想マシンを開発することができれば、.NET に対応したシステムを構築することが論理的には可能です。例えば、Windows 以外のシステムで .NET を実装することも不可能ではありませんが、本書執筆時点では、.NET と言えば .NET Framework のことであると考えて間違いはないでしょう。

.NET Framework は、Windows を隠蔽する仮想的なシステムです。.NET を実行環境としている .NET アプリケーションは、直接 Windows によって実行されるのではなく、.NET Framework の仮想マシンに読み込まれ、.NET Framework の中で実行されます。

.NET アプリケーションは、機械語のバイナリではなく、.NET の仕様に従った仮想的な中間言語 MSIL (Microsoft Intermediate Language) を保存しています。MSIL は Microsoft 中間言語とも呼ばれ、.NET 専用の機械語のようなものだと考えてください。CPU は直接 MSIL を実行することはできません。

MSIL を読み込んで実行するのは共通言語ランタイム、または CLR (Common Language Runtime) と呼ばれる仮想マシンです。共通言語ランタイムは、MSIL を解釈して、ネイティブシステム上で適切に実行するための翻訳機であり、一種のインタプリタのように動作します。MSIL と 共通言語ランタイムの関係は、同じような仮想システムを持つ Java における Java バイトコードと Java 仮想マシンに相当します。

図01 .NET の構造
.NET の構造

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

また、.NET アプリケーションは豊富な標準クラスライブラリを利用することができるため、様々な機能を API を呼び出し、組み合わせるだけで実現することができます。基本的な処理の多くはクラスライブラリで提供されているため、新たにロジックを組みなおす必要はありません。

1.2.3 開発言語

Microsoft .NET は、開発用プログラミング言語に様々な選択肢を用意しています。従来の Visual Basic 6.0 の性質を継承しつつ、.NET 用の言語拡張を行った Visual Basic .NET。.NET アプリケーション開発用に最適化されて新たに作られた C# 言語。C++ 言語に .NET 用の言語拡張を行った C++/CLI。Internet Explorer 上で動作するスクリプト言語である JScript に .NET 用の言語拡張を行った JScript .NET。そして、Java 言語に近い Visual J# などがあります。

  • Visual Basic .NET
  • C#
  • C++/CLI
  • JScript .NET
  • Visual J#

この他に、富士通が開発した NetCOBOL for .NET など、Microsoft 社以外の企業や団体が販売している環境も含めれば、言語の選択は非常に多くあります。おそらく、Microsoft は .NET 用に最適化した C# 言語を最も強く推奨しつつ、ホビーストに人気でユーザー数が多い Visual Basic .NET、プロフェッショナルの開発者が多く利用している C++ から移行が容易な C++/CLI の 3 つの言語を、.NET 開発用言語の中心に位置づけていると考えられます。

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

図02 実行までの流れ
実行までの流れ

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

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

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

本書では、最も .NET アプリケーション開発に最適化されている C# 言語を使って解説をします。本書は、基本的な .NET 開発の知識・経験がある読者を対象としているため、プログラミング言語の解説は行いません。C#、または他の .NET 系プログラミング言語を経験しているのであれば、本書のサンプルコードを読むことは難しくありません。