Разница в работе с реестром через lisp и C#
Сегодня понадобилось работать с реестром под C#. Нет, ну надо же было на такие детские грабли наступить со всего маху!
Понадобилось мне тут под NET Framework выяснить определенную информацию из HKEY_LOCAL_MACHINE. Вспомнил я свое лисповое прошлое, где конструкция типа
1 2 | (setq key "HKEY_LOCAL_MACHINE\\SOFTWARE\\Autodesk\\AutoCAD\\R24.0\\ACAD-4101\\Install") (vl-registry-read key "installdir") |
вполне спокойно возвращает запрашиваемые данные и мозг не парит. И попробовал на C# сделать нечто типа
1 2 3 4 | RegistryKey localMachine = Registry.LocalMachine; RegistryKey install = localMachine.OpenSubKey(@"SOFTWARE\Autodesk\AutoCAD\R24.0\ACAD-4101\Install"); string path = install.GetValue("INSTALLDIR").ToString(); |
И на последней строчке я получаю NullReferenceException. Чего?! - возопил я. Того! - ответила мне винда.
И только после нескольких десятков проверок я понял, install = null только потому, что подобный код ломится не в HKLM\SOFTWARE\Autodesk\AutoCAD\R24.0\ACAD-4101\Install, а в HKLM\SOFTWARE\WOW6432Node\Autodesk\AutoCAD\R24.0\ACAD-4101\Install, где, естественно, ситуация совсем другая.
Так что надо менять самую первую строку, и код становится наподобие (для 64-битных Windows, без проверок разрядности ОС):
1 | RegistryKey localMachine = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); |
В таком случае все срабатывает вполне корректно.
P.S. Напоминаю - в 99% случаев сайт - моя личная шпаргалка.