その1はこちら。 Visual Basic コンパイラ と Main プロシージャ。その1。 (http://blogs.wankuma.com/torikobito/archive/2007/03/09/65844.aspx)
その1で寄り道してしまったので、今回はVisual Basic コンパイラが自動的に生成するMain プロシージャってどんな感じなの?ってことを調べてきました。
今回使用するコードはこれです。CompileTest3.vbってファイルに記述します。
Imports Microsoft.VisualBasic
Imports System
Imports System.Windows.Forms
Namespace Wankuma.Torikobito.CompileTest3
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
前回とおなじぢゃん!って思われた方、見ていただいてありがとうございます(どこまでポジティヴなんだw)。でもちょびっと違うんですよ。(ファイル名と名前空間が。)
なぜ、このコードにしたのか?ですが、Windows Application では Application.Run メソッドでメッセージループを開始するのが通常なようなのです。Visual Basic コンパイラの生成するMain プロシージャもきっとそうなのでは?と思い、比較するための材料としてこのコードにしました。
ではまず、Visual Studio 2005 コマンド プロンプトを使用して、Program クラスの Main プロシージャをエントリポイントに指定してコンパイルします。出力は「CompileTest3_ProgramMain.exe」です。
vbc /target:winexe /out:CompileTest3_ProgramMain /main:Wankuma.Torikobito.CompileTest3.Program CompileTest3.vb
つぎに TestForm クラス をエントリポイントに指定してコンパイルします。出力は「CompileTest3_TestForm.exe」です。
vbc /target:winexe /out:CompileTest3_TestForm /main:Wankuma.Torikobito.CompileTest3.TestForm CompileTest3.vb
これで比較対象ができました。でも・・・
どうやって比較したらいいのさ!?orz
ですよね。分かりませんよね。で、考えます・・・(待つこと3分)。
あ!ここでうわさの「MSIL 逆アセンブラ」ですよ!
・・・詳細はこちら。
MSDN:MSIL 逆アセンブラ (Ildasm.exe) (http://msdn2.microsoft.com/ja-jp/library/f7dy01k1(VS.80).aspx)
MS の IL の 逆アセンブラですよ(深入りしません。)。ま、先ほど生成された実行ファイルの中身をのぞいてみようとしてるわけですよね。私の環境では[スタート]メニューから-[プログラム]-[Microsoft .NET Framework SDK v2.0]-[Tools]-[MSIL 逆アセンブラ]にありました。
使い方も簡単で、起動して対象のファイルを開くだけですね。あとは表示されるツリーをごそごそしてみたら分かるかと(深入りしません。)。
では、まずは「CompileTest3_ProgramMain.exe」から。ファイルを開くをぽちっとな。ほうほう、Program クラスのツリーの中を探っているとありました!Main : viod 。おもむろにクリッククリック!なんか出てきましたよ!
.method public static void Main() cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// コード サイズ 11 (0xb)
.maxstack 8
IL_0000: newobj instance void Wankuma.Torikobito.CompileTest3.TestForm::.ctor()
IL_0005: call void [System.Windows.Forms]System.Windows.Forms.Application::Run
(class [System.Windows.Forms]System.Windows.Forms.Form)
IL_000a: ret
} // end of method Program::Main
眺めてみると・・・あ!' .entrypoint ' ってあるやん。これが指定されたエントリポイントにつくわけですね。
次に「CompileTest3_TestForm.exe」のファイルをぽちっと開きます。今度は、TestForm クラスのツリーの中を探ってみます。ありました!Main : viod 。おもむろにクリッククリック!なんか出てきましたよ!
.method public static void Main() cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// コード サイズ 11 (0xb)
.maxstack 8
IL_0000: newobj instance void Wankuma.Torikobito.CompileTest3.TestForm::.ctor()
IL_0005: call void [System.Windows.Forms]System.Windows.Forms.Application::Run
(class [System.Windows.Forms]System.Windows.Forms.Form)
IL_000a: ret
} // end of method TestForm::Main
眺めてみると・・・ほとんどおんなじだー♪これにちゃんと ' .entrypoint ' ってついています。(Program クラスの Main : viod からは ' .entrypoint ' が外れていますね。)
・・・というわけで、今回、Visual Basic コンパイラが自動的に生成した Main プロシージャは、
<STAThread()> _
Public Shared Sub Main()
Application.Run(New TestForm)
End Sub
という感じです。・・・どっかまちがってますか~?w