定数の扱い
少し前にはまったのでメモ。
VB.NETにおける定数の扱いについて。
EXEをビルドするときに、定数は展開される
一言でまとめると、これだけです。言われてみれば当たり前のようにも感じますが、少し意識する必要がある。
というのも、EXEプログラムの中で他のDLLを参照しているとはまる。
はまった現象は、以下の流れで再現出来る。
- プログラムをビルド
- 参照しているDLLの定数の値を変更し、ビルド
- 1で作成されたEXEファイルがあるディレクトリに、2でビルドしたDLLを上書き
- EXE実行
- 定数が変わってない><
- DLL上書きしたのに、何でだよ!おい!
といった感じになりました。
具体例
定数のクラス
Class CONSTTEST Public Const STRTEST="aaa" End Class
Exeプログラム
Module Console.Writeline(CONSTTEST.STRTEST) End Module
両方をビルドして、Exeを実行すると、aaaと表示される。
ここで、
Class CONSTTEST Public Const STRTEST="bbb" End Class
として、ビルドしdllをExeのbinディレクトリにある前のバージョンのdllに上書き。
実行。結果は、aaaと表示。
気付いた理由
Reflectorという逆コンパイラで中身を見たら、定数が展開されていた!
上の例だと、
Console.Writeline("aaa")
とExeがなっていたのです。そりゃ、dllだけ上書きしても無駄。
根本的にさ・・・
- 本当に、定まっている物だけを定数として定義すべき。まして、別クラスに用意するならなおさら。
- 万が一を考えて、他から参照されているクラスから先にビルド
今度からは、罠にひっかかる事はないぜい!