■ .NET Framework
- 開発と実行の新しいプラットフォーム
.NET 言語と共通言語仕様 (CLS)
.NET Framework クラスライブラリ
共通言語ランタイム (CLR)
Windows 上の分散システムをデザインするための Windows DNA はあまりにも有名です。しかし、この Windows DNA は、プレゼンテーション、ビジネス、データの各層をデザインするための技術がそれぞれ別々に存在していました。つまり、Windows DNA アーキテクチャを利用した分散アプリケーションを作成するには、各層の技術に関して高度な、しかも別々の知識/技術が必要でした。
一方、.NET Framework は、これら、すべての層をカバーする開発と実行のプラットフォームを提供します (図 6)。
具体的には、
- .NET 言語と共通言語仕様 (CLS:Common Language Specification)
- .NET Framework クラスライブラリ
- 共通言語ランタイム (CLR:Common Language Runtime)
が存在します。
図 6: .NET Framework 主要コンポーネント
.NET 言語と共通言語仕様 (CLS:Common Language Specification)
共通言語仕様とは、.NET 言語が共通で利用する言語機能のサブセットです。このサブセットに準拠する言語 (ここでは .NET 言語と呼んでいます) では、言語間の相互利用が容易です。また、.NET Framework 対応のアプリケーションは、複数の .NET 言語による開発が可能です。
.NET Framework クラスライブラリ
.NET Framework が提供するクラスライブラリは、ユーザーやプログラムのインターフェイスを提供するライブラリ、データアクセスのためのライブラリ、標準的な機能を提供するライブラリに分けることができます。
インターフェイスの提供は、Windows アプリケーションだけでなく、Web アプリケーションを利用したユーザーインターフェイスや、XML Web サービスといったプログラミングインターフェイスを Visual Basic .NET で提供できることを意味しています。
また、データアクセスのための ADO や XML など、従来 COM コンポーネントとして追加提供されていた機能が、.NET Framework に組み込まれていることを確認することができます。
標準的なシステムレベルの機能を提供するライブラリは特に基本クラスライブラリと呼ばれます。
共通言語ランタイム (CLR:Common Language Runtime)
共通言語ランタイムは、その名の通り、.NET 言語共通のランタイム (実行エンジン) です。メモリ管理やガベージコレクションなど、.NET Framework の土台となる変更要素を含んでいます。この利点として、
- 多くをランタイムが提供してくれるため、開発者が多くのコーディングをしなくてもよい
- 下部のアーキテクチャが隠蔽されることにより、その処理を考えなくてよい
をあげることができます。しかし、もともと Visual Basic 自身がこのような設計思想に基づいて作られていたため、私たちにとっては、大きなニュースではありません (多分この恩恵は、Visual Basic と同じランタイムを利用することになった Visual Basic .NET 以外の .NET 言語が受けた恩恵でしょう)。
これ以外の利点として、DLL Hell の終焉 (「DLL Hellの終焉」参照) や、容易なデプロイメント (配置:「容易なデプロイメント」参照) をあげることができます。
ガベージコレクションと Visual Basic
ガベージコレクションは、実は Visual Basic 開発者にとっては、必ずしもうれしい追加機能とはいえません。なぜなら、Visual Basic はもともと、オブジェクトを参照している変数がスコープを抜けるなどして参照から外れると、自動的にオブジェクトが破棄されていました。つまり、自動メモリ解放機能であるガベージコレクションのような機能は、備わっていたといえます。
そして、.NET Framework の 「ガベージコレクション」 は、Visual Basic の 「ガベージコレクションのような機能」 と違う点があります。それは、オブジェクトが破棄されるタイミングです。共通言語ランタイムでは、メモリが必要だと判断したときに、ガベージコレクションを行ないます。言い換えると、必要でなければいつまでたってもガベージコレクションが行なわれないわけです。たとえば、後処理 (Visual Basic .NET では Class_Terminate イベントの代わりに Finalize メソッドを利用します) を記述していたとしても、忘れたころに、それが実行されるかもしれないのです。つまり、Visual Basic 開発者が期待する、
「参照している変数がスコープを抜けた」→「オブジェクト破棄」→「後処理」
という一連の流れは、期待通りのタイミングで行なわれるとは限らないということを覚えておかなくてはいけません。