定数の扱い

少し前にはまったのでメモ。
VB.NETにおける定数の扱いについて。

EXEをビルドするときに、定数は展開される

一言でまとめると、これだけです。言われてみれば当たり前のようにも感じますが、少し意識する必要がある。
というのも、EXEプログラムの中で他のDLLを参照しているとはまる。
はまった現象は、以下の流れで再現出来る。

  1. プログラムをビルド
  2. 参照しているDLLの定数の値を変更し、ビルド
  3. 1で作成されたEXEファイルがあるディレクトリに、2でビルドしたDLLを上書き
  4. EXE実行
  5. 定数が変わってない><
  6. 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だけ上書きしても無駄。

根本的にさ・・・

  • 本当に、定まっている物だけを定数として定義すべき。まして、別クラスに用意するならなおさら。
  • 万が一を考えて、他から参照されているクラスから先にビルド

今度からは、罠にひっかかる事はないぜい!