読者です 読者をやめる 読者になる 読者になる

VBC で Microsoft.VisualBasic.dllを参照させない

VB を vbc.exe でコンパイルしたときに通常では Microsoft.VisualBasic.dll がここのメモにも書いてあるとおり、かならず参照されてしまいます。その参照を外すためには vbc.exe の隠しコマンドラインオプションの /vbruntimeref を指定するのはそれなりに知られていると思います。
しかし、実は /vbruntimeref だけでは駄目で、なぜか /reference で Microsoft.VisualBasic.dll を指定する必要があります。イメージ的に /reference は使用するよという宣言なのでかなり気持ち悪いのですが、論より証拠です。実際の画面イメージを載せていきます。

まず、今回使用するコードは以下です。とくに何も書いておらず、名前空間とクラスだけ定義しています。

Imports System

Namespace Afurock.Test
    Public Class NoVBRuntimeRef

    End Class
End Namespace

これを NoVBRuntimeRef.vb というファイル名で保存して、 vbc.exe でコンパイルを行います。ちなみにライブラリアセンブリを出力するために /target:library を指定します。

まずは、 /novbruntimeref を指定しないでコンパイル。

C:\Programs>vbc NoVBRuntimeRef.vb /target:library
Microsoft(R) Visual Basic Compiler Version 8.0.50727.42
for Microsoft(R) .NET Framework version 2.0.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

メッセージも出さずに、そっけなく終わってしまいますよね(ーー;)

出来上がったアセンブリを Reflector にかけてみます。

余計な気を使ってもらわなくっても結構なのに、 Microsoft.VisualBasic.dll の参照のみならず My 名前空間も作ってくれてます。

では次に、 /novbruntimeref を指定してコンパイルします。

C:\Programs>vbc NoVBRuntimeRef.vb /novbruntimeref /target:library
Microsoft(R) Visual Basic Compiler Version 8.0.50727.42
for Microsoft(R) .NET Framework version 2.0.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

ちょっと時間がかかったかなぁと思うくらいですが、また何も言わずに終了してくれます。がっ!今回はなぜかアセンブリが生成されていません!何回やっても生成されません。ちょっと時間がかかっているのは中で奇妙な動きをしているからで、その奇妙な動きが原因でアセンブリが作られていないのでしょうか?真相を知る由はありませんが、とりあえず作られません。

これをアセンブリが生成されるようにするには、先にも書いたとおり /reference:Microsoft.VisualBasic.dll も一緒に指定します。

C:\Programs>vbc NoVBRuntimeRef.vb /target:library /novbruntimeref /reference:Microsoft.VisualBasic.dll
Microsoft(R) Visual Basic Compiler Version 8.0.50727.42
for Microsoft(R) .NET Framework version 2.0.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

今回はしっかりとアセンブリが作成されていました。そして /novbruntimeref を指定していなかった時と同様にできあがったアセンブリを Reflector にかけてみました。

ばっちり、 Microsoft.VisualBasic.dll の参照と My 名前空間が消えてます。というか System.dll の参照まで消えてしまってますね。これはまったく未検証で憶測ですが /reference を指定したからかなと思います。/reference 指定しない場合はデフォルトで System.dll が参照に追加されるような気がします。


ちなみに Microsoft.VisualBasic.dll の参照がある場合のアセンブリのファイルサイズは 6k で、無い場合のアセンブリは 3k でした。小さな差ですが、やはりファイルサイズにも違いが生じるのですね。