.NET Framework の概要とクラスライブラリ
編集注: この記事は、ソフトバンク パブリッシング株式会社発行の月刊 C Magazine 2002 年 7 月号に掲載された 「最新プログラミングインターフェイス 見せます .NET Framework の全部」 を元に一部加筆しております。
C Magazine の Web サイト : http://www.cmagazine.jp/
目次
Introduction
グラフィックス (GDI+)
メッセージキューと I/O
コレクションとリフレクション
Web アプリケーション
スレッド
Windows アプリケーション
データベース
XML
デバッグ用の機能
そのほかの機能
まとめ
Introduction
.NET Framework とは
Microsoft がインターネットをプラットフォームとする .NET 構想を打ち出し、その .NET の世界を実現させるための開発ツールとして Visual Studio .NET が発売されました。Visual Studio .NET は前バージョンである Visual Studio 6.0 を大幅に進化させた開発環境ですが、その中でもいちばん進化した点は .NET Framework を採用した点です。
歴史を紐解いてみますと、Windows のアプリケーションを作成するための手法として最も源流に位置する方法が Windows API を使用する方法です。PC 上のプログラミング経験が 10 年以上の方であれば経験されている方も多いと思われますが、DOS のファンクションコールを使用したアプリケーションの開発手法から Windows のイベントドリブン型への開発手法への転換は、プログラマに発想の転換と API の知識を要求しました。DOS 上のアプリケーションの開発経験が豊富な人でも、Windows 上のアプリケーションを作成するために書籍や SDK を片手に再び勉強したわけです。
そこで開発者の負担を軽減させるために、いくつかのクラスライブラリや開発ツールが出現しました。MFC や Borland の OWL は Windows API を使いやすくするために生まれたクラスライブラリです。Visual Basic は開発手法そのものを Windows API をまったく意識しない形式へと変化させました。Delphi は VCL というクラスライブラリを搭載し、Windows API の隠蔽と開発効率の向上を図っています。これらのクラスライブラリや開発ツールは、Windows API をいかに使いやすい形態で開発者に提供するかという視点で作成されています。
.NET Framework は Windows API を使いやすくするものではなく、Windows API に変わるプログラミング インターフェースとして提供されます。.NET Framework はクラスライブラリだけではなく、共通言語ランタイム (Common Language Runtime) という実行エンジンも含んでいます。共通言語ランタイムは、安全で堅牢なプログラムの実行をつかさどるだけでなく、その名前の通りさまざまな開発言語で使用できる実行エンジンです。共通言語ランタイムに対応した開発言語は、同一のクラスライブラリを使用できるだけでなく、言語を越えたクラスの継承や例外の処理を行うことができます。対応言語としては、Microsoft の Visual Basic、Visual C++ 以外にも .NET Framework のために新たに作成された開発言語である C# があります。さらに富士通は COBOL 言語を .NET 対応に対応させた NetCOBOL を発表し、Borland も Delphi の .NET 対応を表明しています。
.NET Framework の名前空間とクラスライブラリ
.NET Framework の名前空間とクラスの階層を理解するためには、Visual Studio .NET ファミリーのパッケージ製品に含まれている階層図ポスターを眺めることがいちばん効果的です。ポスターは全部で 5 種類があり (表 1) 、そのうち 4 枚の表面が .NET Framework のクラス階層図です。4 枚すべてを横に並べて壁に貼ると約 3 メートルになるという膨大なものです。MFC のクラス階層図と比較しても 3 倍近い量となっています。このように、.NET Framework が膨大な機能を提供していることがポスターからも読み取れます。ポスターには、名前空間ごとにそれぞれの名前空間に含まれるクラス、インターフェースの一覧を掲載されていますので、目的のクラスを含む名前空間を逆引きすることができます。
ここでは、階層図ポスターの順に .NET Framework の主な名前空間について説明します。
表面 | 裏面 | 大きさ (cm) |
---|---|---|
.NET Framework の名前空間とクラス | Visual Studio .NET オートメーションオブジェクトモデル | 98×73 |
ASP.NET の Web 関連クラス | 分散アプリケーションの開発 | 80×73 |
.NET Framework の Windows フォームのクラス | Visual Basic .NET | 61×73 |
ADO.NET のデータと XML 関連クラス | データアクセス | 42×73 |
ATL、ATL Server、OLE DB テンプレート | MFC 7.0 | 98×73 |
表 1. Visual Studio .NET のパッケージ製品に含まれるポスター
※ Visual Studio .NET 全パッケージ製品と Visual C++ .NET Standard にはすべてのポスターが含まれる。Visual Basic .NET Standard と Visual C# .NET Standard には、ATL/MFC のポスターを除く 4 種類のポスターが含まれる
System
System 名前空間には、様々なアプリケーションで使用される基本的なクラスが含まれています。Int32、Double、Boolean、Decimal、DateTime などのデータ型、イベントハンドラも含まれています。基本的なクラスの中には、配列の作成、操作、検索、並び替えを行う Array クラス、コンソールアプリケーションのための Console クラス、データ型を別の基本データ型に変換する Convert クラス、サイン、コサインなどの三角関数のメソッドや円周率などの定数を含む Math クラスなどの多彩なクラスが含まれます。
この System に含まれるクラスについてはサンプルコードともに後述します。
グラフィックス (GDI+) - 画像の描画、直線や曲線などで構成されたベクタ画像を扱う機能、文字描画、フォント作成、印刷、非矩形のウィンドウ作成
System.Drawing
System.Drawing 名前空間には、GDI+ の基本的な描画機能を使用するクラス類が含まれています。GDI+ はデバイスに依存しないアプリケーションを記述するためのグラフィックデバイスインターフェイスで、2 次元のベクタグラフィックス、イメージング、タイプグラフィなどの機能を提供しています。この System.Drawing では GDI+ の機能のうち基本的な描画機能しか提供していませんが、System.Drawing.Drawing2D、System.Drawing.Imaging、System.Drawing.Text の名前空間でより高度な機能を提供しています。ディスプレイデバイスへの描画のためのメソッドを数多く用意している Graphics クラス、文字描画のためのフォントを作成する Font クラスなどのクラスが含まれます。
System.Drawing.Drawing2D
System.Drawing 名前空間は基本的な描画のためのクラスを提供していましたが、System.Drawing.Drawing2D 名前空間は高度な 2 次元グラフィックスやベクタグラフィックスの機能が用意されています。仮想的な空間の中に直線、曲線や文字などを描画して表現するための GraphicsPath クラス、多色グラデーションの色のブレンドの補間に使用される色と位置の配列を定義する ColorBlend クラスなどが含まれます。
GraphicsPath を使用すると、非矩形のウィンドウを簡単に作成することができます。リスト 1 は GraphicsPath を使用して、C Magazine という文字の形のウィンドウを作成する例です。Visual Studio .NET または Visual C# .NET で C# の Windows フォームアプリケーションを新規に作成し、表示されたフォームをダブルクリックしてリスト 1 のコードを Form1_Load の中に記述します。図 1 は実行した画面です。赤い文字の部分が、今回作成した非矩形のウィンドウです。
using System.Drawing.Drawing2D; // コードの先頭に追加
(中略)
private void Form1_Load(object sender, System.EventArgs e)
{
// Window を最大化し、背景色を赤に設定する
this.WindowState = FormWindowState.Maximized;
this.BackColor = Color.Red;
// GraphicsPath と使用するフォント、座標を設定する
GraphicsPath myGP = new GraphicsPath();
FontFamily font = new FontFamily("Arial");
PointF p = new PointF(90, 50);
// GraphicsPath に文字列を書き込む
myGP.AddString("C Magazine", font, 0, 128, p, StringFormat.GenericDefault);
this.Region = new Region(myGP);
}
リスト 1. 非矩形ウィンドウの作成
図 1. C Magazine という形のウィンドウ
System.Drawing.Printing
System.Drawing.Printing 名前空間には印刷関連のクラスが含まれています。PrintDocument クラスの新しいインスタンスを生成しプロパティを設定して、Print メソッドを呼び出すことで印刷を行います。この名前空間には用紙サイズを設定する PaperSize クラスや印刷ページに適用する設定を指定する PageSettings クラスなどの印刷を行う際の設定を行うクラスも含まれています。
メッセージキューと I/O - メッセージキューへの接続、監視、管理、データストリームやファイルからの読み書き
System.Messaging
System.Messaging 名前空間には、ネットワークのメッセージキューへの接続、監視、管理を行い、メッセージの送受信を行うクラスが含まれています。この名前空間のメインとなるクラスは MessageQueue クラスで、このクラスにはキューにメッセージの書き込みを行う Send メソッドや、キューからメッセージを読み取るための Receive メソッド、メッセージを読み取ったときにキューからメッセージを削除しない Peek メソッドなどが含まれます。キューから非同期にメッセージを読み取ることができる BeginReceive、EndReceive などのメソッドも提供しています。
System.IO
System.IO 名前空間には、データストリームやファイルから読み取り、書き込みを行うためのクラスが含まれています。バイナリデータの読み取り、書き込みを行うための BinaryReader クラスと BinaryWriter クラス、一連の文字の読み取り、書き込みを行うための TextReader クラスと TextWriter クラス、文字を特定のエンコーディングでストリームから読み取るための StreamReader クラスや書き込みを行うための StreamWriter クラスが含まれます。
リスト 2 は StreamReader を使用して読み込んだファイルに記述されている文字列を、先ほどの System.Collections.Specialized 名前空間に含まれる StringCollection クラスを使用して表示している例です。Visual Studio .NET または Visual C# .NET で C# の Windows フォームアプリケーションを新規に作成し、button を 1 つ貼り付けます。そして、button1 をダブルクリックしてリスト 2 のコードを記述します。また、c:\tmp\tmp.txt に UTF-8 で保存されているテキストファイルを用意します。
図 2 はサンプルプログラムの実行例です。tmp.txt の中に書かれている文字列を StreamReader を使用して読み出し、StringCollection に追加しています。button1 をクリックすると、StringCollection の文字列を順に MessageBox によって表示していきます。
// コードの先頭に記述する
using System.IO;
using System.Collections.Specialized;
(中略)
private void button1_Click(object sender, System.EventArgs e)
{
string str;
// StreamReaderを使用して任意のファイルを読み込む
// 文字エンコーディングを指定していない場合は UTF-8 となる
StreamReader sr = File.OpenText("c:\\tmp\\tmp.txt");
// 文字列に特化した Collection である StringCollection を使用
StringCollection sc = new StringCollection();
// 1 行読み込み、StringCollection に追加する
while ((str = sr.ReadLine()) != null)
{
sc.Add(str);
}
// StringCollection の文字列を順に表示する
foreach (string s in sc)
{
MessageBox.Show(s,"要素数 = " + sc.Count);
}
}
リスト 2. StreamReader と StringCollection の使用例
図 2. StreamReader と StringCollection のサンプルの実行例
コレクションとリフレクション - キューやスタック、ハッシュテーブル、動的な型のインスタンスの作成
System.Collections
System.Collections 名前空間には、オブジェクトのさまざまなコレクションを定義するクラスが含まれています。オブジェクトの先入れ先出しコレクションのための Queue クラス、後入れ先出しコレクションのための Stack クラス、ビット値配列を管理する BitArray クラス、ハッシュテーブルのための Hashtable クラスなどが含まれます。
さらに特定の場合に使用されるコレクションを集めた、System.Collections.Specialized 名前空間もあります。この System.Collections.Specialized 名前空間には、文字列を扱うコレクションである StringCollection クラスや、リンクされたリストディクショナリを扱う ListDictionary クラスなどが含まれます。
System.Reflection
System.Reflection 名前空間には型の動的な作成や呼び出しを可能にする機能を備え、読み込まれた型、メソッド、フィールドのマネージビューを提供するクラスとインターフェースが含まれています。リフレクションを使用することにより、動的な型のインスタンスの作成、作成したインスタンスの既存のオブジェクトへのバインド、既存のオブジェクトから型を取得することなどが可能になります。アセンブリマニフェストにリストされているモジュールを読み込み、そのアセンブリから型を検索してインスタンスを作成するための Assembly クラス、モジュールを含んでいるアセンブリやモジュール内のクラスの情報を探索するための Module クラスなどが含まれます。
Web アプリケーション - ブラウザとサーバー間通信、データキャッシング、セキュリティ、XML Web サービス、WSDL、Web フォーム
System.Web
System.Web 名前空間には、ブラウザとサーバー間の通信を行うクラスが含まれています。Web 要求中にクライアントから送信された HTTP 値を読み取るための HttpRequest クラス、クライアントへの HTTP 出力を管理する HttpResponse クラス、およびサーバー側のユーティリティとプロセスへのアクセスを実現するヘルパメソッドを提供する HttpServerUtility クラス、HTTP Cookie をタイプセーフな方法で作成および操作するための HttpCookie クラスなどが含まれます。
System.Web.Caching
System.Web.Cashing 名前空間には、サーバーで頻繁に使用するデータをキャッシュするためのクラスが含まれています。ハッシュテーブルやデータセットなどの任意のデータオブジェクトを格納するディクショナリを含む Cache クラスには、オブジェクトの追加を行う Add メソッド、削除を行う Remove メソッド、キャッシュ内に格納されているアイテムの数を取得する Count プロパティなどが含まれます。
System.Web.Security
System.Web.Security には、Web サーバーアプリケーションに ASP.NET セキュリティを実装するためのクラスが含まれます。ASP.NET アプリケーションで Windows/IIS 認証を使用するための WindowAuthenticationModule クラス、指定したリソースへのアクセスの許可と拒否を指定する URL ベースの認証サービスを提供する UrlAuthorizarionModule クラス、リモートユーザーが要求したファイルにアクセスするための NT アクセス許可を所有しているかを確認するための FileAuthorizationModule クラス、フォーム認証を使用する FormAuthenticationModule クラスなどが含まれます。
System.Web.SessionState
System.Web.SessionState 名前空間には、Web サーバー上の Web アプリケーションにある、それぞれのクライアントに固有のデータストレージを有効にするためのクラスが含まれます。アプリケーションにセッション状態サービスを提供するための SessionStateModule クラス、セッション状態値、セッションレベルの設定を行うための HttpSessionState クラスが含まれます。
System.Web.Services
System.Web.Services 名前空間には、XML Web サービスを作成および使用できるようにするためのクラスが含まれています。XML Web サービスは、HTTP、XML、SOAP、WSDL などの標準プロトコルを使用して、疎結合環境でメッセージを交換する機能を提供するアプリケーションです。XML Web サービスを利用すると、ファイアウォール経由または異種システム間で XML を使用してデータを送受信することや、アプリケーションロジックのリモート呼び出しを行うことが可能になります。XML Web サービスを作成する機能と XML Web サービスにアクセスする機能を最初から含んでいることが .NET Framework のメリットのひとつとなっています。
リスト 3 は最も単純な XML Web サービスの例です。IIS 上に .NET Framework をインストールしている環境で、リスト 3 のコードをメモ帳などのエディタを使用して記述します。ファイル名は wstest.asmx とし、\inetpub\wwwroot に保存します。Internet Explorer で https://localhost/wstest.asmx と入力すると、図 3 が表示されます。このページには XML Web サービスに含まれる公開されている Web メソッドの一覧が掲載されていますので、ここでは Hello をクリックします。図 4 のテスト用のページが表示されますので、ここで Hello メソッドのテストを行うことができます。パラメータ値の S の部分に C Magazine と入力して起動ボタンをクリックします。図 5 は Hello メソッドを起動したときの戻り値です。このように、XML を使用した戻り値が戻ってきます。もちろんこの XML Web サービスは、任意の XML Web サービスクライアントアプリケーションから呼び出すことができます。
リスト 3 の 3 行めで System.Web.Services 名前空間を使用することを宣言し、7 行めの [WebMethod] 属性で Hello メソッドを Web メソッドとして定義しています。WebMethod 属性は System.Web.Services 名前空間に含まれる属性で、この 1 行を追加することにより任意のメソッドを Web メソッドとして公開することができるようになります。.NET Framework は XML Web サービスをネイティブにサポートしていますので、このように非常に少ないコードで XML Web サービスを作成することが可能になります。
<%@ Class="MyService" Language="C#" %>
using System.Web.Services;
public class MyService
{
[WebMethod]
public string Hello(string s)
{
return "Hello " + s;
}
}
リスト3. wstest.asmx、単純な XML Web サービスの作成
図 3. Web メソッドの一覧
図 4. Hello メソッドのテスト
図 5. Hello メソッドの実行結果
System.Web.Services.Description
System.Web.Services.Description 名前空間には、WSDL によって XML Web サービスをパブリックに説明するためのクラスが含まれています。XML Web サービスによって渡されるデータの抽象定義を提供するための Message クラス、交換されるメッセージに関連するデータ型定義を記述するための Types クラスなどのクラスが含まれます。System.Web.Services.Description 名前空間に含まれる各クラスは WSDL 仕様の特定の要素に対応しています。
System.Web.Services.Discovery
System.Web.Services.Discovery 名前空間には、XML Web サービスクライアントが XML Web サービス探索と呼ばれるプロセスを使用して、Web サーバー上の XML Web サービスを検索可能にするためのクラスが含まれています。サービスの説明を行う ContractReference クラス、XML スキーマ定義への参照を表す SchemaReference クラス、探索ドキュメントへの参照を表す DiscoveryDocumentReference クラスなどが含まれます。
System.Web.Services.Protocols
System.Web.Services.Protocols 名前空間には、XML Web サービスクライアントと ASP.NET を使用して作成された XML Web サービスとの通信時のプロトコルを定義するクラスが含まれます。SOAP をサポートする SoapHttpClientProtocol クラス、HTTP-GET プロトコルをサポートする HttpGetClientProtocol クラス、HTTP-POST プロトコルをサポートする HttpPostClientProtocol クラスなどを含みます。
System.Web.UI
System.Web.UI 名前空間には、Web フォームページを作成するための、Web ユーザーインターフェイスの作成に使用する標準的なクラスが含まれます。この名前空間には、Web アプリケーションに含まれる .aspx ファイルに対して要求が出されるたびに自動的に生成される Page クラス、データ連結式構文の生成と解析のサポートを RAD デザイナに提供するための DataBinder クラス、特定のコントロールやページのビューステートを管理する StateBag クラス、HTML 固有のテキストを Web フォームページに書き込むための HtmlTextWriter クラスなどを含みます。
System.Web.UI.HtmlControls
System.Web.UI.HtmlControls 名前空間には、Web ユーザーインターフェイスを作成するときに Web フォームに追加できる、HTML 固有のコントロール用のクラスが含まれます。HTML サーバーコントロールはサーバー上で実行され、ほとんどのブラウザでサポートされている標準の HTML タグに直接変換されます。表 2 に、System.Web.UI.HtmlControls クラスに含まれるクラスと、各クラスが対応している HTML タグの一覧を示します。Visual Studio .NET の統合開発環境上では、これらのクラスの多くはツールボックスの HTML タブに登録されていますので、Web フォーム上または HTML エディタ上に直接ドラッグアンドドロップすることにより使用することができます。