2009-07-02 4 views

답변

12

64 비트 프로그램에서 32 비트 프로그램에 의해 작성된 값을 명시 적으로 읽어야하는 경우 하드 코딩하는 것이 좋습니다. 단순히 다른 옵션이 없기 때문입니다.

물론 헬퍼 함수로 추상화합니다. 예를

public RegistryKey GetSoftwareRoot() { 
    var path = 8 == IntPtr.Size 
    ? @"Software\Wow6432Node" 
    : @"Software"; 
    return Registry.CurrentUser.OpenSubKey(path); 
} 
+0

충분히 공정하게 - 감사합니다. Jared! – marijne

+5

경고 : MS는이 접근법 ("Wow6432Node"하드 코딩)이 지원되지 않는다고 말합니다. http://msdn.microsoft.com/en-us/library/aa384232(VS.85).aspx – Richard

+6

-1 : Windows 7/Windows Server 2008 R2에서 공유 레지스트리 키를 대신 사용하므로이 동작이 중단됩니다. http : //msdn.microsoft.com/en-us/library/aa384253 (VS.85) .aspx – Powerlord

16

의 올바른 방법은 기본 레지스트리 API를 호출하고 앤더스의 답변을 확장 RegOpenKeyEx/RegCreateKeyEx

+0

이 솔루션은 pinvoking 또는 C++ 코드를 사용할 때만 유효합니다. – Kyle

+0

@Zenox - C#과 같은 언어를 사용하는 경우에도 완벽하게 유효한 솔루션입니다. 물론 사용하는 것은 어리석은 일입니다. –

52

대상 .Net 버전을 v4로 변경할 수 있으면 새로운 OpenBaseKey 기능을 사용할 수 있습니다. 예 :

RegistryKey registryKey; 
if (Environment.Is64BitOperatingSystem == true) 
{ 
    registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); 
} 
else 
{ 
    registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32); 
} 
+1

이 솔루션은 Win7 64 비트 + 유닛 테스트에서 매우 잘 작동합니다. 감사. – Jirapong

+2

이것은 레지스트리를 읽는 방법입니다. WoW6432Node는 Microsoft가 API를 통해 처리하고 향후 변경 될 수 있으므로 직접 읽지 않아야합니다. – Jason

+0

4.x로 변경할 수 없으면 어떻게해야합니까? 위의 방법을 사용 하시겠습니까? –

관련 문제