Разница в работе с реестром через 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% случаев сайт - моя личная шпаргалка.

Размещено в .NET, Код LISP · Метки: , , ,



Поделитесь своим мнением


Я не робот.