Top > Programmingとか > VB / VB.NET > Microsoft.VisualBasic.dllを取り込まないビルド

03 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

あきらめきれないなー、といぅわけで、Googleで検索かけてみることにしました。

プログラミング系の情報をGoogleで探したい時のコツは、

  • なるべく正確な用語を使用する。しかもできるだけ英語で。
  • 日本でヒットしない場合はWeb全体に検索範囲を広げ世界中から探す。
ってあたりだと勝手に思っているんですが。

今回のケースは「vbc.exeでMicrosoft.VisualBasic.dllを取り込まないコマンドラインオプションはないか」ですから、「Microsoft.VisualBasic.dll vbc」で探してみることにしてみました。
実際に検索してみると、日本で12件中8件、Web全体で296件中96件(いずれも2005.02.13時点)。

もちろんできれば日本語の方が私には理解しやすいので、ヒットされたページを全部ざっくり読んでみて。
…うーん、やっぱりないかぁ。なんかCompact Frameworkのページが多いのは、コマンドラインでしかビルドが提供されていないからなんでしょうか。いぇほんとぅにそぅなのか私は知らないんですが。

で、Web全体の方で見てみると。

のべ6件目に「(Non)Removal of Microsoft.VisualBasic Assembly」(Microsoft.VisualBasicアセンブリの除去…できません)ってページが。
おー?なんか私と同じテーマで嘆いているページなのかしら、と見てみたら、Dave Donaldsonさんといぅ方のBlogで。いゃなんだか主にVB.NETの方向にフカい記述てんこ盛りでしばしぼけーっと眺めてみたり。 いゃ本題に戻って。
上記blogページの最後のコメントで、Fredrikさんといぅ方の

I managed to remove the reference by compiling as "vbc /novbruntimeref HelloWorld.vb /r:Microsoft.VisualBasic.dll" Nice :)
私は"vbc ~"としてコンパイルすることで、なんとか参照を取り除いてるよ。ナーイス(^^)

えっ「ナーイス」?

いゃ問題はそこではなく。

/novbruntimeref ?

なんだそのパラメータは。
msdnLibraryのVisual Basic コンパイラ オプション一覧には載っていませんよ?

今度は「vbc novbruntimeref」でGoogle検索(Web全体)。…わずか2件。「novbruntimeref」だけでも7件中4件。
ヒットしたページのひとつ、Matthew Reynolds' .NET 247(TM)What is VB.NET anyway?でMattias Sjogrenさんが

You can, if you compile from the command line and use the (undocumented) /novbruntimeref parameter. That will, of course, cause a bunch of compile errors if your code uses anything in the VB runtime library.
コマンドラインコンパイルで(非公開の)「/novbruntimeref」パラメータを使えば(VBランタイムライブラリを取り除いたプロクラムの生成は)できるよ。もちろんこの場合、VBランタイムライブラリで定義されている何かをコードに書いちゃうとコンパイルエラーだからね。

…あー。非公開パラメータでしたか。
なんだか旧VBでの時のAddressOf演算子を思い出すなぁ。(これ、途中のバージョンまで非公開の機能だったんです。)

なんでこの人がたはこんな非公開情報をさくっと知っているんだろぅ。く、くやしいなぁ。
Microsoftの開発チーム周辺から非公式に教えてもらったんでなければ、vbc.exeそのものを解析したとしか思えません。
ちくしょぅ、人生は不公平だっ。



などと我が身の至らなさを嘆いていてもしょーがないので、このnovbruntimerefって奴がホントにツカエる隠しパラメータなのか、確認してみることにします。

やり方は簡単、前項で使ったソースファイルを、そのまま「novbruntimeref」オプションつけてコンパイルしてみればいいんです。

vb01-03-01.gif

おぉっ。確かに.NET Frameworkコアのランタイムmscorlib.dllと、コマンドラインで明示したSystem.Windows.Forms.dllしか読み込んでいないよ!

vb01-03-02.gif

ってあらっ。
Microsoft.VisualBasic.dllで定義されている機能は一切使っていないはずのソースなのに、「それがない」ってエラーが出ている。

「クラス'Microsoft.VisualBasic.CompilerService.StandardModuleAttribute'が見つかりません。」って…

あっ、標準モジュールってMicrosoft.VisualBasic.dllで定義されているのか!

考えてみれば.NET Frameworkにはクラスしか用意されていないはずで、標準モジュールはVB.NET専用にカスタマイズされたクラスなわけだから、その定義はMicrosoft.VisualBasic.dllの中でされていると考えるのが自然だよなぁ。言われりゃたいへんごもっとも、な話ではあります。

などと感心している場合ではないっす。標準モジュールがダメなら、Main( )をどこに書けといぅんだ。

まぁこれもいいや、後回し。
まずは /novbruntimeref でコンパイルが通って、Microsoft.VisualBasic.dllを取り込まない実行形式ファイルが生成され、それが正常に動作することを確認したいです。

てことで、前項で提示したソースを一般的なクラスに書き直し。

Imports System.Windows.Forms
Public Class sal_Verify01_04
Sub TestMethod()
MessageBox.Show("OK?" _
, "sal_Verify01-04" _
, MessageBoxButtons.OK _
, MessageBoxIcon.Information)
End Sub
End Class
で、EXEではなくDLL(クラスライブラリ)としてコンパイルが通るよぅに、/target:libraryコマンドラインオプションを追加して。

vb01-03-03.gif

これでsal_Verify01-04.vbと同じフォルダにsal_Verify01-04.dllができるので、

vb01-03-04.gif

VS.NET IDEで新規プロジェクトを作成して、sal_Verify01-04.dllを参照設定かけて、これをCallするコードを記述して実行。

vb01-03-05.gif
(クリックで拡大します)

結果。

vb01-03-06.gif

で、MSILの.NET Frameworkライブラリ取り込み状況。

vb01-03-07.gif
OK!Microsoft.VisualBasic.dllが取り込まれていないぞ!!

よーし、ここまでなんとか来ました。
あとはMain( )をどぅにかするだけなんだけどなぁ。

…どーしよぅ?

トラックバック

このエントリーのトラックバックURL:
http://salv.miscnotes.com/mt/mt-tb.cgi/443

コメントを投稿