无法在C#中使用Derefrence IntPtr

Sah*_*wal 0 .net c# pointers intptr

我写了一个在COM中实现IGroupPolicyObject接口的类.其中一个方法现在返回C#中的IntPtr对象:

IntPtr ghKey = objectGPolicy.GetRegistryKey(GpoSectionMachine);
Run Code Online (Sandbox Code Playgroud)

我想在使用属于Microsot.Win32命名空间的RegistryKey对象时derefrence该指针.

这不起作用:

(RegistryKey)ghKey = rootKey.CreateSubKey(policyPath);
Run Code Online (Sandbox Code Playgroud)

我找不到如何降低IntPtr.有人可以帮忙吗?

谢谢

Mic*_*eld 6

IGroupPolicyObject.GetRegistryKey不返回.NET RegistryKey对象,它返回Win32注册表项句柄(an HKEY).使用IntPtr包含本机HKEY 的值可以执行两项有用的操作.首先,您可以将其传递给其他Win32 注册表访问功能.如果您以这种方式使用它,您还需要RegCloseKey在完成后通过调用手动关闭它,否则它将泄漏句柄.

正如@HansPassant在他的评论中指出的那样,你的第二个(可能更好)选项是把它变成a SafeRegistryHandle并用它来获取一个RegistryKey对象:

var hkey = gpo.GetRegistryKey(GpoSectionMachine);
var safeHandle = new SafeRegistryHandle(hkey, true);
var reg = RegistryKey.FromHandle(safeHandle);
Run Code Online (Sandbox Code Playgroud)

如果你编写了一个托管实现,IGroupPolicyObjectRegistryKey从这个函数返回一个实际的对象,那么:

  1. 你做错了,你的实现不能移植到任何其他消费者IGroupPolicyObject,和
  2. 您必须手动整理你的RegistryKey对象变成一个IntPtr在您的实现,所以只是做相反把它找回来了.(但实际上 - 不要这样做,你通过返回错误的类型来打破COM合同.)

应该编写此方法的实现来返回a SafeRegistryHandle(我相信,封送程序将自动转换SafeHandle为非托管句柄).RegistryKey.Handle是其中之一,因此您可以使用C#类直到您需要从实现中返回一些内容.