IGroupPolicyObject.GetRegistryKeyは .NETRegistryKeyオブジェクトを返さず、Win32 レジストリ キー ハンドル ( HKEY) を返します。IntPtrネイティブ HKEY を含む値を使用して実行できる便利なことが 2 つあります。まず、他の Win32レジストリ アクセス関数に渡すことができます。このように使用する場合は、終了時に呼び出して手動で閉じる必要もありRegCloseKeyます。そうしないと、ハンドルがリークします。
@HansPassant が彼のコメントで有益に指摘しているように、2 番目の (そしておそらくより良い) オプションは、それを に変換し、SafeRegistryHandleそれを使用してRegistryKeyオブジェクトを取得することです。
var hkey = gpo.GetRegistryKey(GpoSectionMachine);
var safeHandle = new SafeRegistryHandle(hkey, true);
var reg = RegistryKey.FromHandle(safeHandle);
のマネージ実装を作成し、この関数からIGroupPolicyObject実際のRegistryKeyオブジェクトを返す場合:
IGroupPolicyObjectあなたはそれを間違っており、あなたの実装は の他の消費者に移植できません。
RegistryKeyオブジェクトを実装のに手動でマーシャリングしている必要がIntPtrあるため、逆の操作を行って元に戻します。(しかし、実際には、そうしないでください。間違った型を返すことで、COM 契約を破っています。)
代わりに、このメソッドの実装は、 を返すように記述する必要がありますSafeRegistryHandle(マーシャラーは、 とSafeHandleアンマネージ ハンドルの間で自動的に変換すると思います)。RegistryKey.Handleはこれらの 1 つであるため、実装から何かを返す必要があるまで C# クラスを使用できます。