02 コマンドラインからコンパイルしてみる
検証環境 自作ATX(PenIII1.2GHz/GA-6VTXE/512MB)
WinXPPro(2002)SP2/VS.NET2003(7.1.3091) & .NET Framework1.1(1.1.4322SP1)/MSDN-Lib Oct,2004
で。
なんとかこのMicrosoft.VisualBasic.dllを取り込まない形でビルドすることはできないか、ってことを考えてみたいわけです。
そもそもプロジェクトの[参照設定]には「Microsoft.VisualBasic」は存在しないんですよね。

この状態でなんで参照できているのかなぁ。
で、メニューから[プロジェクト]-[プロパティ]-[インポート]と見てみると、こちらには「Microsoft.VisualBasic」がインポートされています。
(クリックで拡大します)
じゃあインポートを削除しちゃえばいいのかなぁ。
ってやってみましたけど結果は同じ。あいかわらずMSILの中では「Microsoft.VisualBasic」が取り込まれています。
MsgBoxとかVisualBasic名前空間に属する機能をコードに記述すると「名前'MsgBox'は宣言されていません」とかエラーが出ますが、これは単に名前空間の省略が効かなくなっているだけで、「Microsoft.VisualBasic.MsgBox」って記述するとビルドが通っちゃうので。
このインポートって奴は実コードのインポートではなく、名前空間の定義の取り込みみたいなんですね。…JITに対応するってことはそーいぅことなんだなぁ。
うーん。
あと取り込むアセンブリとかをコントロールできそぅなところが見つからない…。
なんかないかなぁとmsdnLibraryをあちこち読んでいたら、コンパイル コマンド ラインのサンプルってページに、「コマンド ラインからコンパイルする場合、/reference コンパイラ オプションを使用して Microsoft Visual Basic ランタイム ライブラリを明示的に参照する必要があります。」って一文が。
てゅうことは、逆にコマンドラインから「/referenceコンパイラオプション」をつけないでやればMicrosoft.VisualBasic.dllが外せるのか?
VB.NETはVS.NET IDEからコンパイルするのがふつーですが、昔ながらのコマンドラインコンパイラ(vbc.exe)も用意されています。
しかもこのvbc.exe、VS.NETではなく.NET Framework側の機能として用意されていますので、VS.NETを買わなくとも、無償で.NET Framework SDKを入手しちゃえば最低テキストエディタとvbc.exeでVB.NET製プログラムの製造はできるんですね。…いちおぅ。
「いちおぅ」ってのは、VS.NETで提供されている「効率よく開発を行う」機能がまったく使えなくなっちゃうのでやっぱり使いにくいんですね。ので、今どきの皆さんにはあまり積極的にはお奨めしませんが、まぁ毛嫌いするほどのモノでもありません。
で、vbc.exeでのコンパイルは、コマンドプロンプトから実行してやる必要があります。
ホントは簡単にコンパイルできるよぅに最初に環境変数を整えた方がいいんですが。環境変数を整えるバッチファイル(vsvars32.bat)はどーいぅわけかVS.NETのインストールフォルダ下のCommon7\Toolsフォルダ(デフォルトでインストールするとC:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools)にあるんですよね。
自前で用意してできないバッチじゃありませんが、かなりめんどいのも確かです。せっかくコンパイラを.NET Frameworkで提供してるんですから、このバッチも.NET Framework側で用意してほしかったなぁ。
まぁそれはそれとして。
- Windowsの[スタート]メニューから[すべてのプログラム]-[アクセサリ]とたどり、コマンドプロンプトを起動します。(XPの場合)
- cd (VS.NETのインストールフォルダ下のCommon7\Toolsフォルダ)と入力してEnterを押します。
フォルダパスにスペースがある場合は、パス文字列の前後を「"」(ダブルクォーテーション)でくくる必要があります。
めんどい場合は、「cd(スペース)」まで入力してから、移動したい先のフォルダをエクスプローラからコマンドプロンプトにドラッグ & ドロップすると楽ちんかもしれません。 - vsbars32と入力してEnterを押します。
- cd (コンパイルしたいソースファイルのあるフォルダ)と入力してEnterを押します。
vsvars32.batとかコンパイルしたいソースファイルがcドライブ以外にある場合は、適宜d:
なんのことを言っているのかよくわからない方は、今さらですがMS-DOSの入門書を読んでみてください。
さて。今度はコンパイルするソースファイルを用意しなくちゃいけませんね。
テキストエディタでVB.NETの文法にのっとったテキストファイルを作り、「.vb」の拡張子で保存すれば、ソースファイルのできあがりです。
Public Module sal_Verify01_03起動すると無意味なメッセージボックスが表示されるだけ。まぁ動作が検証できればいいので、凝った作りにしてもねぇ。
Sub Main()
MessageBox.Show("OK?" _
, "sal_Verify01-03" _
, MessageBoxButtons.OK _
, MessageBoxIcon.Information)
End Sub
End Module
で、さっそくコンパイルしてみます。
msdnLibraryの記述どおりにコンパイルするなら、vbc /reference:Microsoft.VisualBasic.dll sal_Verify01-03.vbって感じで。
実行結果はこちら。

…あら?エラー。
えーと、BC30451ってエラーは、主に使っている機能の名前空間がうまく指定されていない場合に発生します。
調べてみると、MessageBoxとそれ用の定数はSystem.Windows.Formsにあるので、まずはソース上名前空間を省略できるようにImports行を追加。
Imports System.Windows.Formsでもってコマンドラインも、r:/"System.Windows.Forms.dll"を追加。
Public Module sal_Verify01_03
Sub Main()
MessageBox.Show("OK?" _
, "sal_Verify01-03" _
, MessageBoxButtons.OK _
, MessageBoxIcon.Information)
End Sub
End Module
「/reference」は「/r:」と省略できるんですね。ので前述のMicrosoft.VisualBasic.dllも省略して。
ついでにコンパイル動作の詳細を表示してくれるパラメータ/verboseも追加して。の結果。

OK。で実行してみる。

OK。なんかバックにプロンプトウィンドウが出てしまぅけど、そこらへんはまぁ後でなんとかすることとして。
当然ながらこぅやって作ったEXEにはMicrosoft.VisualBasic.dllが取り込まれているわけで。

さて、ここからよぅやっと本番。
「/r:Microsoft.VisualBasic.dll」を外してコンパイルしてみるとどぅなるか。

…だめじゃん。
自動的にMicrosoft.VisualBasic.dllは取り込まれるじゃん。
上述のmsdnLibraryの記述はなんだったの(T-T)。
ひょっとして.NET Framework1.0の頃は必ず記述しなければならなかったけれども1.1では省略しても暗黙で取り込んでくれるよぅになったとか。でもmsdnLibraryの記述の方まではまだそこらへんが修正されていなかったりとか。
といぅ推測も成り立ちはしますが、別にこの推測の検証をしたってどぅにもなりません。
知りたいのは、Microsoft.VisualBasic.dllを取り込まないビルド方法なんですから。
…あきらめちゃおっかなー(T-T)。