2010-05-16 12 views
11

Pracuję na 64-bitowym systemie Windows, a moja aplikacja działa z podwyższonymi uprawnieniami. Mam problem z następującym bardzo prosty kawałek kodu:C# odczytuje błędne dane rejestru w 64-bitowym systemie operacyjnym

myKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); 
    if (myKey != null) 
    { 
    string[] HKLMvaluenames = myKey.GetValueNames(); 
    } 

ale z jakiegoś powodu HKLMvaluenames tablicy jest wypełniane wartościami od następującego klucza:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run 

Czy istnieje sposób wokół tego problemu?

+1

Czy kod jest uruchamiany w trybie 32-bitowym ze względu na zależność zewnętrzną/niezarządzaną lub coś podobnego? –

+0

Czy Twoja aplikacja została skompilowana jako aplikacja 32-bitowa? Wow64 to 32-bitowa warstwa kompatybilności dla 64-bitowych systemów operacyjnych Windows. – Oded

+0

@Nick: Nie muszę uruchamiać się w wersji 32-bitowej, ale chcę, aby moja aplikacja działała również na 32-bitowych systemach operacyjnych (jest to bardzo ważne). @Oded: Tak, wiem, co to jest wow64. Moja aplikacja jest kompilowana przy użyciu VX2010 Express, więc myślę, że nie mogę nawet wybrać sposobu jej kompilacji. Czy mogę to gdzieś sprawdzić? – baal80

Odpowiedz

17

Jest to zgodne z projektem, programy 32-bitowe mają inny widok rejestru niż programy 64-bitowe. Są przekierowywane do klucza HKLM \ Software \ Wow6432Node, gdy próbują odczytać wartość z gałęzi HKLM \ Software. Jeśli zbudujesz swój program C# z Project + Properties, zakładką Build, platformą Target = Dowolnym CPU, to będzie działał jako program 64-bitowy i nie zostanie przekierowany.

Programy 32-bitowe mogą anulować przekierowanie, ale nie jest to łatwe z klasą .NET RegistryKey. P/Wywoływanie RegOpenKeyEx za pomocą klucza KEY_WOW64_64KEY jest wymagane. Więcej informacji można znaleźć w tej wersji Windows SDK article.


EDYCJA: jest teraz dostępna również dla .NET z określoną metodą .NET 4 RegistryKey.OpenBaseKey(). Przełóż RegistryView.Registry64, aby wyświetlić rejestr w taki sposób, jak w przypadku procesu 64-bitowego.

5

a ja biegałem w tym samym numerze lub samym ognisku przyczyny tego problemu, znalazłem rozwiązanie.

Użyj tego:

//To set the Base to the right path set RegistryView to DEFAULT, Registry64 or Registry32 regarding the path you need. If you want to go over the x64 root: 

RegistryKey rk = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64) 
     .OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); 

Teraz będziemy zachowywać się tak, jak chcesz.

Miłej zabawy!

Powiązane problemy