.Net 1.x では、Microsoft.Win32.RegistryKey クラスの GetValue メソッドを使用してレジストリ データを読み取ると、データは実際に「処理」されます。
たとえば、ある文字列データの元の値は次のようになります。
%SystemRoot%System32IoLogMsg.dll
ただし、GetValue メソッドを使用して取得されたデータは
C:WINDOWSSystem32IoLogMsg.dll
つまり、レジストリ内の文字列を読み取るときに、システムが自ら環境変数を展開します。
これにより、Environment.ExpandEnvironmentVariables メソッドを呼び出す手間が省けますが、逆に、レジストリ文字列をそのままコピーしたい場合には、無力になります。
.Net2.0 では、Microsoft.Win32.RegistryKey クラスに小さな変更が加えられていること、つまり、新しいオーバーロードが GetValue メソッドに追加されていることを知って嬉しい驚きを感じました。
パブリック オブジェクト GetValue (
文字列名、
オブジェクトのデフォルト値、
RegistryValueOptions オプション
) このメソッドの 3 番目のパラメーターは列挙であり、現在有効な値は DoNotExpandEnvironmentNames のみです。
この値を指定すると、GetValueで得られる結果は展開されていないデータとなります。