Visual Basic 入門講座
VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

第7回 ビルド

この記事が対象とする製品・バージョン (バージョンの確認方法)

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.プロジェクトを構成するファイル

Visual Basicのプロジェクトはかなりシンプルなものでも複数のファイルから成り立っています。

下の画像は初期状態のWindowsフォームアプリケーションのソリューションエクスプローラーです。

ソリューションエクスプローラー

初期状態のプロジェクトはVisual Basicのバージョンや環境・設定によっても異なりますが、おおむね同じです。ここではVisual Basic 2019を例に説明します。

ソリューションエクスプローラーには下記の6個の項目が表示されています。

これらはファイルに似た単位ですが、ファイル自体を表しているわけではありません。

「ソリューション 'WindowsApp1' (1/1 プロジェクト)」などを右クリックして、「エクスプローラーでフォルダーを開く」を選択すると、フォルダーが開いて実際のファイルを確認することができます。

Visual Studio 2017以降であればソリューションエクスプローラーでもフォルダービューに切り替えることでファイルやフォルダーを確認することができます。

Visual Studio 2017以降でフォルダービューに切り替えるには「ビューを切り替える」のアイコンをクリックして、フォルダービューを選択します。

フォルダービューへの切り替え

操作方法 元に戻す方法

「ビューを切り替える」のアイコンをクリックして、ソリューション名をクリックすると元の表示に戻ることができます。

どういうわけか、1回フォルダービューに切り替えると次からは「フォルダービュー」とは表示されず、フォルダー名とソリューション名の2択になります。フォルダー名とソリューション名はデフォルトでは同じなので紛らわしいです。カッコ内にパスが書いてあるほうがフォルダー名です。

 

 

フォルダービューは初期状態では次のように表示されるはずです。

実際のフォルダーを開いてもこれとほぼ同じ状況になっています。バージョンや状況・設定によって若干の違いはあります。

フォルダービュー

 これ以外に隠しファイル・隠しフォルダーや設定ファイルなどがいくつか存在します。

 

WindowsApp1.slnがプロジェクトを束ねるソリューションファイルで、WindowsApp1.vbprojがプロジェクトを表すプロジェクトファイルであることは入門講座第1回でも説明しています。このどちらかをダブルクリックするとVisual Studioが開いてWindowsApp1プロジェクトが編集可能な状態になります。

Form1.vbはみなさんがプログラムしているフォームのプログラムです。このファイルをメモ帳で開いてプログラムの内容を確認することもできます。

Form1.Designer.vb (読み方:フォームイチ ドット デザイナー ドット ブイビー)はVisual Basicが自動生成しているプログラムで、ここには興味深い内容が記述されています。少し詳しく見てみましょう。

 

1−2.Form1.Designer.vb

フォームにボタンやテキストボックスをぺたぺた貼り付けていろいろとプロパティを変更すると、このForm1.Designer.vbにその操作の結果がプログラムとして記録されます。

ですので、プロパティの変更方法がわからない場合、実際に操作してみてどのようなプログラムになったか確認することができます。

少し試してみましょう。

フォームにボタンを1つ貼り付けてから、プロパティウィンドウを使ってFontプロパティを何か変更してみてください。たとえば、フォントを「メイリオ」にして、大きさを18ポイントにしてみます。

プロパティウィンドウでFontプロパティを変更したところ

次にソリューションエクスプローラーでForm1.Designer.vbをダブルクリックしてソースコードを確認してみてください。

Visual Studio 2015以前の場合は、プロジェクトをクリックしてから、「すべてのファイルを表示」アイコンをクリックして、Form1.vbを展開すると、Form1.Designer.vbを開けるようになります。Visual Studio 2019でもこの方法でForm1.Designer.vbを開くこともできます。このあたりの操作はバージョンによって少し違います。

Visual Studio 2015でソリューションエクスプローラーにForm1.Designer.vbを表示する

Form1.Designer.vbの中にははじめから何十行かプログラムがあります。Button1とFontを手がかりにざっと見てみると、すぐにFontを設定している箇所が見つかると思います。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


Me.Button1.Font = New System.Drawing.Font("メイリオ", 18.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(128, Byte))

プログラムの意味は良くわからないかもしれませんが、これをコピーしてあなたのプログラムに貼り付ければプログラムの中でフォントを変更することができます。

なお、このForm1.Designer.vbは中を見るのはかまいませんが変更は絶対にしないでください。ここを変更するとVisual Studioはフォームをうまく認識できなくなって、デザイナーが機能しなくなる場合があります。

 

1−3.objフォルダーとbinフォルダー

プロジェクトを構成するファイルに話を戻します。

objフォルダーとbinフォルダーには、プログラムを開始VB2013の実行ボタンするときに、自動的にファイルが生成されます。初期状態では両方とも空です。この2つのフォルダーは削除してもプログラムを開始すると再度自動生成されます。

プログラムを開始する流れは重要なので章を改めて説明します。

 

2.ビルド

Visual BasicでプログラムしたWindowsフォームアプリケーションは実行するときには拡張子がexeのファイルになります。

Visual Basicなどのプログラムからコンピューターで実行可能な形式(この場合はexeファイル)を作成することをビルドと呼びます。

普段、Visual Studioでプログラムを開始VB2013の実行ボタンをすると、自動的にビルドが行われています。ビルドメニューのソリューションのビルドかWindowsApp1のビルド(WindowsApp1の部分はプロジェクト名によって変わります)をクリックすると、プログラムを開始しないでビルドだけ行うこともできます。

ビルドは複雑な処理なので、いきなり実行可能な形式のファイル(exeファイルなど)を作成することはできず、中間段階でいくつかのファイルを作成します。中間段階のファイルは最終的には不要なのでビルド完了後には削除してもかまいません。objフォルダーはこのような中間段階でできるものが格納されます。

既定ではビルドするための設定が2つ用意されています。1つは開発用の設定で、Debug(デバッグ)と呼びます。Debugがデフォルトのビルド設定なので、特に意識していない場合Debugでビルドされています。もう1つは完成版用の設定でRelease(リリース)と呼びます。Debugでビルドしたほうが開発者用の便利機能がいろいろと使用できますので普段はDebugでビルドするようにしてください。Releaseでビルドするとこの入門講座や初級講座で解説しているいろいろな機能が使えない場合があります。

DebugとReleaseはVisual Studio 2019の場合、ここで切り替えます。

DebugビルドとReleaseビルドの切り替え

他のバージョンのVisual Studioだと少し場所や表示が違うかもしれませんが大体同じです。

それでは、何かプログラムを開始VB2013の実行ボタンして、ビルドしてみてください。今はビルドが目的なので実行を開始したらすぐに終了させてください。

そして、binフォルダー内のdebugフォルダーを見ると、ビルドの結果作成されたファイルが確認できます。

bin debugの中身

ファイル名はデフォルトではプロジェクト名になるので、プロジェクト名を変更している場合はこれとは異なるファイルになります。ここではプロジェクト名がWindowsApp1という前提で説明します。

WindowsApp1.exeはあなたが作成したプログラムそのものです。Visual Studioがなくてもこのexeをダブルクリックするとプログラムを実行することができます。

WindowsApp1.exe.configは設定ファイルです。各種設定をもったプログラムを作成するとこのファイルで設定を切り替えられるようになります。

WindowsApp1.pdbとindowsApp1.xmlは開発者用の情報が入ったファイルです。普通は無視してください。

pdbファイルにはプログラムで使用しているファイルのパスが埋め込まれています。そのためフォルダー名にあなたの名前を含んでいる場合などはこのpdbファイルを渡すとあなたの名前も相手にわかってしまうかもしれません。pdbファイルを誰かに渡すときは気をつけてください。できあがったプログラムを友達に渡す方法は第10回で説明しています。

 

まだ単純なプログラムしか作っていないのでビルドも単純ですが、複雑なアプリケーションを作成するとビルド時に行われる処理や、binフォルダー内に生成されるファイルは変わります。

 

3.コンパイル

 

3−1.ソースコードとコンパイル

ビルドについてもう少し詳しく見てみます。

MsgBox("Hello") や Button1.Text = "aaa" などの文字で書かれたVisual Basicのプログラムを ソースコード と呼びます。

フォームにボタンやテキストボックスをぺたぺた貼り付ける操作も、その操作に応じて裏ではForm1.Designer.vbにソースコードが自動生成されており、人間が自分で書いたか、コンピューターが自動生成したかの違いはありますが、ソースコードとしては同じ立場です。

ソースコードはそのままでは実行できません。コンピューターでメインの処理を実行しているCPUがVisual Basicを理解できないからです。CPUが理解できるのはマシン語(機械語)と呼ばれる処理定義で、一応「語」とは付いていますが、もはや人間が直接読み書きするような言葉ではありません。Visual Basicは2段階の翻訳を経てマシン語に変換され実行されます。

このようにソースコードをコンピューターで実行可能な言語に翻訳する処理を コンパイル と呼びます。

3−2.MSIL

コンパイルの一段階目で MSIL (エムスアイエル) と呼ばれる言語に変換されます。CIL (シーアイエル)とも呼ばれます。MSILの段階ですでにマシン語に近い言語になっており人間による解読は困難です。熟練した人間は直接MSILを読み書きできるかもしれません。

この一段階目のコンパイルはVisual Studioでビルドを実行したときに行われます。

ビルドで作成されるexeファイルの中にMSILが含まれています。exeファイルの中にはいろいろな情報が埋め込まれており、MSILはそのうちの一部です。ただし、メモ帳で開いても次のような表示になり、基本的には読めません。

ためしにメモ帳でさきほどのWindowsApp1.exeを開いてい見ると次のように表示されました。一部埋め込まれている文字列を読めるものもあります。

メモ帳でWindowsApp1.exeを開いたところ

 

このMSILはメモ帳で開いても意味不明ですが、IL逆アセンブラーというツールでexeを開くとexeに含まれているMSILを意味のある形で表示することができます。

IL逆アセンブラーのファイル名はildasm.exeで、.NET Frameworkのバージョンごとに存在しているため、複数あります。

これがどこにインストールされているかはっきりした情報はわからないのですが、最近(2019年10月9日現在)では下記のようなパスに存在します。

C:\Program Files (x86)\Microsoft SDKs\Windows\vXX.XA\bin\NETFX X.X.XTools\ildasm.exe

Xの部分にはバージョンを表す数字が入ります。桁数はバージョンによって異なる場合があります。

たとえば次のパスです。

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\ildasm.exe

メモ メモ  -  よくわからないんです
IL逆アセンブラーがいつインストールされてどういうルールでパスが決まっているのか、私はよくわからないのです。Windows7やWindows10でははじめから入っているのかもしれませんし、Visual Studioをインストールしたタイミングで一緒にインストールされているのかもしれません。パスも昔はもっと違うパスにインストールされていました。

一応開発者コマンドプロンプトでwhere ildasmと入力すれば場所がわかるのですが、開発者コマンドプロンプトというものがどこにあるのか一口で説明しにくいのです。(スタートメニューの中にあるので探してみてください。)せっかく面白いツールなのにもったいないです。まぁこのツールが使えなくてもプログラムにはほとんど支障がないのであまり重要でないのも事実です。

ildasm.exeを起動すると次のようなウィンドウが開きます。

ildasm.exe

この中に、exeファイルをドラッグ&ドロップしてみてください。

この例では私はVisual Basicでは下記の通りプログラムしています。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, ByVal e As EventArgs) Handles Button1.Click

    MsgBox("Hello")

End Sub

 

IL逆アセンブラーにexeをドロップしたところ

なにやら見慣れない情報が表示されます。このほとんどはMSILの目次のような情報です。

この中にButton1_Clickがあります。これをダブルクリックすると中のMSILが見えます。MSILがVisual Basicとは全然違う言語であることがわかると思います。

MSIL

ここで注目して欲しいことは2点あります。

1つは「Hello」という文字列が見えていることです。このようにプログラム内に記述した文字列は簡単に見ることができるので、パスワードのような重要な情報をプログラム内に埋め込んで配布すると中身のパスワードも簡単に見られてしまいます。

2つ目はMsgBoxというキーワードもはっきり見えることです。つまり、VBとは全然違うとはいえMSILの知識があれば、このプログラムどういう処理を行っているかも見ることができます。

見終わったら忘れずにildasm.exeを閉じてください。ildasm.exeでexeファイルを開いている間はVisual Studioでは実行できなくなってしまいます。

 

3−3.JIT

2段階目のコンパイルでMSILからマシン語(機械語)に翻訳されます。

2段階目のコンパイルはプログラムを実行している最中に行われます。exeの場合は、exeを実行しているときに同時にこの2段階目のコンパイルもしているということです。この仕組みのおかげで、実行する環境に合わせたコンパイルが可能になります。このように実行するタイミングでコンパイルを行う仕組みを JIT ・ JITコンパイル と呼びます。

操作方法 事前コンパイル

ネイティブイメージジェネレーター(Ngen.exe)というツールを使用して事前に2段階目のコンパイルしておくことも可能です。ただし、これはかなりこだわりのある玄人向けのツールなので、特に必要がなければこのツールを試してみるという時間の無駄を省いてこういうものもあるんだなという知識程度にとどめておくことをお勧めします。

https://docs.microsoft.com/ja-jp/dotnet/framework/tools/ngen-exe-native-image-generator

 

4.エラー

 

4−1.エラーの種類

今度はビルドの観点でエラーを眺めてみます。

エラーとは、プログラムが意図したとおりに動かない現象で、実にさまざまな種類・状況があります。ビルドの観点でエラーを3つに分けてみましょう。

 

4−2.ビルドエラー

ビルドエラーはそもそもプログラムが実行できないエラー。

ビルドエラーの表示

このエラーはビルド自体ができない場合です。ビルド自体ができないのでexeファイルを作成できません。

「最後に成功したビルドを実行しますか?」と聞かれているのは、もし、以前に作成したexeファイルがあるのならば、とりあえずそれを実行しますか? という意味です。

ほとんどの場合、以前に作成したexeファイルを実行する意味はないので「いいえ」が正解です。私はこのダイアログで「はい」が実際に役に立ったことは一度もありません。

 

Option Strict Onでエラー

ビルドエラーの場合、原因と思われる箇所に 赤い波線 が表示され、エラー一覧にエラーの内容が表示されます。

エラー一覧が表示されていない場合は、表示メニューのエラー一覧で表示されます。

これらを手がかりにプログラムを修正していくことになります。

赤い波線はエラーになっている場所であることに間違いないのですが、必ずしも修正すべき場所を表していないことに注意してください。赤い波線とエラー一覧をヒントに修正すべき場所を探すのはプログラマの仕事です。初級講座では修正すべき場所を探すための便利な機能やツールも紹介しますが、まずはVisual Basicの知識をつけていくのが良いです。

 

4−3.実行時エラー

実行時エラーはビルドはできたのだけれども実行中にエラーが発生するものです。

次のようにエラーの内容を指摘するダイアログが表示されます。これを例外処理アシスタント ダイアログと呼びます。

実行時エラー

せっかくいろいろな情報が表示されても初心者には厳しいです!と思われるかもしれませんが、一応表示されている内容には目を通す癖をつけましょう。そうしないといつまで経っても慣れないです。

たとえば、この画像だとよくはわからなくてもプログラム内の jp-JP の部分がおかしいらしいという見当はつけられますね。

この例ではここを ja-JP にするとエラーが発生しなくなります。

 

4−4.論理エラー

論理エラーとは、実行した結果が想定と違うことを指します。Visual Studioは別にエラーとは言わないし実行もできるのだけれど、結果がおかしいという場合です。

たとえば、日付の書式設定で日と月を逆にしてしまうとおかしな表示になります。27月6日・・・。おかしいです。

前回の講座の内容を読んでいる人はこのエラーを治す方法は理解していると思います。

月がおかしい

論理エラーは実行はできているので一番ましなエラーのように見えますが、Visual Studioが何も言ってくれないので気が付かない場合があり、結構やっかいです。

ビルドエラーや実行時エラーはVisual Studioが「エラーがある。原因はこれじゃないか」と親切に教えてくれるのですが、論理エラーは自分でエラーがないことを確認して、エラーがあれば自分で原因を推測することになるからです。

 

メモ メモ  -  エラー修正の心構え

エラーが起こって困ることは今後たくさんあると思います。私は困っている人をたくさん見てきました。そして、私は困っている人の半分以上がエラーメッセージを読んでいないことに気が付きました。「エラーで困っているのに肝心のエラーメッセージを読んでいない?!」。そんな馬鹿なことはありません。エラーメッセージには必ず目を通してください。理解できない言葉が並んでいて読むのが苦痛かもしれません。それでも読んでください。まだまだ初心者なのでどうせ読んでもわからないと思っているかもしれません。それでも読んでください。エラーメッセージが重要なのです。

「るきおさん、エラーになって困っているんです。今日中に直さないと締め切りに間に合わないんです。」
「それは大変だ。エラーメッセージはなんです?」
「よくわからないです。ボタンをクリックするとうまく動かないんです。」
・・・というようなやりとりにはうんざりしています。この情報量では助けたくても助けられないです。

他にもエラーを修正するときの心構えがありますので紹介しましょう。

1.直せるエラーから直す。

複数のエラーが発生している場合、一覧を見て上から順番に直すのではなく、直せるエラーから直しましょう。1つの原因から複数のエラーが発生している場合があり、1つ直すといくつかのエラーが解消されたりします。

2.ドキュメントを見る

ドキュメントを見ましょう。これは次回説明します。

3.時間を置く

次の日にもう一度プログラムを見直すと前日にはわからなかったエラーの原因がすんなりわかったりします。本当にこういうことがあるんです。

4.あきらめる

もし、別の方法でプログラムできるのなら、エラーのでるところを削除して別の方法でプログラムしてしまいましょう。これは実際の開発現場ではときおり使われる方法です。これは「逃げ」ですが、将来あなたがパワーアップしたときにはこのときあきらめたエラーの原因がわかるようになっているかもしれません。今はプログラムを完成させることで満足しておきましょう。

5.人に聞く

どうしても解決できない場合は人に聞くしかありません。 「人」といっても実際の知り合いばかりではなく、インターネットや本・雑誌なども含みます。 当サイト Visual Basic 中学校の掲示板でもみなさんの質問を受け付けています。 当サイトを含むインターネット上の掲示板で質問するときは、必ずVBのバージョンと実際のエラーメッセージを書き込んでください。

良い書き込みの例

こんにちは。

VB2019でプログラムしているのですが、ビルドエラーになってしまいどうしても原因が分かりません。解決方法を教えていただけないでしょうか?

エラー一覧に表示されるメッセージは次の通りです。

Option Strict On では 'String' から 'Double' への暗黙的な変換は許可されていません。

プログラムは次の通り記述しており、st * x の st の 部分に赤い波線が表示されます。私は 12 と表示されることを期待しています。

Dim st As String = "4"
Dim x As Decimal = 3

MsgBox(st * x)

これに対して「ヘルプを見なさい」「過去ログを見なさい」などといわれてもめげたり反撃したりしてはいけません。逆に「ヘルプの見方」や「過去ログの探し方」を質問してみましょう。