Đây là lần đầu tiên tôi sử dụng SafeHandle
.Tại sao SafeHandle.DangerousGetHandle() "Nguy hiểm"?
Tôi cần gọi phương thức P/Invoke này cần có UIntPtr.
[DllImport("advapi32.dll", CharSet = CharSet.Auto)] public static extern int RegOpenKeyEx( UIntPtr hKey, string subKey, int ulOptions, int samDesired, out UIntPtr hkResult);
UIntPtr này sẽ được bắt nguồn từ lớp RegistryKey NET của. Tôi sẽ sử dụng phương pháp trên để chuyển đổi các lớp RegistryKey để một IntPtr vì vậy tôi có thể sử dụng P trên/Gọi:
private static IntPtr GetRegistryKeyHandle(RegistryKey rKey)
{
//Get the type of the RegistryKey
Type registryKeyType = typeof(RegistryKey);
//Get the FieldInfo of the 'hkey' member of RegistryKey
System.Reflection.FieldInfo fieldInfo =
registryKeyType.GetField("hkey", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
//Get the handle held by hkey
if (fieldInfo != null)
{
SafeHandle handle = (SafeHandle)fieldInfo.GetValue(rKey);
//Get the unsafe handle
IntPtr dangerousHandle = handle.DangerousGetHandle();
return dangerousHandle;
}
}
Câu hỏi:
- Có cách nào tốt hơn để viết những dòng này mà không sử dụng xử lý "không an toàn"?
- Tại sao các tay cầm không an toàn lại nguy hiểm?
Tôi quên đề cập rằng mục đích của mã của tôi là bắt chước hỗ trợ đăng ký 64-bit của NETFX4. Chúng tôi chỉ sử dụng NETFX 3.5 nên không có SafeRegistryHandle. – Ian
Chỉ cần làm cho nó SafeHandleZeroOrMinusOneIsInvalid, lớp cơ sở của SafeRegistryHandle. Hoặc chỉ đơn giản là SafeHandle nếu bạn ghét gõ tên (người không). –