DOBON.NET DOBON.NETプログラミング掲示板過去ログ

追加したEnumが反映されない

環境/言語:[VB.NET VS2008]
分類:[.NET]

現在、VisualStudio2008 VB.NETで開発しています。
共通DLLにEnumを追加した場合に、追加した内容が反映されなくて困っております。
以下が例です。


1.共通クラス.DLL作成(例:DLLはexeフォルダに設置)
Public Enum a
ichi = 0
ni
san
End Enum

プロパティで値の受け渡しを行う

2.共通.DLLを参照するExeを作成
Dim cls as new 共通クラス
cls.プロパティ = 共通クラス.a.ni

※EXEを生成し(例:DLLはexeフォルダに設置)実行するとEnumはniで処理される


3.共通.DLLを修正し、DLLを再生成してexeフォルダのDLLファイルを上書き
Public Enum a
zero = 0
ichi
ni
san
End Enum

※2.のEXEは修正せずにそのままexeフォルダ内のEXEを実行するとichiで処理される(niで処理されたい)
(VSでEXEを再作成(ソースを修正しない)すると、Enumは反映されます。)



基本的にEnumを追加した場合、EXEは再作成しないといけないものなのでしょうか?

大至急ご回答お願いいたします。
> 基本的にEnumを追加した場合、EXEは再作成しないといけないものなのでしょうか?
はい。
■No27230に返信(Hongliangさんの記事)
>>基本的にEnumを追加した場合、EXEは再作成しないといけないものなのでしょうか?
> はい。

ご返答ありがとうございます。

EXE側が古い定義のEnumを参照してしまうからという認識で正しいでしょうか?

Enumで定義した意味がなくなってしまうような気がしてなりません。
今までこのような現象にぶち当たったことがありませんでした。。。
> EXE側が古い定義のEnumを参照してしまうからという認識で正しいでしょうか?

Enumはビルドされ中間言語に変換された段階で、
名前としてではなく数値として扱われるようになります。
修正前のEnumは
ichi = 0
ni = 1
san = 2
となり、
cls.プロパティ = 共通クラス.a.ni はcls.プロパティ = 1へと変換されます

ここでDLLだけを修正するとEnumは
zero = 0
ichi = 1
ni = 2
san = 3
となりますが、EXEを再生成するまでcls.プロパティには数値として
1が代入されているのでichiと認識されます。

Enumで今後このような問題を起こしたくないのであれば、
追加の値は一番後ろに配置するようにしてください。
そして今後値の順番を変えなくて済むように注意深く設計してください。

EXEの方をどうしても再コンパイルしたくないのであれば
zero = -1
ichi = 0
ni
san
とすればいいでしょう。ただし利用者に大きな誤解をまねくことがあるのでおすすめできません。
■No27232に返信(suzuさんの記事)
>>EXE側が古い定義のEnumを参照してしまうからという認識で正しいでしょうか?
>
> Enumはビルドされ中間言語に変換された段階で、
> 名前としてではなく数値として扱われるようになります。
> 修正前のEnumは
> ichi = 0
> ni = 1
> san = 2
> となり、
> cls.プロパティ = 共通クラス.a.ni はcls.プロパティ = 1へと変換されます
>
> ここでDLLだけを修正するとEnumは
> zero = 0
> ichi = 1
> ni = 2
> san = 3
> となりますが、EXEを再生成するまでcls.プロパティには数値として
> 1が代入されているのでichiと認識されます。
>
> Enumで今後このような問題を起こしたくないのであれば、
> 追加の値は一番後ろに配置するようにしてください。
> そして今後値の順番を変えなくて済むように注意深く設計してください。
>
> EXEの方をどうしても再コンパイルしたくないのであれば
> zero = -1
> ichi = 0
> ni
> san
> とすればいいでしょう。ただし利用者に大きな誤解をまねくことがあるのでおすすめできません。
>

ご返答ありがとうございました。
中間言語の段階で数値として扱われてしまうのですね。

とても参考になりました。

また機会がありました場合にはよろしくお願いいたします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板