01 VB.NET製のプログラムにはMicrosoft.VisualBasic.dllが必須
検証環境 自作ATX(PenIII1.2GHz/GA-6VTXE/512MB)
WinXPPro(2002)SP2/VS.NET2003(7.1.3091) & .NET Framework1.1(1.1.4322SP1)/MSDN-Lib Oct,2004
いきなりですが、先日Sugiさんとお話しさせていただいていた際に、
必ずImportされて、はずせない
と教えていただきました。
それは単にデフォルトでImportされるよぅになっているだけで、明示的にはずせばはずせるんではないんですかい。
あるいはVisualBasic名前空間に属するモノを使っているからであって、.NET Frameworkクラスライブラリの機能だけを使えばいいんではないんですかい。
などといろんな考えが頭の中をぐるぐるしてきました。
こんな時は、実際に調べてみることに限ります。ので、調べてみることにしましょう。
まず、前提として。
VB.NETとかC#とかで作ったプログラムは、.NET Frameworkといぅシステムの上で動作します。
この.NET Frameworkって奴がちょっとくせ者で、ライブラリなんだかOSの拡張機能なんだかなかなかピンと来にくい位置付けで動作する代物なんですが。
いちおぅ.NETの発表時の説明では「.NET Framework上で動作するプログラムは、プログラムソースをビルド時にMSILといぅ中間言語にコンパイルし、どのプログラミング言語で製造されたかに関係なく実行時に随時(もしくはインストール時に一括で)実行環境に合わせたマシン語に改めてコンパイルされて動作する」ってことだったので。
あー、VB.NETでもC#でも配布時には同じMSILになってしまぅんだなぁ。
文法が違うだけで、どの言語を選んでも同じものが配布できるんだなぁ。
と漠然と認識していたんですが。
その後いろいろ情報収集していくと、どぅもCLS(.NET Frameworkの中で実行を司る部分)は同じでも、言語によって実装できる範囲が違うとかいぅことがわかってきました。
CLSでは用意されている機能だけど、VB.NETからは使用できない(演算子のオーバーロードとか)、C#で実装するにはエラくめんどい(Office連携とか)など、言語によってCLSへのアプローチが異なるわけですね。
まぁここらへんまでは言語ごとの特性、一長一短として笑っていられたんです。
でも、「VB.NETだけVisualBasic名前空間のImportが必須」なんてことになると、これはちょっといかがなものかと。
もちろんVisualBasic名前空間も「名前空間」ってですから.NET Frameworkクラスライブラリの一部です。ので、その気になればC#などからでもImport(とは呼ばないのか?よくわかりませんが)して機能を使用できるんですが。
が、「必要な場合に取り込んで使用できる」と「用がなくても必ず取り込んでしまう」は違いますでしょう。
旧VBでもランタイムの存在をさんざん疎ましく思ってきたのに、.NETになってもVBだけコブ付きですか?
それはちょっと悲しいではないでしょぅか。つか私は悲しいです。
で、まずはそれがほんとぅなのか?ふつーにビルドした場合にMicrosoft.VisualBasic.dllが必ずImportされるのか?ってところから確認してみましょう。
ふつーにVS.NET2003を起動して。
ふつーに[スタートページ]から[新しいプロジェクト]を選択して「Visual Basicプロジェクト」→[OK]して。
できあがったプロジェクトのソリューション構成を[Release]に変更して。
ビルドして。
終了。
これで、Formを表示して終了するだけのプログラムができあがり。
Form自体はVB.NETではなく.NET FrameworkのSystem.Windows.Forms名前空間で提供されている機能なので、これだけなら言語に無関係にほぼ同じ構造のMSILになるはずです。
で、できあがったEXE(MSIL)の中の構造を見るには.NET Framework IL Disassembler (ildasm.exe)を使います。
ildasm.exeはVS.NETのインストールフォルダ(デフォルトでインストールするとC:\Program Files\Microsoft Visual Studio .NET 2003)の中の\SDK\v1.1\Binにあります。
スタートメニューには入りませんが、これは不親切なのではなく、開発ツールをインストールするとツール類はごくふつーにそんな感じです。
さて、上記で作成したEXEをildasm.exeで読み込むと、こんな感じになります。

表示されているツリーの[MANIFEST]をダブルクリックすると、参照されているアセンブリ(この場合はImportされたクラスライブラリ、と思っていいです)の一覧が表示されます。

あー確かにかっきり入ってるー。
上記の確認は、「VB.NETのスケルトンはVisualBasic名前空間を必要とする機能をデフォルトで組み込んでるのではないか」とか、まぁ突っ込みどころ満載ではあるんですが。
とりあえず今のところは、
(Microsoft.VisualBasic.dll)がもれなくついてくる。
…らしい。
ってことがわかれば今回は充分です。
では次回から、VisualBasic名前空間を参照しない(Microsoft.VisualBasic.dllをImportしない)VB.NETプログラムの作り方を模索してみます。