2011-07-05 18 views
7

Tôi có một ứng dụng (viết bằng C#), chạy trên Windows Server 2008 (64bit). Trong ứng dụng này tôi phải kiểm tra một số khóa registry liên quan đến IIS. Trong số những người khác tôi muốn truy cập phím HKEY_LOCAL_MACHINE \ Software \ Microsoft \ InetStp \ Components \ WMICompatibility" để kiểm tra xem chế độ tương thích IIS 6 được kích hoạt hay không. Đối với điều này tôi sử dụng Registry.GetValue của Microsoft.Win32.Truy cập đăng ký bằng C# và "BUILD x86" trên máy 64bit

Đối với một số lý do giải pháp phải được biên soạn với x86. Hậu quả là, nó không còn có thể truy cập HKEY_LOCAL_MACHINE \ Software \ Microsoft \ InetStp \ Components nhưng nó vẫn còn có thể đọc chính từ HKEY_LOCAL_MACHINE \ Software \ Microsoft \ InetStp. Khi biên dịch nó bằng "AnyCPU" -flag truy cập đăng ký hoạt động tốt.

Vậy lý do của hành vi này là gì? Có giải pháp hay giải pháp nào cho vấn đề này không?

+0

Tôi không nhớ tên khóa cụ thể, nhưng phần mềm x86 trên Win64 nằm trong HKEY_LOCAL_MACHINE \ Software \ Wow64 hoặc tương tự tên khóa phụ – sehe

Trả lời

12

Bạn đang rơi hôi của registry redirection.

Giải pháp tốt nhất là để mở một giao diện 64 bit của registry, như thế này:

using Microsoft.Win32; 
... 
RegistryKey registryKey = 
    RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64). 
    OpenSubKey(@"Software\Microsoft\InetStp\Components"); 
object value = registryKey.GetValue(@"WMICompatibility"); 

Nếu bạn muốn mã của bạn để làm việc trên cả 32 và 64 bit máy sau đó bạn sẽ cần phải mã số chuyển đổi giữa các chế độ xem đăng ký.

Note: Khả năng tiếp cận quan điểm 64 bit từ các quá trình 32 bit được chỉ bổ sung vào thư viện .net trong .net 4. Dường như trước đó bạn cần sử dụng API gốc, ví dụ với P/Invoke.

+0

Anh ấy đã có chế độ xem 32 bit, anh ấy cần chế độ xem 64 bit. Giải pháp của bạn yêu cầu .NET 4. Pinvoke hoặc một exe riêng biệt sẽ được yêu cầu cho các phiên bản trước đó. –

+0

@hans vâng tôi đã hiểu sai về cảm ơn. Tôi đã chỉnh sửa nó. –

+0

Cảm ơn bạn, đó là giải pháp cho vấn đề! – Elmex

3

Windows x64 có một nút riêng biệt cho các chương trình x86 (không phải là ý tưởng sáng)

Tất cả các khóa registry sẽ chịu HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node

Thông tin thêm về vấn đề này:
How to view the system registry by using 64-bit versions of Windows

Chương trình vẫn "nghĩ" nó đang ghi vào cùng một đường dẫn.

Tôi khuyên bạn nên sửa chương trình thiết lập (công văn) của mình để viết cài đặt ban đầu vào đúng vị trí.

Sửa, Một số "thông tin" từ MSDN:

Registry Keys Affected by WOW64

+0

Thực ra giải pháp nút riêng biệt với chuyển hướng là một ý tưởng tuyệt vời. Lựa chọn tốt hơn của bạn là gì? –

+0

Giải pháp thay thế tốt hơn là không có hệ thống này. Nó không cần thiết và nó không hoạt động đúng cách. Đăng ký chỉ lưu trữ các giá trị int và chuỗi thô (tất cả 32 bit) vì vậy tại sao bất kỳ chuyển hướng nào cần phải xảy ra đều nằm ngoài tôi. Tại sao họ không thể để các giá trị ở nơi bình thường? – NickG

+0

"Để hỗ trợ đồng tồn tại của các trạng thái đăng ký và chương trình COM 32 bit và 64 bit ..." https://support.microsoft.com/en-us/help/305097/how-to-view-the -system-registry-by-using-64-bit-versions-of-windows –

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