Visual Basic 初級講座 |
Visual Basic 中学校 > 初級講座 >
クラスライブラリの作成・利用・デバッグについて説明します。クラスライブラリを使用すると一度作成したクラスをいろいろなプロジェクトから簡単に利用することができます。クラスライブラリの実体は拡張子がdllのファイルです。
概要 ・クラスライブラリの実体は拡張子がdllであるファイル。 ・クラスライブラリを利用すると、一度作成したクラスをいろいろなプロジェクトから簡単に利用することができる。 ・プロジェクトからクラスライブラリを使用するには参照設定を行う。 ・クラスライブラリをデバッグするにはプロジェクト参照を行う。 ・名前空間を作成するにはNamespace 〜 End Namespaceを使う。 |
クラスライブラリとは同じクラスをさまざまなプロジェクトで利用できるようにしたものです。クラスライブラリを利用すると一度作ったクラスを別のプロジェクトから簡単に呼び出すことができるので、クラスを作れば作るほど次からのプログラムが楽になっていきます。
クラスライブラリの実体は拡張子がDLLのファイルです。
クラスライブラリは自分で作ったものを利用することもできますし、他の人が作ったクラスライブラリを利用することもできます。
一度作ったものを何度でも再利用しようと言う発想は比較的昔からあって、この発想と利用方法は昔も現在もそれほど変わっていません。再利用するための細かい技術的なことがらは昔と今では随分違いますが通常のプログラムではこの裏に隠されている技術的なことは気にしないで済みます。
今回の説明では裏で使用されている技術的なことには触れずにクラスライブラリの作成と使用の具体的な手順・操作方法を説明します。
まずは、簡単にクラスライブラリを作成してみましょう。
普段プロジェクトを新規作成するときには「Windows アプリケーション」を選択していると思いますが、クラスライブラリを作成する場合は「クラスライブラリ」を選択して新しいプロジェクトを作成して下さい。プロジェクト名は本来は好きな名前で構わないのですが、今回は説明の都合上必ずMyLibraryにして下さい。
■画像1:クラスライブラリの作成(VB2005 Express Edition)
クラスライブラリを選んでもWindows アプリケーションと同じような開発画面が表示されます。ソリューションエクスプローラを見ると見慣れたForm1がなく、代わりにClass1が存在することがわかります。
■画像2:新規クラスライブラリを作成した直後のソリューションエクスプローラ(VB2005 Express Edition)
クラスライブラリにもフォームを追加することはできますが、最初の状態ではこのようにクラスしかありません。
クラスのコードは初期状態では次のようになっています。
Public
Class Class1 End Class |
■リスト1:空のクラス
これはWindows アプリケーションでクラスを追加したときの状態と同じです。
今回は クラスライブラリのテストのために統計値を算出するクラスを作成します。クラス名もClass1ではかっこ悪いのでStatisticsとして下さい。クラス名を変更するにはソリューションエクスプローラを使うのが一番楽です。 ソリューションエクスプローラを使ってClass1をStatisticsに変更するとファイル名だけでなく自動的にクラス名も変更されます。
統計値を算出すると言うと堅苦しいイメージになってしまいますが、要するに合計値と平均値を求めるクラスです。ただ求めるだけではなく順々に数値を追加指定ってリアルタイムで算出することにします。
このクラスのメンバは次の通りです。
メンバ | 説明 |
Average | 現在の平均値を返します。(値はAddメソッドで追加します。) |
Total | 現在の合計値を返します。(値はAddメソッドで追加します。) |
Add | 値を追加します。 |
Clear | 値をすべてクリアします。 |
■表1:Statisticsクラスのメンバ
メソッドやプロパティに作り方は今回のテーマではありませんので、このクラスの完成版コードを掲載します。これをそのまま貼り付けてください。
冒頭の部分だけVB.NET2002,VB.NET2003の場合と、VB2005の場合で異なりますので注意して下さい。異なるのは変数Valuesの宣言部分だけです。
'''
<summary>統計値を算出します。</summary> Public Class Statistics 'Dim Values As New ArrayList '←VB.NET2002, VB.NET2003の場合 Dim Values As New List(Of Decimal) '←VB2005の場合 |
'■Add ''' <summary>値を追加します。</summary> ''' <param name="Value">追加する値を指定します。</param> Public Sub Add(ByVal Value As Decimal) Values.Add(Value) End Sub |
'■Clear ''' <summary>すべての値をクリアします。</summary> Public Sub Clear() Values.Clear() End Sub |
'■Total ''' <summary>合計値を求めます。</summary> ''' <returns>合計値を返します。</returns> Public ReadOnly Property Total() As Decimal Get Dim Ret As Decimal If Values.Count = 0 Then Return 0 End If For Each Value As Decimal In Values Ret += Value Next Return Ret End Get End Property |
'■Average ''' <summary>平均値を求めます。</summary> ''' <value>平均値を返します。</value> Public ReadOnly Property Average() As Decimal Get Dim Ret As Decimal If Values.Count = 0 Then Return 0 End If For Each Value As Decimal In Values Ret += Value Next Return Ret / Values.Count End Get End Property End Class |
■リスト2:クラスのプログラム
これで完成です。一度保存して、ビルドしておいてください。保存してビルドですよ。プログラムを作成して保存しただけではdllファイルは作成されません。dllファイルを作成するには必ずビルド する必要があります。ビルドすることによって保存場所に指定した場所にdllファイルが作成されるのでこの手順は重要です。dllはMyLibrary.dllという名前になります。
ところで、クラスライブラリは他のプロジェクトから呼び出されることを前提にしているためこの状態では実行できません。それではテストしながら開発するときに不便だと思われるでしょうが、それにはちゃんと解決手段が用意されています。それについては後で説明します。
それでは、今作ったStatisticsクラスを他のプロジェクトから利用してみましょう。新しいプロジェクトを作成して下さい。今度はWindowsアプリケーションです。名前も場所も自由で構いません。
プロジェクトを作成した初期状態ではStatisticsクラスを使うことはできません。Statisticsクラスを使うにはMyLibrary.dllを使用できるように設定しなければなりません。このような設定のことを参照設定と呼びます。
参照設定をするには[プロジェクト]メニューで[参照の追加]を選択します。
■画像3:[プロジェクト] - [参照の追加]
そうするとダイアログ画面が表示されます。
■画像4:参照の追加ダイアログ
この画面には参照可能なさまざまなクラスライブラリが表示されています。こんなに大量のクラスライブラリがひそかに存在していたのかと驚かれるかもしれませんね。この画面に表示されるクラスライブラリの一覧は環境によってことなりますが、だいたい数十個は表示されているようです。
今回は、自作のクラスを指定するので、上記の画面で[参照]タブをクリックして下さい。このタブページではファイルを指定して参照設定を追加することができます。さきほどのプロジェクトを保存したフォルダからMyLibrary.dllを指定して[OK]を押してください。
■画像5:dllを参照する
これで準備完了です。参照設定の方法・現在の参照設定を確認・削除する方法は参照設定を追加する方法にまとめてありますので随時参考にして下さい。
この状態でフォームにボタンを1つ配置して次の通りプログラムして下さい。
Private
Sub Button1_Click(ByVal
sender As
System.Object, ByVal
e As
System.EventArgs) Handles
Button1.Click Dim Book As New MyLibrary.Statistics Book.Add(10) Book.Add(50) Book.Add(30) Book.Add(100) MsgBox(Book.Total, MsgBoxStyle.Information, "合計値") MsgBox(Book.Average, MsgBoxStyle.Information, "平均値") End Sub |
■リスト3:クラスライブラリを利用してメソッドを呼び出す
以上で完成です。みごとにStatisticsクラスの機能を使用することができます。これでみなさんは合計値や平均値の計算をどのプロジェクトからでも簡単に行えるようになりました。
もちろん、合計値や平均値に限りません。どんな機能でもクラスライブラリとしてプログラムすれば何度でも利用できるのです。すばらしいではありませんか。
メモ - インテリセンス 上記の例ではVB2005の場合はプログラム中にXMLコメントで指定した内容がインテリセンスとして表示されます。
■画像6:インテリセンス インテリセンスの内容はdllと同じフォルダに拡張子がxmlのファイルとして保存されています。通常はインテリセンスのためにdllと一緒にこのxmlファイルを保存しておきます。 |
クラスライブラリの作成方法と利用方法がわかったところで今度はもっと実用的な開発方法を説明しましょう。
言うまでもないことですが、上述の方法でもクラスライブラリが正しく動作しているかテストすることはできます。しかし、ステップ実行することができません。
※場合によってはこの状況でステップ実行等のデバッグを行うことも可能です。後で出てくる囲み記事「デバッグ可能な条件」を参照して下さい。
デバッグできないということは、クラスライブラリ側に問題があった場合、クラスライブラリのプロジェクトを開いてコードを修正してビルドしてという手順を繰り返す必要があり面倒です。
そこで、通常クラスライブラリを開発するときによく使う方法を説明します。
まず、再びMyLibraryを開いてください。この状態で[ファイル]メニューから[追加] - [新しいプロジェクト]を選択します。そして、Windowsアプリケーションを選んで適当な名前でプロジェクトを作成して下さい。ここではWindowsApplication1という名前にします。そうすると、なんとソリューションエクスプローラに今作った新しいプロジェクトとMyLibraryが並んで表示されます。
■画像7:2つのプロジェクトを同時に開く
このようにしてVBでは複数のプロジェクトを同時に開くことができます。しかし、このままだと並んで開いているだけでそれ以上の意味はありません。プロジェクト同士が自動的に連携して参照しあうようなことにはなりません。
ここでもWindowsApllication1はMyLibraryに対して参照設定を行う必要があります。ただし、さきほどの手順とは少し違います。
WindowsApllication1を選択している状態でさきほどの参照設定の追加ダイアログを表示して下さい。こんどは[参照]タブではなく[プロジェクト]タブを使用します。
[プロジェクト]タブページには現在同時に開いている他のプロジェクトが表示されますので、ここでMyLibraryを選んでOKをクリックすれば準備完了です。
■画像8:プロジェクトの参照
WindowsApplication1にはフォームにボタンを貼り付けて先ほどと同じようにプログラムして下さい。
これで実行してみましょう。…実はエラーになります。複数のプロジェクトを同時に開いている場合、実行ボタンを押して実行されるのは太字で表示されているプロジェクトの方なのです。ソリューションエクスプローラをよく見るとMyLibraryは太字で表示されているのにWindowsApllication1は普通の字で表示されているのがわかるでしょう。
この設定を変更するにはソリューションエクスプローラでWindowsApplication1を右クリックして、[スタートアッププロジェクトに設定]を選択して下さい。これで、MyLibraryは細字になり、WindowsApplication1が太字になります。
後は通常通り実行できます。プログラムの好きなところにブレイクポイントを設定してステップ実行などのデバッグ機能が正常に動作していることを確認して下さい。
この方法で開発すればプロジェクトが複数に分かれていても使い心地は1つのプロジェクトを扱っている場合と変わりません。
メモ - ソリューションファイル この例のように複数のプロジェクトを使って開発する場合、プロジェクトの情報を束ねているのがソリューションファイルです。VB2005 Express Editionでは複数のプロジェクトを開いたときに初めてソリューションファイルが生成されますが、それ以外のVBではプロジェクトが1個しかなくても初めからソリューションファイルが生成されています。 |
はじめの例ではDLLファイルに対して参照を設定しました。このような参照のことをDLL参照と呼びます。2番目の例ではプロジェクトに対して参照を設定しました。このような参照のことをプロジェクト参照と呼びます。
このようにアプリケーションの開発者は2つの方法でクラスライブラリへの参照を設定することができます。この2つの参照の方式は開発プロセスに応じて使い分けます。
プロジェクト参照はクラスライブラリ自体をデバッグ・修正する可能性がある場合に使用します。
この場合は、デバッグ機能がクラスライブラリにも及ぶため、クラスライブラリ内部でエラーが発生した場合も通常の作業と同じようにエラーを検証したり、ステップ実行をおこなったりしてコードを修正することができます。
クラスライブラリ自体がある程度完成している場合に、そのクラスライブラリを使用してアプリケーションを作成する場合にはDLLを参照を使用します。この場合はクラスライブラリ自体は完全にアプリケーションの外側にあることになりますので、クラスライブラリでエラーが発生しても、デバッグ画面ではその機能を呼び出した行でエラーが発生したように表示されます。
メモ - デバッグ可能な条件 本文では単純にプロジェクト参照=デバッグ可能、DLL参照=デバッグ不可能と説明しましたが、実はDLL参照でもステップイン・コードの修正等通常のデバッグができる場合があります。 デバッグ可能である条件はデバッグ情報付きでビルドし、pdbファイルとソースコードが存在する場合です。 ソースコードの有無は環境によって異なるでしょうが、それ以外の条件に関してはVB2005では既定でこの状態になっています。VB2005を使用している場合はdllと同じフォルダを開いてみると拡張子がpdbのファイルが生成されていることが確認できます。 なお、ソースコードの場所はフルパスでpdbファイルに埋め込まれています。 VB.NET2002, VB.NET2003の場合はビルドの構成によってpdbファイルが生成されたりされなかったりします。デバッグビルドの場合は生成され、リリースビルドの場合は生成されません。 VB2005で、pdbファイル等デバッグに必要なすべての情報を省くには、プロジェクトのプロパティのコンパイルの設定画面で[詳細コンパイルオプション]ボタンをクリックし、「デバッグ情報を作成」の項目で「None」を指定します。ただしExpress Editionではこの設定を行うことはできません。 |
プロジェクト参照の方が開発には便利なのですが、一度に開くコードの量が多くなるためスペックの低いパソコンでは操作がいちいち遅く感じられる場合があります。
チーム開発をしている場合はライブラリ担当者はプロジェクト参照、アプリケーション担当者はDLL参照というような使い分けになります。
どういう方式? | 何に使う? | |
プロジェクト参照 | クラスライブラリのプロジェクトとアプリケーションのプロジェクトを同じ開発画面で開いてアプリケーション側から、クラスライブラリのプロジェクトに参照設定する。 | クラスライブラリをデバッグ・修正する可能性がある場合。クラスライブラリの担当者が使用する。 |
DLL参照 | クラスライブラリ側はあらかじめビルドしてDLLを作成しておく。アプリケーション側ではこのDLLファイルに対して参照設定する。 | クラスライブラリがある程度完成している場合。チーム開発でアプリケーション側のの担当者が使用する。 |
■表3:プロジェクト参照とDLL参照
なお、アプリケーションの完成時は必ずDLL参照になります。そして、そのアプリケーションを配布する場合にはexeとdllをセットで配布します。
最後に名前空間について触れておきます。通常のアプリケーションでもクラスライブラリでも初めの状態ではプロジェクトがそのまま名前空間になっています。
たとえば、ClassLibrary1というプロジェクトを作成してその中にClass1というクラスを作成した場合、このクラスはClassLibrary1名前空間に属し、クラス名はClass1であるということになります。
名前空間名を自分で指定することもできます。名前空間名を自分で指定するにはプロジェクトのプロパティ画面を使用してルート名前空間に自由な名前を設定します。複数のプロジェクトで同じルート名前空間名を設定することもできるので、大きな名前空間を作成しようとしている場合でもプロジェクトを分割して効率よく作業することができます。
■画像9:ルート名前空間の設定(VB2005)
上記の方法で設定するルート名前空間とは、最も大きな名前空間のことです。たとえば、System.Windows.Forms名前空間の場合ルート名前空間はSystemです。WindowsやFormsも名前空間ではありますが、「ルート名前空間」ではありません。
ルートではない名前空間を指定するにはプログラム中に自分でNamespace 〜 End Namespace(読み方:Namespace = ネームスペース)を記述します。
次の例では名前空間SubNameを定義しています。
Namespace
SubName Public Class Class1 End Class End Namespace |
■リスト4:名前空間の作成
この例でルート名前空間名がClassLibrary1であるとすると、Class1クラスの完全限定名はClassLibrary1.SubName.Class1となります。
多段階で構成される名前空間は大き目のクラスライブラリを作成するときに使用されます。