Visual Basic 初級講座 [改訂版]
VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

第31回 クラスライブラリ

2021/3/21

この記事が対象とする製品・バージョン

VB2019 Visual Basic 2019 対象です。
VB2017 Visual Basic 2017 対象です。
VB2015 Visual Basic 2015 対象ですが、画面や操作方法が少し異なります。
VB2013 Visual Basic 2013 対象ですが、画面や操作方法が少し異なります。
VB2012 Visual Basic 2012 対象ですが、画面や操作方法が少し異なります。
VB2010 Visual Basic 2010 対象ですが、画面や操作方法がかなり異なるので、読み物として利用してください。
VB2008 Visual Basic 2008 対象ですが、画面や操作方法がかなり異なるので、読み物として利用してください。
VB2005 Visual Basic 2005 対象ですが、画面や操作方法がかなり異なるので、読み物として利用してください。
VB.NET 2003 Visual Basic.NET 2003 対象外ですがほとんどの説明があてはまるので参考になります。
VB.NET 2002 Visual Basic.NET (2002) 対象外ですがほとんどの説明があてはまるので参考になります。
VB6対応 Visual Basic 6.0 × 対象外です。

 

目次

 

1.クラスライブラリ

クラスライブラリとはプロジェクトの種類の1つで、作成したクラスをさまざまなプロジェクトで利用できるようにしたものです。

下記の図は、さまざまな種類のプロジェクトから1つのクラスライブラリの機能を呼び出せるというイメージを図にしたものです。

クラスライブラリは、Windowsフォームアプリケーションやコンソールアプリとは異なり単独で実行することはできません。

他のプロジェクトから呼び出して使用します。

プログラムから他のプロジェクトのプログラムを呼び出すことを「参照」(さんしょう)と呼びます。

※「参照」という言葉はこれ以外の場合でも使用します。

 

クラスライブラリの中にクラスや構造体などをプログラムしておくと、他のプロジェクトから参照してそのクラスや構造体など使用できるというわけです。

クラスライブラリから別のクラスライブラリを参照することも可能で、実際にこのような多重の参照関係になっているものも多くあります。

つまり、クラスライブラリを使う場合は、それを呼び出すプロジェクトも必要なので、2つ以上のプロジェクトを組み合わせて使うことになるのが普通です。

 

クラスライブラリをビルドした時の実体は拡張子が dll のファイルになります。ただし、クラスライブラリではないプロジェクトも拡張子が dll のファイルになる場合があるので、dllファイルを見かけたらそれがクラスライブラリだというわけではありません。

 

いろいろなプロジェクトで使用できそうな共通の機能をクラスライブラリとして作成しておくと何度もプログラムする手間が省けて便利です。

実際の開発現場では、画面機能とロジックとデータベース機能を別々のそれぞれプロジェクトに分けて、画面はWebアプリケーションとして作成し、ロジックとデータベース機能はクラスライブラリとして作成するというようなこともよくやります。こうしておくと、複雑さを低減できますし、あとになってiPhoneでもこのアプリを提供したいと思った場合に、画面機能のプロジェクトだけ作成/テストすればよく全体を相手にするより楽です。(大事な顧客向けに機能を提供することを想像してみてください。1文字でもプログラムを修正したら全体を再テストしたほうが良い思う人もいるはずです。プロジェクトを分けておけば、この「全体」を小さくできるのです。)

共通で使用できないかもしれない機能でも独立したクラスライブラリにする場合があります。1つの大きなアプリケーションを複数のより小さなプロジェクトに分割するということで、シンプルにさせたい場合です。このようなクラスライブラリの使い方はプロがアプリケーション開発する際には見かけますが、特に必要を感じなければ無理にまねをする必要はありません。

 

クラスライブラリの素晴らしい点は他の人と共有できる点です。

自分が作成したクラスライブラリを、自分が作成するいろいろなプロジェクトから呼び出すだけでも便利ですが、これを他の人に配って他の人にも使ってもらうことができます。

 

2.フレームワーク

2-1..NET のフレームワーク

クラスライブラリを実際に使ってみる前にフレームワークのことを説明しておきます。

 

.NETの機能を実現する仕組みを「.NET 実装」(ドットネットじっそう)と呼びます。.NET 実装は 一種のソフトウェアです。

このことを通常は「フレームワーク」や「.NET のフレームワーク」と呼びます。

フレームワークとはもう少し広い実の言葉で、説明するうえでは紛らわしいことがあります。たとえば、「.NET Framework」は名称に「Framework(フレームワーク)」とついていますが、私がここで言う「.NETのフレームワーク」とイコールではありません。

さて、.NET のフレームワークがなければVBやC#で .NET のいろいろな便利機能を使うプログラムは、実行できないただのメモ書きです。

VBやC#で書いた.NETの機能を使うプログラムを実際に実行してくれるものが .NET のフレームワークです。

 

2-2..NET Framework

2002年に初めて登場した .NET のフレームワークはその名もずばり .NET Framework でした。

.NET Framework は Windows で .NET を実行する環境として20年近く使われており、2021年の今でも .NET Frameworkで動作しているプログラムは大量にあります。

しばらくの間、.NET のフレームワークは .NET Framework しかなく、開発者は .NET Framework のバージョンだけを気にしていれば良い状況でした。

 

2-3.Mono

.NET Framework の登場からまもなくかして、Linuxに対応した .NET のフレームワークとして 「Mono」(モノ)というものが登場しました。

Monoと.NET Frameworkは基本的な機能は同じでしたが、さまざまな違いもありました。この2つは Linux と Windows という明確な違いがあったので大きな混乱はありませんでした。

※やがて、MonoはLinux以外でも動作するようになりました。

Mono と .NET Framework はあくまでも別物なので、Mono で動作している.NETのプログラムから、.NET Frameworkで動作している.NETのプログラムを直接参照することはできません。その逆もできません。

ここが、クラスライブラリを説明するうえで、フレームワークが重要になるポイントです。

 

2-4..NET Core

しらばくして 2016年に Microsoft社 は新しい .NET のフレームワークである「.NET Core」(ドットネットコア)をリリースしました。ここが大きな転換点です。

.NET Core は Linux、Windows、MacOS などさまざまなプラットフォームで動作する.NET のフレームワークです。

.NET Core も .NET Framework と基本的な部分は同じ機能であるものの、さまざまな違いがありました。

 

バージョンを重ねるごとに精力的に機能が追加され、やがて、ついにMicrosoftは、.NET Frameworkの開発を終了し、今後は .NET Core の方に開発に力を入れていくと発表しました。

そして、.NET Framework は 2019年のバージョン 4.8が最後のバージョンとなりました。

.NET Frameworkと.NET Core

 

.NET Coreの方は 2020年から名前を変えて単に「.NET」と呼ぶようになりました。名前が .NET になってから最初のバージョンは 2020年にリリースされた .NET 5 です。今後は毎年 .NET 6, .NET 7 とバージョンアップしていくということです。

 

といっても、2021年時点では.NET Frameworkもまだまだ使われています。世の中には.NET Frameworkで作成されたプログラムが大量にあるので、それのバグ修正や機能追加のために.NET Frameworkが必要ですし、.NET (.NET Core)では使えなくなっている機能もあるので、そういう機能を使うために .NET Framework が必要です。

というわけで、2021年現在、Visual Studio 2019 でプログラムを作成する場合は、.NET Framework を使うのか .NET (.NET Core)を使うのか選択できます。

 

今回説明するクラスライブラリのプロジェクトも、クラス ライブラリ(.NET Framework)とは別にクラス ライブラリ(.NET Core)が存在しています。

プロジェクトの新規作成画面で「ライブラリ」でフィルタリングすると確認しやすいです。

このほかにも同じプロジェクトの種類で .NET (.NET Core) と .NET Framework とにテンプレートが分かれているのはこういう理由です。

 

2-5.フレームワーク間の呼び出し

使用しているの .NET のフレームワークが異なる場合、Visual Basic でまったく同じプログラムを作っても別物となります。

.NET Frameworkで作成したプログラムから、.NET Core 3.1 や .NET 5 のプログラムを直接呼び出すことはできません。

.NET Framework, .NET Core 3.1, .NET 5 の呼び出し/呼び出されの関係は次のようになります。

  呼び出される側(クラスライブラリ)
.NET Framework .NET Core 3.1 .NET 5




.NET Framework × ×
.NET Core 3.1 ×
.NET 5

〇 = 呼び出せます。 × = 呼び出せません。

 

この3つはちょうど新しい方から古い方を呼び出せる関係になっており理解しやすいです。

本来、異なるフレームワーク間の呼び出しはできないはずなのですが、これを実現するためにMicrosoftは見えないところに少し複雑な特別なカラクリを用意して、開発者が便利に複数のフレームワークを使えるようにしました。

このカラクリの重要な原則は、動作するときは必ず同じフレームワーク上で動作するということです。.NET Frameworkで作られたクラスライブラリを、.NET 5から呼び出すとき、そのクラスライブラリは .NET 5 として動作しています。(あなたが明確に.NET Frameworkでコンパイルした場合でも、.NET 5で動作するようならからくり(互換性shim)があります。)

1つ具体例を紹介します。

.NET Frameworkの MsgBox は どんな時でもメッセージを表示してくれる便利な API(≒メソッド)です。.NET 5 でも MsgBox は存在しますが機能が制限され、使用できる場面が限られてしまいました。そのため MsgBoxを使用している.NET Frameworkのクラスライブラリを.NET 5から呼び出す場合、System.Platform.NotSupportedException の例外が発生します。

 

面倒なことに頭を使わないで済むように、クラスライブラリとそれを呼び出すプロジェクトは同じフレームワークをターゲットに作成しておくのが良いでしょう。

でも、いろいろな事情があって、同じにならないことがあるのです。たとえば、誰かが作った便利なクラスライブラリをあなたのプロジェクトで使用しようと思った場合、そのクラスライブラリは .NET Frameworkをターゲットに作成されているかもしれません。そして、あなたのプロジェクトでは .NET 5 でしか使用できない新しい機能を使っているかもしれません。

発展 発展学習  -  この他のフレームワーク

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

本文中で紹介した .NET Framework, .NET (.NET Core) の他に、Mono, Xamarin, Unity などのフレームワークもあります。基本的にはフレームワークをまたいだ参照はできないので、同じフレームワークに統一する方が良いという結論は変わりません。

なお、ASP.NET や EF (Entity FRamework) など「フレームワーク」という名前がついているものはまだ他にもありますが、これらは少し意味が異なります。ASP.NET や EF は .NET Framework や .NET 5/.NET Core に含まれている一部の機能をさしています。だから、.NET 5 で作成されたASP.NET から .NET 5のクラスライブラリを参照することは普通に可能です。

このページではフレームワークが表にまとまっているので理解する助けになるかもしれません。

.NET Standard | Microsoft Docs

 

 

2-6..NET Standard

最後に 少し古いのですが .NET Standard (ドットネット スタンダード)というものがあり、目にする機会があるかもしれないので、触れておきます。

先に言っておきますが、.NET Standardは今後使用する機会は少なくなっていくと思いますので、特に必要がなければ「そんなものもあるんだね」というくらいに頭の片隅にとどめておけばよく、深追いする必要はありません。

説明はこちらのサイトにあります。

.NET Standard | Microsoft Docs

 

.NET Standardは仕様(ルール)の名前です。フレームワークやソフトウェアではありません。

.NET Framework や .NET Core, .NET など複数の.NETのフレームワークが登場する状況になったので、.NETであれば最低限守るべき共通の機能をルール化したものです。

.NET Standardに従っておけば、.NET Frameworkでも.NET Coreでも同じプログラムが動作することが保証されているので、呼び出し側と同じフレームワーク上で動作できるというわけです。

さきほどの、クラスライブラリのプロジェクトテンプレートには (.NET Standard)となっているものもあり、これを選択すると .NET Standardの範囲内にある機能しか使えないプロジェクトを作成できます。

 

2-7.まとめ

 

それでは、次の章では実際にクラスライブラリを使ってプログラムしてみましょう。

 

参考

.NET Core - .NET Core による .NET のクロスプラットフォームへの移行 | Microsoft Docs

.NET Standard | Microsoft Docs

コードを .NET Core に移植するために依存関係を分析する - .NET Core | Microsoft Docs

サーバー アプリ用 .NET 5 と .NET Framework の選択 | Microsoft Docs

.NET Standard を使用すると、.NET 5 を含め、すべての .NET 実装全体でコードを共有できます。 NET Standard 2.0 の互換モードを使用すると、.NET Standard および .NET 5 プロジェクトで .NET Framework ライブラリを参照できます。

.NET Standard の新機能 | Microsoft Docs

.NET Standard 2.0 以降、互換性 shim を使用して .NET Standard ライブラリから .NET Framework ライブラリにアクセスできるようになりました。 この互換レイヤーは開発者に対して透過的です。

standard/README.md at master · dotnet/standard · GitHub

 

 

3.クラスライブラリの作成

3-1.クラスライブラリ プロジェクト

まずは、簡単にクラスライブラリを作成してみましょう。

クラスライブラリを作成する場合はプロジェクトの一覧から次のどれかを選択します。

Visual Studioのバージョンによって表記や選択できるプロジェクトが異なる場合があります。この表はVisual Studio 2019を基にしています。

テンプレート名 内容
クラス ライブラリ (.NET Standard) .NET Framework, .NET Core, .NET 5以降で利用可能なクラスライブラリです。
いろいろな環境で使用できる半面、どの環境でも使用できる機能しか利用できません。
クラス ライブラリ (.NET Framework) .NET Frameworkのプロジェクトから呼び出し可能なクラスライブラリです。
クラス ライブラリ (.NET Core) .NET Core, .NET5以降のプロジェクトから呼び出し可能なクラスライブラリです。

見るとわかるように .NET 5 という選択肢はありません。.NET 5 以上を使用したい場合は、 .NET Core を選択して、プロジェクト作成後にプロパティでフレームワークのバージョンを変更することになります。

というわけなので 何か事情があるのでなければ 最新の .NET Core を選択しておくのが機能面でも互換性の面でも便利なことが多いです。

環境が限定できるのであれば、.NET Framework を選択することで 環境固有の機能(たとえばどこでも機能するMsgBox)を使用できるのが便利です。でも、何も制約がなく好きにプログラムしていいのであれば、できるだけ新しいものを使いたいものです。

 

Visual Studio 2019では新しいプロジェクトを作成するときに「ライブラリ」でフィルタリングするとこれらのクラスライブラリが見やすくなります。

 

今回は クラス ライブラリ(.NET Core)を選択することにします。

古いバージョンのVisual Studioではフレームワークの区別はないので、単純にクラスライブラリを選択してください。

プロジェクトの名前は説明の都合上 MyLibrary にしておいてください。

 

クラスライブラリのプロジェクトは初期状態では次のように Class1 だけが存在しています。

Class1.vbのプログラムは初期状態では次のようになっています。

VB2002 VB2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Public Class Class1

End Class

 

せっかくなので、この段階で一度Visual Studioの実行ボタンをクリックして、デバッグを開始してみましょう。

次のようなメッセージが表示され、実行できないことがわかります。

---------------------------
Microsoft Visual Studio
---------------------------
クラス ライブラリの出力タイプを持つプロジェクトを直接起動することはできません。

このプロジェクトをデバッグするには、ライブラリ プロジェクトを参照するこのソリューションに実行可能なプロジェクトを追加します。その実行可能なプロジェクトをスタートアップ プロジェクトとして設定してください。
---------------------------
OK
---------------------------

 

3-2.プロジェクトがターゲットとするフレームワーク

このプロジェクトがターゲットとなるフレームワークを確認してみましょう。

ソリューションエクスプローラーで MyLibrary プロジェクトを右クリックして、プロパティを選択してください。

ターゲットフレームワークになにが選択されているでしょうか。

Visual Studio のアップデートの適用状況によっても異なるかもしれませんが、私の場合 .NET Core 3.1 となっています。(私は2021年3月20日に Visual Studio 2019 Version 16.8.4 を使ってこの記事を書いています。)

今回は、.NET 5 を使用したいので、一覧から .NET 5.0 を選択して保存してください。

ここで .NET 5.0 以上を選択しなかった場合、この後紹介するプログラムはそのままでは動作しない場合があります。

メモ メモ  - 古い環境で試してみたい場合

.NET 5.0 よりも古い環境でこの記事の内容を試してみたい場合は、プロジェクトに NuGet を使って System.Text.Json をインストールしてください。

 

メモ .NET 5.0 がない場合

一覧に .NET 6.0 などもっと新しいバージョンがあるならば選択しても良いでしょう。(現時点では将来のことはわかりませんが、多分、この記事で説明する内容は通用するはずです。)

新しいバージョンもないのであれば、一番下にある「別のフレームワークをインストールします...」をクリックします。Webブラウザーが起動して、Visual Studioで使用できるフレームワークの一覧が表示されます。

ここで、.NET 5.0 の x64 SDK または x86 SDK をダウンロードしてインストールすることで、Visual Studio .NET 5.0 が選択できるようになります。

Download .NET SDKs for Visual Studio (microsoft.com)

 

ソリューションエクスプローラーで MyLibraryプロジェクトをダブルクリックして、ターゲットフレームワークを確認することもできます。

MyLibraryプロジェクトをダブルクリックすると次のような内容が表示されます。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <RootNamespace>MyLibrary</RootNamespace>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

</Project>

これは MyProject.vbproj ファイルの実際の中身です。

ここで TargetFramework を直接キーボード入力で変更すると、さきほどのプロパティが連動し変化します。Visual Studioが使用できない環境では、このファイルを直接編集することになります。Visual Studioが使用できる場合は、さきほどのプロパティ画面を使えばよいので、特に気にする必要はありません。

有効な値はたとえば次のようなものです。

ターゲットとするフレームワーク 設定値の例
.NET 5 net5.0
.NET Core 3.1 netcoreapp3.1
.NET Framework 4.8 net48

 

発展 発展学習  -  ターゲットフレームワークモニカー

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

この値はターゲットフレームワークモニカー(Target Framework Moniker)、略称 TFM と呼ばれます。フレームワークだけでなく、対象とするプラットフォームも指定できる点で、フレームワークとは異なります。設定できるTFMの一覧は下記のサイトに記述されています。

SDK スタイル プロジェクトでのターゲット フレームワーク - .NET | Microsoft Docs

 

3-3.天気予報機能のプログラム

今回は クラスライブラリのテストとして、気象庁が公開している情報を利用して、天気の概要を取得するクラスを作成してみます。

クラスの名前は Class1 ではなく、WeatherForecast にしたいので、ソリューションエクスプローラーで Class1.vb を右クリックして「名前の変更」を選択し、WeatherForecast .vb に変更してください。変更すると、ファイルの名前を変更する確認が表示されるので「はい」を選択するとプログラムの方も自動で名前が変わります。

VB2002 VB2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Public Class WeatherForecast

End Class

 

メモ 「いいえ」を選択すると、ファイル名だけが変更され、プログラムは Class1 のままです。

この場合、自分でプログラムを直接書き換えてクラス名を変更します。

プログラムがある程度進んでいて、いろいろなところでこのクラスを使用している場合でも、「はい」を選択するとそれらすべての箇所で名前が新しいものに置き換わります。自分でプログラムを直接書き換える場合でも、名前の変更機能を使って、すべての使用箇所の名前を一括して変更することができます。

 

これで準備が整ったので WeatherForecastクラスにプログラムをしましょう。

今回はクラスライブラリの仕組みや利用方法の説明が目的なので、プログラムにはあまりこだわらず、下記の完成版のコードをそのまま貼り付けて使用してください。

このプログラムでは簡単に天気の概要を取得する Overview というメソッドを1つだけを実装しています。このプログラムはインターネットから天気の情報を取得するので、インターネットにつながっていない環境では動作しません。

VB2012 VB2013 VB2015 VB2017 VB2019

Imports System.Text.Json

''' <summary>天気予報します。</summary>
Public Class WeatherForecast

    ''' <summary>天気の概要を取得します。</summary>
    ''' <param name="areaCode">対象の地域。東京なら130000、大阪なら270000。気象庁のコード表参照。</param>
    Public Function Overview(areaCode As String) As String

        Dim url As String = $"https://www.jma.go.jp/bosai/forecast/data/overview_forecast/{areaCode}.json"

        'VB2013以前の場合
        'Dim url As String = $"https://www.jma.go.jp/bosai/forecast/data/overview_forecast/" & areaCode & ".json"

        Using client As New System.Net.Http.HttpClient()
            Using response As System.Net.Http.HttpResponseMessage = client.GetAsync(url).Result

                If response.IsSuccessStatusCode = False Then
                    '呼び出しに失敗した場合、例外を発生させます。
                    'この位置で下記2行のコメントを解除すると例外発生時に実行を停止して、変数errorBody の中身を確認することができます。
                    'これにより詳細なエラー情報を取得できる場合があります。 
                    'Dim errorBody As String = response.Content.ReadAsStringAsync.Result
                    'Stop
                    Throw New System.Net.Http.HttpRequestException("指定されたURLはエラー" & response.StatusCode & " で応答しました。" & url)
                End If

                '成功した場合、生のレスポンス全体を文字列で取得
                Dim responseBody As String = response.Content.ReadAsStringAsync.Result

                Using document As JsonDocument = JsonDocument.Parse(responseBody)
                    Dim root As JsonElement = document.RootElement
                    Dim targetArea As String = root.GetProperty("targetArea").GetString
                    Dim headlineText As String = root.GetProperty("headlineText").GetString
                    Return targetArea & "。" & headlineText
                End Using
            End Using
        End Using

    End Function
End Class

 

これで完成です。Visual Studio 2019の場合、次のような状況になっているはずです。

 

 

発展 発展学習  -  プログラムで JSON を扱う

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

このプログラムでは天気予報のデータを JSON (ジェイソン)という形式で扱っています。VBのプログラムでJSONを扱う場合、この記事のように System.Text.Json を使うか、またはこれとは別の JSON.NET というパッケージを使うのが2021年3月時点では一般的です。JSON.NETを使う場合はNuGetでNewtonsoft.JSONを検索してインストールします。JSONについては下記の記事で説明しています。

JSONの仕様

VB/C#でJSONの生成 (JSON.NET編)

VB/C#でJSONの読み込み (JSON.NET編)

VB/C#でJSONの読み込み (System.Text.Json編)

 

4.クラスライブラリの呼び出し

4-1.プロジェクトの追加

 

それでは、今作った MyLibrary の WeatherForecast クラスを他のプロジェクトから利用してみましょう。Windowsフォームアプリケーションでも、コンソールアプリケーションでも構いませんが、今回は本当に天気予報できるのかとにかく簡単に確認してみたいので最もシンプルなコンソールアプリケーションを使って呼び出してみることにしましょう。

ソリューションエクスプローラーで、ソリューション MyLibrary を右クリックして、[追加] - [新しいプロジェクト] を選択してください。

 

メモ メモ  - 先生!MyLibraryを右クリックしても、そんなメニューがありません!

プロジェクトではなく、ソリューションを右クリックしてください。

 

コンソール アプリ (.NET Core) を選択して、追加してください。

コンソール アプリ (.NET Framework)を選択してしまうと、.NET 5で作ったクラスライブラリは呼び出せないので注意してください。

プロジェクトのテンプレートの選択方法や名前はVisual Studioのバージョンによって少し異なります。

名前は何でもよいです。ここでは ConsoleApp1 としておきます。

 

このようにソリューションエクスプローラーに2つのプロジェクトが表示された状態になります。

このようにソリューションには複数のプロジェクトを作成することができますが、何も設定していない場合、これらのプロジェクト同士には何の関係もなく、ただ一緒に表示されているだけです。

 

4-2.フレームワークの設定

このプロジェクトも .NET 5 をターゲットにしたいので、プロジェクトを右クリックして、プロパティを選択し、プロパティ画面でターゲットフレームワークを確認してください。.NET 5.0 になっていない場合は、.NET 5.0 を選択して保存します。

 

4-3.スタートアッププロジェクト

さて、ソリューションエクスプローラーでは MyLibraryプロジェクトが太字で表示されています。これは、Visual Studio の実行ボタンを押したときに開始されるのが MyLibraryプロジェクトの方であることを示しています。

MyLibraryプロジェクトはクラスライブラリーなので、直接実行することはできません。実行されるアプリケーションを ConsoleApp1 の方にしましょう。

そのためには、ソリューションエクスプローラーで ConsoleApp1 を右クリックして、「スタートアッププロジェクトに設定」をクリックします。

これで、ConsoleApp1 の方が太字で表示される状態になります。

この状態でVisual Studioの実行ボタンを押すと、コンソールアプリが実行されることが確認できます。

繰り返しになりますが、今の状態ではConsoleApp1とMyLibraryには何の関係もないのでConsoleApp1を実行しても、MyLibraryが呼び出されたりビルドされることはありません。

 

4-4.プロジェクト参照

ConsoleApp1からMyLibraryを呼び出せるようにするには「プロジェクト参照」という操作をします。

ConsoleApp1を右クリックして [追加] - [プロジェクト参照] をクリックします。

参照マネージャーというダイアログが表示されるので、MyLibraryにチェックをつけて OK をクリックします。

 

これで設定は完了です。

ソリューションエクスプローラーで ConsoleApp1の[依存関係] - [プロジェクト] に MyLibrary と表示されるのが確認できます。

 

ConsoleApp1 の Program.vb に次のようにプログラムして、さっそく天気予報できるか試してみましょう。

Imports System

Module Program
    Sub Main(args As String())

        Dim forecast As New MyLibrary.WeatherForecast

        Dim text As String = forecast.Overview("130000")
        Console.WriteLine(text)

        Console.WriteLine("終了するにはEnterキーを押してください。")
        Console.ReadLine() 'Enterキーが押されるまで待機します。

    End Sub
End Module

 

実行すると、このように東京の天気の概要が表示されます。いいですね!

晴れだとか、曇りだとか言う情報も取得できるのですがプログラムが複雑になるので今回は、説明文だけを取得するようにしています。

 

Overviewの引数の "130000" は東京を表しています。

下記の表を見て、自分で住んでいる地域の番号を指定することもできます。

 

areaCode 場所
011000 北海道(宗谷地方)
012000 北海道(上川・留萌地方)
013000 北海道(網走・北見・紋別地方)
014100 北海道(釧路・根室・十勝地方)
015000 北海道(胆振・日高地方)
016000 北海道(石狩・空知・後志地方)
017000 北海道(渡島・檜山地方)
020000 青森県
030000 岩手県
040000 宮城県
050000 秋田県
060000 山形県
070000 福島県
080000 茨城県
090000 栃木県
100000 群馬県
110000 埼玉県
120000 千葉県
 
areaCode 都道府県
130000 東京都
140000 神奈川県
150000 新潟県
160000 富山県
170000 石川県
180000 福井県
190000 山梨県
200000 長野県
210000 岐阜県
220000 静岡県
230000 愛知県
240000 三重県
250000 滋賀県
260000 京都府
270000 大阪府
280000 兵庫県
290000 奈良県
300000 和歌山県
 
areaCode 都道府県
310000 鳥取県
320000 島根県
330000 岡山県
340000 広島県
350000 山口県
360000 徳島県
370000 香川県
380000 愛媛県
390000 高知県
400000 福岡県
410000 佐賀県
420000 長崎県
430000 熊本県
440000 大分県
450000 宮崎県
460100 鹿児島県
471000 沖縄県(沖縄本島地方。本島中南部・本島北部・久米島)
472000 沖縄県(大東島地方)
473000 沖縄県(宮古島地方)
474000 沖縄県(八重山地方。石垣島地方・与那国島地方)

 

5.名前空間

メモ スムーズに試すために

この章では名前空間を変更する方法を説明しますが、実際には変更しないで読んで理解するだけにしておくことをお勧めします。

ここで名前空間を変更した場合、この後でてくるプログラムに登場する名前空間もそれに合わせて変更する必要があるからです。

 

このプログラムでWeatherForecastを呼び出しているのはこの部分です。

Dim forecast As New MyLibrary.WeatherForecast

Dim text As String = forecast.Overview("130000")

New を使って WeatherForecaseクラスをインスタンス化するときに名前空間として MyLibrary を指定しています。

このように既定では、クラスライブラリのプロジェクト名がそのまま名前空間名になります。

既定の設定を変更して名前空間名を自分で指定するには、MyLibraryプロジェクトを右クリックしてプロパティで「ルート名前空間」を変更します。

 

ルート名前空間とは . で区切られた名前空間の先頭のことです。たとえば、System.Text.Json という名前空間の場合、ルート名前空間は System であるか、または System.Text であるか、または System.Text.Json です。

確実にルート名前空間でないと言えるのは Text と Json と Text.Json です。

「ルート名前空間」とは機能上なにか特別な意味はなく、便宜上呼んでいるだけの名前なのでこのようなあいまいな定義で事足ります。

このプロパティ画面のルート名前空間には A でも A.B でも A.B.C でも好きな名前を付けることができます。 . を含むことができるというのがポイントです。たとえば、Weather.Office のようなルート名前空間を設定することができます。

このように変更した場合、ConsoleApp1 側で WetherForecast クラスを指定するプログラムは次のように変更する必要があります。

Dim forecast As New Weather.Office.WeatherForecast

Dim text As String = forecast.Overview("130000")

Namespaceキーワード(読み方:Namespace=ネームスペース)を使って名前空間名を指定することもできます。

たとえば、次の例のように WeatherForecastクラスを囲む Namespace Global.PublicOffice ~ End Namespace を追加します。

この 「Global」(読み方:Global=グローバル)はここで指定する名前空間がルート名前空間であることを示すキーワードです。

Imports System.Text.Json

Namespace Global.Japan.PublicOffice
    '''<summary>天気予報します。</summary>
    Public Class WeatherForecast

        ・・・中略・・・

    End Class
End Namespace

この場合 WeatherForecastクラスの完全修飾名は Japan.PublicOffice.WeatherForecast になります。

Globalを省略して、 Namespace Japan.PublicOffice とした場合、ルート名前空間はプロジェクトのプロパティで設定したものになります。たとえば、プロジェクトのルート名前空間が既定の MyLibrary の状態で、Namespace Japan.PublicOffice で囲まれたクラスの名前空間は MyLibrary.Japan.PublicOffice になります。

よほど巨大なライブラリを作成するのでない限り、名前空間に妙にこだわると逆にわかりにくくなってしまうので、私はプロジェクト名がそのまま名前空間名になる既定の状態がシンプルで良いと思っています。

 

名前空間を実際に変更してみた方は、次の説明に進む前に名前空間を最初の状態(ルート名前空間が MyLibraryである状態)に戻して、一度再実行しておいてください。