1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
6 using System.Collections;
7 using System.Collections.Generic;
8 using System.Runtime.InteropServices.ComTypes;
11 namespace System.Runtime.InteropServices.CustomMarshalers
13 internal class EnumeratorToEnumVariantMarshaler : ICustomMarshaler
15 private static readonly EnumeratorToEnumVariantMarshaler s_enumeratorToEnumVariantMarshaler = new EnumeratorToEnumVariantMarshaler();
17 public static ICustomMarshaler GetInstance(string cookie) => s_enumeratorToEnumVariantMarshaler;
19 private EnumeratorToEnumVariantMarshaler()
23 public void CleanUpManagedData(object ManagedObj)
27 public void CleanUpNativeData(IntPtr pNativeData)
29 Marshal.Release(pNativeData);
32 public int GetNativeDataSize()
34 // Return -1 to indicate the managed type this marshaler handles is not a value type.
38 public IntPtr MarshalManagedToNative(object ManagedObj)
40 if (ManagedObj == null)
42 throw new ArgumentNullException(nameof(ManagedObj));
45 if (ManagedObj is EnumeratorViewOfEnumVariant view)
47 return Marshal.GetComInterfaceForObject<object, IEnumVARIANT>(view.GetUnderlyingObject());
50 EnumVariantViewOfEnumerator nativeView = new EnumVariantViewOfEnumerator((IEnumerator)ManagedObj);
52 return Marshal.GetComInterfaceForObject<EnumVariantViewOfEnumerator, IEnumVARIANT>(nativeView);
55 public object MarshalNativeToManaged(IntPtr pNativeData)
57 if (pNativeData == IntPtr.Zero)
59 throw new ArgumentNullException(nameof(pNativeData));
62 object comObject = Marshal.GetObjectForIUnknown(pNativeData);
64 if (!comObject.GetType().IsCOMObject)
66 if (comObject is EnumVariantViewOfEnumerator enumVariantView)
68 return enumVariantView.Enumerator;
71 return comObject as IEnumerator;
74 return ComDataHelpers.GetOrCreateManagedViewFromComData<IEnumVARIANT, EnumeratorViewOfEnumVariant>(comObject, var => new EnumeratorViewOfEnumVariant(var));