То, что вы делаете, на самом деле опасно.Используемый вами объект RegistryKey может быть собран и завершен сборщиком мусора во время использования IntPtr.Что делает значение дескриптора недействительным, что делает ваш код случайным сбоем.Ну, ладно, случайный сбой не совсем опасен, но он открывает дверь для атаки с повторным использованием ручки, если вы фактически держите ручку в течение длительного периода времени.Режим случайного сбоя должен быть достаточным, чтобы побудить вас что-то с этим сделать.
Сделайте так, чтобы ваше объявление pinvoke выглядело так:
[DllImport("advapi32.dll", CharSet=CharSet.Auto)]
internal static extern int RegOpenKeyEx(SafeRegistryHandle key, string subkey,
int options, int sam, out SafeRegistryHandle result);
Так что вы можете последовательно использовать класс-оболочку safe handle,Отрегулируйте код отражения соответствующим образом.