04 Microsoft.VisualBasic.dllを取り込まないEXEの作り方
検証環境 自作ATX(PenIII1.2GHz/GA-6VTXE/512MB)
WinXPPro(2002)SP2/VS.NET2003(7.1.3091) & .NET Framework1.1(1.1.4322SP1)/MSDN-Lib Oct,2004
Mainをどぅにかする前に。
前項でちらっと記述したんですが、ふつーにビルドすると、起動時にコマンドプロンプトウィンドウが表示されてしまうんですね。
でも、DLLでビルドして他EXEからCallするとコマンドプロンプトウィンドウは表示されませんでした。
ってことは、プロンプトが出るか出ないかは、/targetパラメータの問題なのかなー。
と思い、msdnLibraryで調べてみたら、Visual Basic コンパイラ オプション - /targetにしっかり書いてありました。
Windows プログラムを作成するには、/target:winexe を使用します。
…そりゃそーか。
VC++だって省略時デフォルトはコンソールEXEだったもんなぁ。WINEXEって明示的に指定してやればおっけーなだけな話でした。うかつー。
さて、本題。標準モジュールを使わないで単独動作するEXEを作りたい。
うーんと。
VB.NETのスタートアッププロシージャには、「Sub Main」の他に「Form_Load」もあったんではなかったっけ。
FormクラスはSystem.Windows.Forms.Form名前空間で定義されているクラスなので、Microsoft.VisualBasic名前空間とは無関係のはずだよなぁ。
てことで、Formから起動するソースファイルを起こしてみました。
これはさすがにテキストエディタで書くのはしんどいので、VS.NET IDEのフォームエディタで生成した.vbファイルをそのまま使わせてもらうことにします。
中になんにもコードを追加しないで、フォームエディタで作ったままの素のファイルをコマンドラインからコンパイル。

…うわーキビしー。
ちょっとまず、エラー数を減らしましょう。
「基本クラス'System.ComponentModel.Component'を含むアセンブリ'System'への参照が必要です。」
「型'System.Drawing.Size'が定義されていません。」
あたりは、System.dllとSystem.Drawing.dllを /reference で指定してやる必要があります。のでとりあえずそれをパラメータに追加して。

…だめだ、やっぱり「'Sub Main'が見つかりません」と出てくる。
未確認ですが、IDEからForm起動でビルドすると、IDEかMicrosoft.VisualBasic.dllかでダミーのMain( )を追加または「あるものとみなす」ような処理をしているんではないでしょうか。
コマンドラインからMicrosoft.VisualBasic.dllを明示的に取り外しちゃってビルドしているわけですから、IDEの助けもMicrosoft.VisualBasic.dllの助けも受けられない。
我ながら、なんだか無意味にキツいことをやっているよぅな気になってきましたよ。
うーん、やけくそ。Formクラスの中に、無理矢理Main( )を書いてみました。
Public Sub Main()
Dim frmIts As New sal_Verify01_06
frmIts.ShowDialog()
frmIts.Dispose
End Sub
結果。

やっぱり無理か。まぁ当たり前なんですが。
そ言えば、「BC30737」ってどんなエラーなんだろぅ。
msdnLibraryに載ってるのかなぁ。
ってんで、「bc30737」でmsdnLibraryを検索してみると、うわーツリーからはたどれない位置にひっそりとありました。
これ、どーいぅわけだかmsdn onlineからは検索できません。ので、CD/DVDからmsdnLibraryをインストールしていないと読めません。
しかたがないので、ここでは説明の一部を直接引用します。
コマンド ライン アプリケーションでは Sub Main を定義する必要があります。 Main をクラス内で定義する場合は Public Shared として宣言し、モジュール内で定義する場合は Public として宣言する必要があります。
…えっ?Main( )ってクラス内にも定義できるんだ!
大あわてで前述のソースを
Public Shared Sub Main()と直して再度チャレンジ。
Dim frmIts As New sal_Verify01_06
frmIts.ShowDialog()
frmIts.Dispose
End Sub
通ったー!!
実行結果。

MSILの取り込み状況。
完璧だー!!
いゃぁ疲れたー。
ちなみに。
上記例では呼び出される側のクラスの中に呼び出すMain( )を書くといぅわけのわかんないことをやっていますので、別のクラスをPublicで作成してその中にMain( )を書くのがスジかと。
ついでに、VS.NET IDE(devenv.exe)経由でもコマンドラインコンパイルは可能らしく、この場合は「.vb」ファイルではなく「.sln」ファイルを起点にコンパイルされるそぅです。
確かにこれならプロジェクトレベルでの参照関係を持つ複数プロジェクトをコンパイルできるんで、IDEからコンパイルかけるとの同じ状況になりますね。
ただし、この場合に /novbruntimeref パラメータが受け入れられるかどぅかはわかりません。
気が向いたら、いつかやってみよぅと思います。













