2009-07-02 30 views
27

Ứng dụng .NET của tôi (bất kỳ CPU nào) cần đọc giá trị sổ đăng ký được tạo bởi chương trình 32 bit. Trên Windows 64 bit, điều này đi theo khóa Wow6432Node trong sổ đăng ký. Tôi đã đọc rằng bạn không nên khó mã hóa cho Wow6432Node, vậy cách nào đúng để truy cập nó bằng .NET?Cách mở khóa đăng ký WOW64 từ ứng dụng .NET 64 bit

Trả lời

12

Trong trường hợp bạn rõ ràng cần phải đọc một giá trị được viết bởi chương trình 32 bit trong chương trình 64 bit, bạn có thể mã hóa nó một cách rõ ràng. Đơn giản vì không có lựa chọn nào khác.

Tôi dĩ nhiên sẽ trừu tượng hóa nó thành chức năng trợ giúp. Ví dụ

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

Đủ công bằng - cảm ơn Jared! – marijne

+5

Cảnh báo: MS nói rằng cách tiếp cận này (hardcoding "Wow6432Node") không được hỗ trợ. Xem http://msdn.microsoft.com/en-us/library/aa384232(VS.85).aspx – Richard

+6

-1: Hành vi này bị hỏng trong Windows 7/Windows Server 2008 R2, vì họ sử dụng Khóa đăng ký được chia sẻ thay thế: http : //msdn.microsoft.com/en-us/library/aa384253 (VS.85) .aspx – Powerlord

16

Cách đúng sẽ được gọi api registry bản địa và đi qua các KEY_WOW64_32KEY cờ để RegOpenKeyEx/RegCreateKeyEx

+0

Cần lưu ý rằng giải pháp này chỉ hợp lệ khi pinvoking hoặc sử dụng mã C++. – Kyle

+0

@Zenox - Đó là giải pháp hoàn toàn hợp lệ ngay cả khi sử dụng một ngôn ngữ như C# tất nhiên bạn sẽ ngớ ngẩn để sử dụng nó. –

52

Nếu bạn có thể thay đổi mục tiêu .Net phiên bản thành v4, thì bạn có thể sử dụng hàm OpenBaseKey mới, ví dụ:

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

Giải pháp này hoạt động rất tốt với thử nghiệm đơn vị Win7 64bit + của tôi. Cảm ơn. – Jirapong

+2

Đây là cách để đọc sổ đăng ký. WoW6432Node không nên đọc trực tiếp khi Microsoft xử lý thông qua API của họ và đã nói rằng nó có thể thay đổi trong tương lai. – Jason

+0

Nếu bạn không thể thay đổi thành 4.x thì sao? Sử dụng phương pháp trên? –

Các vấn đề liên quan