.NET 응용 프로그램 (모든 CPU)은 32 비트 프로그램에서 만든 레지스트리 값을 읽어야합니다. 64 비트 Windows에서는 레지스트리의 Wow6432Node 키를 사용합니다. Wow6432Node를 하드 코딩해서는 안된다는 것을 읽었으므로 .NET을 사용하여 액세스하는 올바른 방법은 무엇입니까?64 비트 .NET 응용 프로그램에서 WOW64 레지스트리 키를 여는 방법
답변
64 비트 프로그램에서 32 비트 프로그램에 의해 작성된 값을 명시 적으로 읽어야하는 경우 하드 코딩하는 것이 좋습니다. 단순히 다른 옵션이 없기 때문입니다.
물론 헬퍼 함수로 추상화합니다. 예를
public RegistryKey GetSoftwareRoot() {
var path = 8 == IntPtr.Size
? @"Software\Wow6432Node"
: @"Software";
return Registry.CurrentUser.OpenSubKey(path);
}
의 올바른 방법은 기본 레지스트리 API를 호출하고 앤더스의 답변을 확장 RegOpenKeyEx/RegCreateKeyEx
이 솔루션은 pinvoking 또는 C++ 코드를 사용할 때만 유효합니다. – Kyle
@Zenox - C#과 같은 언어를 사용하는 경우에도 완벽하게 유효한 솔루션입니다. 물론 사용하는 것은 어리석은 일입니다. –
에 KEY_WOW64_32KEY
플래그를 전달하는 것입니다하는 good example of wrapping the resulting handle in a .NET RegistryKey object on Shahar Prish's blog있다 -도 불구하고 코멘트를 읽으십시오.
약화되지 않은 the pinvoke.net wrapper of RegOpenKeyEx의 사용에는 문제가 있습니다.
이것은 훌륭한 솔루션입니다. – adzm
대상 .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);
}
충분히 공정하게 - 감사합니다. Jared! – marijne
경고 : MS는이 접근법 ("Wow6432Node"하드 코딩)이 지원되지 않는다고 말합니다. http://msdn.microsoft.com/en-us/library/aa384232(VS.85).aspx – Richard
-1 : Windows 7/Windows Server 2008 R2에서 공유 레지스트리 키를 대신 사용하므로이 동작이 중단됩니다. http : //msdn.microsoft.com/en-us/library/aa384253 (VS.85) .aspx – Powerlord