さて、例によって My なんですけどね、すんごい気になってることがあるんですよ。それは・・・
コードはどこにあるんでぃすか!?(My.Settings とか、My.Resource とかはいますけど、My.Computer っていなくないですか?)
まぁあれですよね、Visual Basic のことですから、きっとどっかに隠してあるんでしょう。それとも おかんの仕業かな?
さぁ、自分(My)探しの旅に出ますか♪※「これが言いたかっただけだろ!?」という質問にはお答えできません。
[検証1] Visual Studio 経由じゃないと My のコードは使えないのか?
んなこたぁ無いと思いますけど、とりあえず Visual Basic コンパイラ をコマンドラインから使用してコンパイルしたものに My は存在するかを調べます。まず、以下のコードを「Hello.vb」というファイルに保存します。
Imports System
Imports System.Windows.Forms
Namespace Torikobito.VisualBasicHello
Public Class HelloProgram
Public Shared Sub Main()
MessageBox.Show(My.Application.Info.AssemblyName & ", world!")
End Sub
End Class
End Namespace
で、これをVisual Basic コンパイラ と Main プロシージャ。その1。の時と同じようにコマンドラインからコンパイルします。今回はこんな感じで↓。
vbc /target:winexe /out:Hello Hello.vb
あら不思議、Hello.exeができると思います。実行してみると、「Hello, World!」というメッセージが表示されますね。
で、今回も登場するのが、
MSDN:MSIL 逆アセンブラ (Ildasm.exe) (http://msdn2.microsoft.com/ja-jp/library/f7dy01k1(VS.80).aspx)
です。先ほどの Hello.exe を開いてみましょう。ツリーをつらつら眺めていると・・・
ちゃんと My あるね♪
というわけで、Visual Studio 経由じゃなくてもいけることは分かりました。
そして My はコンパイラが作ってくれていることもね♪
[検証2] My がコード上に存在しなくても生成されるのか?
My をどこにも使用していなくても勝手にできちゃうの?ってことで調べてみますね。さっきのコードを以下のようにMyを使わないで書きます。
Imports System
Imports System.Windows.Forms
Namespace Torikobito.VisualBasicHello
Public Class HelloProgram
Public Shared Sub Main()
MessageBox.Show("Hello, world!")
End Sub
End Class
End Namespace
で、先ほどと同じようにコンパイルします。
vbc /target:winexe /out:HelloNoMy Hello.vb
HelloNoMy.exe を MSIL 逆アセンブラで、開いてみましょう。ツリーをつらつら眺めていると・・・
ちゃんと My あるね♪・・・あるのか。orz
というわけで、My がコード上に存在しなくても生成されるのね。
・・・。
・・・・・・。
・・・・・・・・・。
ちょっと待たんかい!!
そんなのいきなり言われても困ります!主人に相談してみないと・・・。
悪ふざけはさておき、なにか忘れてませんか?
コンパイラにはオプションがあるでよ!
そうです!忘れてました!オプションで制御できるかもしれない!と、いうわけでコレ↓
MSDN:Visual Basic コンパイラ オプション一覧 (アルファベット順) (http://msdn2.microsoft.com/ja-jp/library/w95cx9k1(VS.80).aspx)
上から下まで舐めるように見てみます。それっぽいものは無いですねぇ・・・。なのでリンクになっている部分まで読みまくってきました。結果だけ報告すると、
MSDN:/nostdlib(http://msdn2.microsoft.com/ja-jp/library/w95cx9k1(VS.80).aspx)の中に
次のコードは、標準ライブラリを参照しないで T2.vb をコンパイルします。_MYTYPE 条件付きコンパイル定数を文字列 "Empty" に設定して、My オブジェクトを削除する必要があります。
vbc /nostdlib /define:_MYTYPE=\"Empty\" T2.vb
ほ~、なんだかそれっぽいですよ!条件付コンパイルですか、よしよしやってみましょう。
vbc /target:winexe /define:_MYTYPE=\"Empty\" /out:HelloMyTypeEmpty Hello.vb
出来上がった HelloMyTypeEmpty.exe を MSIL 逆アセンブラで、開いてみましょう。ツリーをつらつら眺めていると・・・
My ないよ!
というわけで「/define:_MYTYPE=\"Empty\"」を指定すると My は生成されませんでした。
[結果] My は コンパイラ オプション によってその生成が制御されている。
ということですね。なんだか My を使用しない方法の説明になってしまった感じなので、最後にその手順だけ書いておきます。
「/define:_MYTYPE=\"Empty\"」をコマンドライン コンパイルから指定するか、Visual Studio 2005 では、
- ソリューション エクスプローラでプロジェクトを選択します。
- [プロジェクト] メニューの [プロパティ] をクリックします。
- [詳細コンパイルオプション]ボタンをクリックします。
- [カスタム定数]欄に「_MYTYPE="Empty"」と入力します。
以上です。ただし Visual Studio のプロジェクトが自動生成する 'My' のコードもコンパイルできなくなるので、使い勝手は悪いでしょうね。