前回の
Main プロシージャ (とYシャツと私)
の最後で気になったよ~って書き残して一日経過。やっぱり気になったままなのでおべんきょうしてきました。
さて、普段 Visual Studio に依存しまくりんぐな私にとって「Visual Basic コンパイラが」っていわれてもねぇ・・・な感じですので、とりあえず検索・・・それっぽいのを見つけました。
MSDN:Visual Basic コンパイラ(http://msdn2.microsoft.com/ja-jp/library/s4kbxexc(VS.80).aspx)
MSDN:Visual Basic コンパイラ オプション一覧 (アルファベット順) (http://msdn2.microsoft.com/ja-jp/library/w95cx9k1(VS.80).aspx)
MSDN:Visual Basic コンパイラ オプション一覧 (カテゴリ別) (http://msdn2.microsoft.com/ja-jp/library/c03639ab(VS.80).aspx)
コマンドライン コンパイラを起動する方法はこちら。
MSDN:コマンド ライン コンパイラを起動する(http://msdn2.microsoft.com/ja-jp/library/380cz5k4(VS.80).aspx)
まずはとにもかくにも、コマンドラインからコンパイルしてみます。ありきたりに以下のコードを「CompileTest.vb」というファイルの中に記述します。
Imports Microsoft.VisualBasic
Imports System
Imports System.Windows.Forms
Namespace Wankuma.Torikobito.CompileTest
Public Class Program
<STAThread()> _
Public Shared Sub Main()
Application.Run(New TestForm)
End Sub
End Class
Public Class TestForm
Inherits Form
End Class
End Namespace
で、Visual Studio 2005 コマンド プロンプトを使用してコンパイルします。以下を実行してみると・・・
vbc /target:winexe /imports:Microsoft.VisualBasic,System,System.Windows.Forms /out:CompileTest CompileTest.vb
「CompileTest.exe」が・・・できたやん♪(当たり前。)
ま、ここまではよいとして、本題。先ほどのコンパイラ オプション一覧を眺めてみると・・・あった♪
MSDN: /main (http://msdn2.microsoft.com/ja-jp/library/y4bwckbb(VS.80).aspx)より
Sub Main プロシージャを含むクラスまたはモジュールを指定します。
/main:location
location
必ず指定します。プログラムの起動時に呼び出される Sub Main プロシージャの絶対パス名です。これは、/main:module または /main:namespace.module という形式です。location は、Form から継承されたクラスであってもかまいません。
location は、Form から継承されたクラスであってもかまいません!?
ではお言葉に甘えまして(?)先ほどのコンパイラ オプションに /main で TestForm クラスを指定してみる。。
vbc /target:winexe /imports:Microsoft.VisualBasic,System,System.Windows.Forms /out:CompileTest
/main:Wankuma.Torikobito.CompileTest.TestForm CompileTest.vb
・・・あれ?できたの?(予想GUY...)
TestForm クラスにはきっと Main プロシージャが生成されたんだろうけど・・・Program クラスにも Main プロシージャあるよ?これはおそらく、Main
プロシージャってのはいくつあってもいいけど、ちゃんとどれがエントリポイントか指定してよ~、さらにはSystem.Windows.Forms.Formを継承してればMain
プロシージャがなくても作ってあげるよ~ってことかな?
では、ちょっと話がそれまして以下のコードを「CompileTest2.vb」として用意しました。
Imports Microsoft.VisualBasic
Imports System
Imports System.Windows.Forms
Namespace Wankuma.Torikobito.CompileTest2
Public Class ProgramA
<STAThread()> _
Public Shared Sub Main()
MessageBox.Show("ProgramA の Main ぷろしーニャ♪")
End Sub
End Class
Public Class ProgramB
<STAThread()> _
Public Shared Sub Main()
MessageBox.Show("ProgramB の Main ぷろしーニャ♪")
End Sub
End Class
End Namespace
で、コンパイル。まずはProgramA を指定。
vbc /target:winexe /imports:Microsoft.VisualBasic,System,System.Windows.Forms /out:CompileTest2
/main:Wankuma.Torikobito.CompileTest2.ProgramA CompileTest2.vb
ちゃんと「ProgramA の Main ぷろしーニャ♪」ってメッセージが出ます。(ProgramB でも同じなので割愛。)
では、/main を指定しないとどうなるか・・・。
vbc /target:winexe /imports:Microsoft.VisualBasic,System,System.Windows.Forms /out:CompileTest2 CompileTest2.vb
コンパイルできませんでした。メッセージは
'Sub Main' が 'CompileTest2' で 2 回以上宣言されています:Wankuma.Torikobito.CompileTest2.ProgramB.Main(), Wankuma.Torikobito.CompileTest2.ProgramA.Main()
というわけで「Main プロシージャってのはいくつあってもいいけど、ちゃんとどれがエントリポイントか指定してよ~」なんでしょうね。
とまぁ、ここまでコネコネ遊んできたわけですが、実はすべてVisual Studio上から同じことが体験できるんですね。(なら、はじめからそっちを(ry・・・)
たとえばVisual Studio 2005 では以下の手順です。
- Visual Basic の WindowsApplication のテンプレートでプロジェクトを作成します。
- プロジェクトのプロパティのアプリケーションタブで「アプリケーション フレームワークを有効にする]」のチェックをはずします。
- [スタートアップ オブジェクト] ボックス内の値を変更します。
[スタートアップ オブジェクト]の中身は 'Sub Main' か 'Sub Main をメンバに持っているクラス' か 'フォーム クラス' がリストアップされます。ここの切り替えが /main オプションなんですね。
ちょっと基本的なことからやり始めたので長いわりに内容がないようなのですが、まぁこの辺で次回へ。