Silverlight をインストールするには、ここをクリックします*
Japan変更|すべてのMicrosoft のサイト|サインイン
Visual Studio 2005
|MSDN ライブラリ|デベロッパー センター|ダウンロード情報|開発ツール製品|コミュニティ|ご意見・ご要望|サイトマップ
MSDN Home   MSDN Home
MSDN Home > Visual Studio > Visual Basic .NET での .NET Framework の利用

Visual Basic .NET での .NET Framework の利用

最終更新日: 2001/05/21

.NET Framework を使用することによって、Microsoft Visual Basic® 開発者は、以前のバージョンの Visual Basic では作成が困難だった堅牢なアプリケーションを構築することができます。この資料では、.NET Framework を使用する利点を説明し、マルチスレッディングとスレッド プーリング、Windows NT サービス、ファイル システムの監視など、Visual Basic 開発者がこのフレームワークで利用できるパワフルな機能のいくつかを紹介します。


なぜフレームワークか

フレームワークという語には、いくつかの意味がありますが、この場合は、アプリケーションを構築し、実行するための基礎を指します。そのような基礎があることで、一貫性のある単純化されたプログラミング モデルを使用して、アプリケーションを容易に構築することができます。

Visual Basic 6.0 開発者は、多彩なアプリケーションの構築を容易にするプログラミング言語の恩恵を享受できます。Visual Basic 言語そのものは、Integer、Long、String などの組み込みデータ型のほか、文字列操作やデータ型変換などの最もよく使用される関数を提供します。より洗練されたアプリケーションでは、Win32 API を使用して、任意のレジストリ キーと値のアクセスなど、標準の Visual Basic 関数ではできないことができます。多くの場合は、Component Object Model (COM) コンポーネント ライブラリも使用して、アプリケーションの機能を拡張します。最も顕著な例は、アプリケーションがデータ アクセスに使用する ActiveX® Data Objects (ADO) ライブラリです。

Visual Basic は、これらのさまざまな拡張性メカニズムを提供できるだけの柔軟性を備えていますが、その柔軟性を活用するには、複雑な API アーキテクチャを学ぶ必要があります。Win32 API の動作と Visual Basic から呼び出す方法を学ぶ必要がありますが、これは時間のかかる、間違いに陥りやすい作業です。また、Visual Basic からさまざまな COM コンポーネントを使用する方法も学ぶ必要がありますが、それぞれオブジェクト モデルが異なります。

最後に、Win32 API、ADO、そしておそらく、その他多くの COM コンポーネントを利用する Visual Basic アプリケーションを構築するときには、アプリケーションの導入とともにそれらの依存情報も管理する必要があります。典型的な Visual Basic アプリケーションの依存性リストには、Visual Basic ランタイムだけでなく、はるかに多くのものが含まれます。リストには、ADO 2.6 など、アプリケーションが使用するすべてのライブラリが含まれていなければなりません。

共通のフレームワークの基本的な考え方は、これらの問題を解決して、多くの異なる API アーキテクチャを学ばなくても、また、数多くのライブラリの導入とバージョニングの管理という手間をかけなくても、堅牢なアプリケーションの開発を容易にしようということです。


.NET Framework とは何か

.NET Framework という用語は、Microsoft .NET プラットフォームの開発基盤を形成するテクノロジのグループを意味します。このグループの主要テクノロジは、図 1 に示されているランタイムとクラス ライブラリです。

図 1. .NET Framework は、.NET ランタイムとクラス ライブラリで構成されます

ランタイムは、コードの管理と実行時のサービスの提供を受け持ち、Visual Basic 6.0 ランタイムと同様の役目を果たします。.NET プログラミング言語 (Visual Basic .NET、Visual C#、C++ マネージ拡張、およびさまざまなベンダの多くのプログラミング言語を含みます) は、統一された共通のクラス セットを通じて、.NET のサービスと機能を利用します。

.NET の統一クラスは、開発者が使用する言語に関係なく、アプリケーションを構築するための基礎を提供します。文字列を連結するだけの場合も、Windows NT サービス や多階層 Web ベース アプリケーションを構築する場合も、開発者はこれらの統一クラスを使用します。

統一クラスは、プラットフォームの機能にアクセスするための一貫した手段を提供します。クラス ライブラリの使い方を学ぶと、すべてのタスクが同じ均一なアーキテクチャに従うことがわかります。アプリケーションを書くために、さまざまな API アーキテクチャを習得する必要はもうありません。

.NET Framework によって、Visual Basic .NET アプリケーションの配置も容易になります。Visual Basic 6.0 アプリケーションと違って、個別のデータ アクセス ライブラリ、XML パーサ、ネットワーク API などの入り組んだ依存性を配置する必要はありません。この機能は、.NET Framework の一部だからです。

統一され、統合されたフレームワークの上にアプリケーションを構築することによって、このフレームワークの学習に費やした時間に見合う見返りを得ることができ、配置と保守が容易な、より堅牢なアプリケーションが得られます。

.NET Framework と Visual Basic .NET

Visual Basic 6.0 ランタイムは、一般的なプログラミング タスクの多くを単純化する点で優れています。しかし、このような単純化の層があるということは、Visual Basic からアクセス可能なラッパーで包まない限り、DirectX などの新しいオペレーティング システム機能を使用できないことを意味します。Visual Basic 開発者が .NET Framework から得る最も重要な利点は、一貫したプログラミング モデルを使用して、基盤となる .NET プラットフォームに容易に直接アクセスできることです。これは、Visual Basic .NET を使用すると、Visual Basic 6.0 では構築が困難か不可能であったアプリケーションを構築できることを意味します。Visual Basic 6.0 開発者は、ほかのプラットフォームのプログラミング言語と同じ機能にアクセスできるようになります。たとえば、Windows NT サービス プログラムを作成するために、Visual C++ を使用する必要も、その場しのぎの特殊なトリックに頼る必要もありません。Visual Basic .NET を使用すれば、すべてをエレガントに、クリーンに、そして容易に行うことができます。.NET Framework で何ができるか、いくつかの例を示すために、アプリケーションで実行する必要がある 4 つの一般的なタスク、すなわち、トレースとイベント ロギング、マルチスレッディング、ファイル システムの監視、および Windows NT サービスの作成について説明します。

トレースとイベント ロギング

堅牢なアプリケーションを構築するときには、診断とトラブルシューティング メカニズムに注意を払う必要があります。典型的には、これには、出力先 (イベント ログまたはファイル) のオープン、トレース メッセージの書き込み、および出力先のクローズを処理するトレーシング コンポーネントを作成することが含まれます。そして、このコンポーネントをコードから呼び出して、記録すべきテキストを渡します。この時間と労力のすべてをトレーシングおよびロギング サブシステムに費やしても、結局はビジネス問題の解決には役立たないかもしれませんが、アプリケーションの構築には必要なことです。

.NET Framework には、ロギング インフラストラクチャを提供することによってトレース メッセージのログを容易にするクラスとその他のデータ型が含まれています。図 2 は、トレースに使用できる .NET Framework クラスを示しています。

図 2. .NET Framework のトレーシング機能

これらのクラスは、System.Diagnostics 名前空間の一部です。Trace クラスは、いくつかの共有Sharedメソッドを公開します。たとえば、Write メソッドを使用すると、特定のメッセージを記録することができ、Assert メソッドを使用すると、指定した条件が偽の場合にメッセージを記録することができます。Trace クラスは、メッセージを Listeners 集合の中のオブジェクトに出力します。この集合内のそれぞれのオブジェクトは、TraceListener から継承したクラスです。EventLogTraceListener はイベント ログに書き込み、TextWriterTraceListener はテキスト ファイルに書き込み、DefaultTraceListener のインスタンスは、既定では Trace クラスの Listeners 集合に追加されます。

標準のリスナーのほかに、独自のトレース リスナーをインプリメントすることができます。たとえば、ファイヤウォールの内側にあるリモート マシン上で実行しているアプリケーションからトレース出力を受信したい場合があります。このような場合、HTTP 要求によってトレース メッセージをサーバーに送信するトレース リスナーを書くことができます。これはアプリケーションのパフォーマンスに影響を与えますが、それもトレースが有効な間だけです。

一般に、コンパイル済みバイナリにトレーシング コードを含めたり除外する機能があると便利です。これを Visual Basic 6.0 で行うには、コンパイル定数を使用して、トレーシング コードのすべてを #If ステートメントで囲む必要がありますが、こうするとコードが読みにくく、保守がしにくくなります。.NET Framework では、[プロジェクトのプロパティ] ダイアログ ボックスで TRACE コンパイル定数をオンまたはオフに設定するだけです。トレーシング コードを #If で囲む必要はありません。

もう 1 つの望ましいトレーシング機能は、トレース レベルの設定です。これには、Severe、Error、Warning、Information など、どのメッセージを記録するかを制御するさまざまなトレース設定が含まれます。一般に、これを制御するにはレジストリ値を使用します。トレーシング コンポーネントは、起動時にこの値を読み取ります。やはりこれも、.NET Framework では組み込み機能になっています。レジストリ値を設定して、現在のアプリケーションのロギング レベルを制御することができ、Trace.WriteIf および Trace.WriteLineIf を使用して、トレーシング レベルが特定のレベル (Severe など) に設定されている場合だけメッセージを記録することができます。

統合されたトレーシングおよびロギング機能は、生産性を大幅に向上させます。組み込み機能を使用するだけで、実際のアプリケーション コードの作成に専念できるからです。

マルチスレッド アプリケーション

.NET Framework の優れた機能の 1 つは、サードパーティ製ツールやサポートされていない Visual Basic のトリックコードを使用しなくても、Visual Basic でマルチスレッド アプリケーションを作成できることです。.NET Framework のマルチスレッディング サポートは、System.Threading 名前空間のクラスとインターフェイスによって提供されるので、どの .NET 言語でも同じ方法でスレッドの作成と操作を行うことができます。System.Threading.Thread はコア クラスであり、スレッドの作成と制御のサポートを提供します。スレッドを作成するには、コンストラクタに ThreadStart デリゲートを渡す新しい System.Threading.Thread オブジェクトを作成します。このデリゲートは、スレッドが実行を開始するメソッドを表します。新しいスレッドを開始する準備ができたら、Thread.Start() を呼び出します (リスト 1 を参照)。

マルチスレッド アプリケーションの構築を始めてみると、すぐに、共有クラス変数などの共有リソースへのアクセスを制御する必要があることがわかります。.NET Framework は、2 つのスレッドによって行われるアクションを同期するためのクラスとデータ型も含んでいます。

最も単純な例として、複数のスレッドから更新する必要がある共有変数があるとします。これを行うには、System.Threading.Interlocked クラスを使用することができます。たとえば、num という名前の共有変数をインクリメントまたはデクリメントするには、それぞれ Interlocked.Increment(num) または Interlocked.Decrement(num) を書きます。また、Interlocked を使用して、変数を特定の値に設定したり、2 つの変数が等しいかどうかをチェックすることができます。これほど単純ではない場合は、.NET Framework のクラスを使用して、イベントとミューテックスの同期など、より複雑なスレッド同期を行うことができます。しかも、Win32 API を使用しなくても、すべてを .NET Framework の中から行うことができます。


Imports System.IO
'名前空間 System.Threading は
'Thread クラスを含む
Imports System.ThreadingModule Module1
    Private count As Long
    Sub Main()
        'ThreadStart デリゲートを作成する
        Dim tStart As ThreadStart = New _
ThreadStart(AddressOf StartCounting)
        'スレッドを作成する
        Dim t1 As Thread = New Thread(tStart)
        Console.WriteLine("Enter q to quit")
        t1.Start() 'start the thread
        While (Console.Read() <> asc("q"))
            'ユーザーが [q]キー、 [Enter]キーを入力するまで、ループを繰り返す
        End While
        t1.Stop() 'スレッドに処理の停止を指示する
        t1.Join() 'スレッドが終了するまで待つ
    End Sub
    Sub StartCounting()
        Do
            '別のスレッドが同じ変数にアクセスしている場合は、
            'Interlocked.Increment を使用する
            Interlocked.Increment(count)
            Console.WriteLine( _
 "After incrementing count is : {0}", count)
            Thread.Sleep(200)
         Loop
End SubEnd Module

リスト 1. Visual Basic .NET でのスレッドの作成

新しいスレッドを作成して、ThreadStart デリゲートを渡します。次に、Thread.Start() を呼び出して、スレッドを開始します。スレッドを停止するには、Thread.Stop() を呼び出した後、Thread.Join() を呼び出して、シャットダウンの終了を待ちます。スレッドは、System.Threading.Interlocked を使用して、変数をインクリメントまたはデクリメントすることができます。

さらに、.NET Framework は、作業をキューに入れて、それをスレッド プールのスレッドに割り当てるための便利なメカニズムを提供します。これは、一般に複数の同時並行の作業アイテムまたは作業要求を処理するサーバー アプリケーションで役立ちます。たとえば、入力ファイルを待って、それらをデータベースにインポートするアプリケーションは、それぞれの入力ファイルをキューに入れて、スレッド プールの個別のスレッドで処理することができます。System.Threading.ThreadPool クラスを使用すると、共有メソッド QueueUserWorkItem を使用して作業をキューに入れることができます。今まで、これを行うには、独自のスレッド プールを作成して、管理する必要がありました。そして、ビジネス問題の解決ではなく、インフラストラクチャ作業にかなりの時間と労力を費やさなければなりませんでした。

ファイル システムの監視

特定のディレクトリに表示されるファイルを待って、処理する必要があるアプリケーションをいくつか見たことがあります。たとえば、ファイルのデータをデータベースにインポートするアプリケーションです。データ ファイルはメインフレームからダウンロードされるか、入力ディレクトリに転送されて、そこからアプリケーションがデータベースにインポートします。新しいファイルの存在を定期的にディレクトリにポーリングする代わりに、新しいファイルが作成されたことを示す通知を待つことができます。これを行うには、Visual Basic 6.0 では Win32 API を使用し、Visual Basic .NET では .NET Framework クラスを使用します。しかし、.NET での実装の方が、.NET のほかの実装と一貫性があるので、学習曲線が最小で済みます。

ファイル システムを監視するには、System.IO.FileSystemWatcher .NET クラスを使用します。これは、監視対象のパスを設定し、ファイルまたはサブディレクトリ レベルでの変更を通知するかどうかを指定するためのプロパティを提供します。System.IO.FileSystemWatcher を使用すると、監視対象のファイル名と種類を指定することもできます (たとえば、*.xml と指定すると、すべての XML ファイルの変更が監視されます)。さらに、たとえば新しいファイルの作成、ファイル属性の変更、またはファイル サイズの変更だけなど、通知する変更の種類を指定することができます (リスト 2 を参照)。

監視対象と監視する内容を設定した後、通知を受けたい各種のイベントのイベント ハンドラをフックアップします。FileSystemWatcher イベントは、Changed、Created、Deleted、Error、および Renamed です。イベントを処理するには、まず、FileSystemEventHandler デリゲートと同じ宣言でイベント ハンドラを書き、このハンドラを FileSystemWatcher クラスに追加します。このデリゲート ベースのアーキテクチャでは、同じイベントに対して複数のハンドラを追加したり、1 つのハンドラを複数のイベントに使用することができます。これは、Visual Basic 6.0 ではできないことです。


'System.IO は、
'ファイル監視クラスとタイプを含む
Imports System.IO
Module Module1

        Sub Main()
            'FileSystemWatcher は実際の処理を行う
             Dim fw As New FileSystemWatcher()
            'WaitForChangedResult は、
            '変更が発生したときに返される
	    Dim result As WaitForChangedResult
            '監視するパスを設定する
            fw.Path = "C:\WINNT\"   
            'ファイルまたはディレクトリを監視するかどうかを指定する
            fw.Target = WatcherTarget.File
            'サブディレクトリも含めるかどうかを指定する
            fw.IncludeSubdirectories = False
            'ハンドラをフックアップする
            AddHandler fw.Created, _
                       New FileSystemEventHandler(AddressOf OnFileNotify)
            '監視を有効にする
            fw.Enabled = True
            Do
                Console.WriteLine("Beginning to monitor")
                'ここで、指定したタイムアウトまで、
                'ブロック実行を待つ
                result = fw.WaitForChanged(WatcherChangeTypes.All, 60000)
                Console.WriteLine("Hit Enter to continue [q], [Enter] to quit") 
            Loop While (Console.ReadLine <> "q")
        End Sub
        'ファイルが作成されたときに
        '呼び出されるデリゲート
        Public Sub OnFileNotify(ByVal source As Object, _
                                ByVal e As FileSystemEventArgs)
          Console.WriteLine( _
                "Notification received for file {0}, change type is {1}", _
                 e.FullPath, e.ChangeType)
        End Sub
End Module

リスト 2. FileSystemWatcher を使用した、フォルダの新しいファイルの監視

FileSystemWatcher を作成して、プロパティを設定します。AddHandler を使用して、FileSystemEventHandler デリゲートを Created などのさまざまな FileSystemWatcher イベントに関連付けます。次に、FileSystemWatcher を有効にして、WaitForChanged を呼び出します。この呼び出しは、変更が発生したとき、または指定されたタイムアウトに達したときに戻ります。

Windows NT サービス の作成

Windows NT サービスを作成しようと思ったら、Visual C++ を使用するか、srvany.exe や、Visual Basic でサービスを作成するためのサードパーティ ツールに頼らざるをえません。いずれにしても、Visual Basic でネイティブにサービスを書くわけではなく、Visual Basic ランタイムの外側にさらに多くの依存性を追加することになります。

C++ または C を使用してゼロスクラッチから (Active Template Library を使用せずに) Windows NT サービス を作成するには、サービスの開始、一時停止、続行、および停止を処理する Service Control Manager (SCM) とサービスの間でやり取りされる通信を調整するために、大量のコードを書かなければなりません。.NET Framework は、System.ServiceProcess.ServiceBase クラスの提供によって、サービスの実装を容易にします。サービスを作成するには、このクラスから継承して、いくつかのメソッドをオーバーライドし、プロパティを設定すれば、準備オーケー完了です。

オーバーライドする必要があるかもしれないメソッドとしては、OnStart、OnStop、OnPause、OnContinue などがあります。典型的には、ワーカー スレッドを開始するときに OnStart をオーバーライドし、そのワーカー スレッドをキル削除するときに OnStop をオーバーライドします。サービスを作成した後は、サービスをインストールして、SCM に登録する必要があります。ここでも、.NET Framework の基底クラスが必要な作業のほとんどを提供します。プログラマは、System.Configuration.Install.Installer クラスを継承するクラスを作成して、System.ServiceProcess.ServiceInstaller からオブジェクトをインスタンス化し、サービスのスタートアップ モードとサービス名などのプロパティを設定するだけです。こうすれば、.NET のインストーラ ユーティリティ installUtil.exe でサービスのインストール (およびアンインストール) を行うことができ、それ以上のコードを書く必要はありません。

Visual Studio .NET を使ってみると、Visual Studio .NET によって .NET Framework の利用がさらに容易になることがわかります。Visual Studio .NET では、自分でコードを書かなくても、デザイナとコンポーネントを使用して、Windows NT サービスServices (インストーラ付き) を作成し、ファイル システムの変更を監視し、イベント ログに書き込むことができます。たとえば、サービス プロジェクトにインストーラを追加するには、サービス デザイナ サーフェスを選択して、[プロパティ] ウィンドウの下部にある [インストーラの追加] をクリックするだけです (図 3 を参照)。これで、サービスのインストールに必要なコードをすべて含んだ ProjectInstaller.vb という名前の新しいモジュールが追加されます。ProjectInstaller.vb のデザイナを使用すると、スタートアップ モードなどのインストール オプションをカスタマイズすることができます (図 4 を参照)。

図 3. Visual Studio .NET を使用して、サービス プロジェクトにインストーラを追加する

図 4. デザイナを使用して、StartType などのインストール オプションをカスタマイズする

まとめ

.NET Framework は、Visual Basic .NET による堅牢なアプリケーションの開発を容易にします。開発者は一貫性のある 1 つのプログラミング モデルを習得するだけでよく、基盤となる .NET プラットフォームへの直接アクセスが提供されます。Visual Basic .NET と .NET Framework によって、アプリケーションのレベルをかつてなく高めることができます。


Microsoft