CreateObjectFlags.Unwrap によってターゲット インスタンス上でのみ折り返しが解除される

以前は、ComWrappers インスタンス上で CreateObjectFlags.Unwrap フラグを指定して GetOrCreateObjectForComInstance(IntPtr, CreateObjectFlags) を呼び出すと、ComWrappers の "すべて" のインスタンスからのマネージド オブジェクト ラッパーのラップが解除されていました。 このたび、そのフラグが指定されていると、GetOrCreateObjectFromComInstance が呼び出された ComWrappers インスタンスからのラッパーのみの折り返しが解除されるようになりました。

ComWrappers のインスタンスを "超えて" 到達した唯一の API が Unwrap フラグであったため、その動作は直感的ではありませんでした。 さらに、ComWrappers の任意のインスタンスから COM オブジェクトの折り返しを解除するのに、新しい ComWrappers.TryGetObject(IntPtr, Object) API を使用できます。

以前の動作

GetOrCreateObjectForComInstance(IntPtr, CreateObjectFlags)CreateObjectFlags.Unwrap フラグを指定して ComWrappers インスタンスで呼び出すと、ComWrappers のすべてのインスタンスからのマネージド オブジェクトのラッパーの折り返しが解除されます。

新しい動作

GetOrCreateObjectForComInstance(IntPtr, CreateObjectFlags)CreateObjectFlags.Unwrap フラグを指定して ComWrappers インスタンスで呼び出すと、GetOrCreateObjectForComInstance が呼び出された ComWrappers のインスタンスからのマネージド オブジェクトのラッパーのみの折り返しが解除されます。 別の ComWrappers インスタンスからのラッパーが指定された場合は、ComWrappers インスタンスで新しいラッパーが作成されます。

導入されたバージョン

.NET 8 Preview 5

破壊的変更の種類

この変更は、動作変更です。

変更理由

以前の動作は直感的ではありませんでした。 また、開発者がカスタマイズした独自の ComWrappers インスタンスを使用し、自分のコードに対して COM 相互運用がどのように機能するかを定義できる、カプセル化エクスペリエンスの妨げにもなっていました。

以前の動作を維持する必要がある場合は、ComWrappers.TryGetObject(IntPtr, Object) を呼び出してから GetOrCreateObjectForComInstance(IntPtr, CreateObjectFlags) を呼び出してください。

影響を受ける API