這是我第一次使用SafeHandle
。爲什麼SafeHandle.DangerousGetHandle()「危險」?
我需要調用這個需要UIntPtr的P/Invoke方法。
[DllImport("advapi32.dll", CharSet = CharSet.Auto)] public static extern int RegOpenKeyEx( UIntPtr hKey, string subKey, int ulOptions, int samDesired, out UIntPtr hkResult);
這UIntPtr將從.NET的的RegistryKey類派生。我將使用上述方法來RegistryKey類轉換爲一個IntPtr這樣我就可以用上面的P/Invoke:
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;
}
}
問題:
- 有沒有寫這個不使用更好的方法「不安全」的手柄?
- 爲什麼不安全的手柄是危險的?
我忘了提及我的代碼的目的是模仿NETFX4的64位註冊表支持。我們只使用NETFX 3.5,因此沒有SafeRegistryHandle可用。 – Ian
只需使SafeHandleZeroOrMinusOneIsInvalid成爲SafeRegistryHandle的基類即可。或者如果你討厭輸入名字(誰沒有),那麼只是簡單的SafeHandle。 –