Ứ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
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);
}
Cách đúng sẽ được gọi api registry bản địa và đi qua các KEY_WOW64_32KEY
cờ để RegOpenKeyEx/RegCreateKeyEx
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
@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ó. –
Mở rộng câu trả lời Anders của, có một good example of wrapping the resulting handle in a .NET RegistryKey object on Shahar Prish's blog - hãy chắc chắn để đọc các ý kiến quá mặc dù.
Lưu ý rằng việc sử dụng không bị biến đổi của the pinvoke.net wrapper of RegOpenKeyEx có nhiều vấn đề.
Đây là một giải pháp tuyệt vời. – adzm
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);
}
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
Đâ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
Nếu bạn không thể thay đổi thành 4.x thì sao? Sử dụng phương pháp trên? –
- 1. Tạo 64 bit khóa registry (không WOW64) từ một ứng dụng 32 bit
- 2. Truy cập đăng ký 64 bit từ ứng dụng 32 bit
- 3. Viết giá trị đăng ký trong hệ thống 64 bit
- 4. Cách chạy ứng dụng .NET 32 bit trong môi trường 64 bit?
- 5. Có sự khác biệt nào giữa ứng dụng .NET 32 bit và ứng dụng .NET 64 bit không?
- 6. Ứng dụng Java 64 bit: Hệ điều hành 64 bit, JRE 64 bit và Ứng dụng 64 bit có yêu cầu không?
- 7. Đăng ký 32 bit COM DLL tới 64 bit Windows 7
- 8. Nhập 32 bit dll trong 64 bit .Net application
- 9. Ứng dụng 32 bit hoặc 64 bit trên hệ điều hành 64 bit?
- 10. Tại sao tôi không thể đọc chính xác giá trị đăng ký 32 bit trong HKCU trên máy 64 bit?
- 11. Làm cách nào để xác định xem ứng dụng .NET có 32 hay 64 bit không?
- 12. Làm cách nào để hiển thị tệp SVG trong ứng dụng .NET 64 bit?
- 13. Delphi XE2: Gỡ lỗi dll 64 bit qua ứng dụng 64 bit
- 14. .net InstallUtil utility - 32 bit vs 64 bit
- 15. Có thể truy cập dll 64 bit từ ứng dụng 32 bit không?
- 16. Tại sao ứng dụng 32 bit của tôi không truy cập vào tổ chức đăng ký 32 bit?
- 17. sử dụng com 32 bit thư viện trên 64 bit ứng dụng
- 18. Đọc đăng ký và khóa Wow6432Node
- 19. Ứng dụng DirectX trên cửa sổ 64 bit
- 20. .Net WinForm System Beep trên hệ điều hành 64 bit
- 21. Chạy ứng dụng AnyCPU dưới dạng 32 bit trên hệ điều hành 64 bit
- 22. Cách đăng ký ứng dụng ClickOnce
- 23. Ứng dụng .NET có thể chạy với văn phòng 32 bit và 64 bit như thế nào?
- 24. Biên soạn 32-bit ứng dụng Qt sử dụng 64-bit gói
- 25. MSTest từ chối chạy 64 bit?
- 26. Cách đăng ký một assembly .NET như COM?
- 27. nguyên tử trong 32/64 bit
- 28. Inno Setup RegKeyExists trên 64 bit
- 29. 64 bit bằng cách phân chia 32 bit
- 30. Thawte tài xế ký cho Windows 64-bit
Đủ công bằng - cảm ơn Jared! – marijne
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
-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