<PackageReference Include="System.Drawing.Common" Version="10.0.0-preview.7.25380.108" />

ComInterfaceTable

using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Windows.Win32.Foundation; namespace Windows.Win32.System.Com { [NullableContext(1)] [Nullable(0)] internal readonly struct ComInterfaceTable { [Nullable(0)] [field: Nullable(0)] public unsafe ComWrappers.ComInterfaceEntry* Entries { [NullableContext(0)] get; [NullableContext(0)] set; } public int Count { get; set; } public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface>() where TComInterface : struct, IComIID, IVTable { Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface>(1); span[0] = GetEntry<TComInterface>(); ComInterfaceTable result = default(ComInterfaceTable); result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]); result.Count = span.Length; return result; } public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable { Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(2); span[0] = GetEntry<TComInterface1>(); span[1] = GetEntry<TComInterface2>(); ComInterfaceTable result = default(ComInterfaceTable); result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]); result.Count = span.Length; return result; } public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2, [IsUnmanaged] [Nullable(0)] TComInterface3>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable where TComInterface3 : struct, IComIID, IVTable { Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(3); span[0] = GetEntry<TComInterface1>(); span[1] = GetEntry<TComInterface2>(); span[2] = GetEntry<TComInterface3>(); ComInterfaceTable result = default(ComInterfaceTable); result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]); result.Count = span.Length; return result; } public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2, [IsUnmanaged] [Nullable(0)] TComInterface3, [IsUnmanaged] [Nullable(0)] TComInterface4>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable where TComInterface3 : struct, IComIID, IVTable where TComInterface4 : struct, IComIID, IVTable { Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(4); span[0] = GetEntry<TComInterface1>(); span[1] = GetEntry<TComInterface2>(); span[2] = GetEntry<TComInterface3>(); span[3] = GetEntry<TComInterface4>(); ComInterfaceTable result = default(ComInterfaceTable); result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]); result.Count = span.Length; return result; } public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2, [IsUnmanaged] [Nullable(0)] TComInterface3, [IsUnmanaged] [Nullable(0)] TComInterface4, [IsUnmanaged] [Nullable(0)] TComInterface5>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable where TComInterface3 : struct, IComIID, IVTable where TComInterface4 : struct, IComIID, IVTable where TComInterface5 : struct, IComIID, IVTable { Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(5); span[0] = GetEntry<TComInterface1>(); span[1] = GetEntry<TComInterface2>(); span[2] = GetEntry<TComInterface3>(); span[3] = GetEntry<TComInterface4>(); span[4] = GetEntry<TComInterface5>(); ComInterfaceTable result = default(ComInterfaceTable); result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]); result.Count = span.Length; return result; } public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2, [IsUnmanaged] [Nullable(0)] TComInterface3, [IsUnmanaged] [Nullable(0)] TComInterface4, [IsUnmanaged] [Nullable(0)] TComInterface5, [IsUnmanaged] [Nullable(0)] TComInterface6>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable where TComInterface3 : struct, IComIID, IVTable where TComInterface4 : struct, IComIID, IVTable where TComInterface5 : struct, IComIID, IVTable where TComInterface6 : struct, IComIID, IVTable { Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(6); span[0] = GetEntry<TComInterface1>(); span[1] = GetEntry<TComInterface2>(); span[2] = GetEntry<TComInterface3>(); span[3] = GetEntry<TComInterface4>(); span[4] = GetEntry<TComInterface5>(); span[5] = GetEntry<TComInterface6>(); ComInterfaceTable result = default(ComInterfaceTable); result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]); result.Count = span.Length; return result; } public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2, [IsUnmanaged] [Nullable(0)] TComInterface3, [IsUnmanaged] [Nullable(0)] TComInterface4, [IsUnmanaged] [Nullable(0)] TComInterface5, [IsUnmanaged] [Nullable(0)] TComInterface6, [IsUnmanaged] [Nullable(0)] TComInterface7, [IsUnmanaged] [Nullable(0)] TComInterface8, [IsUnmanaged] [Nullable(0)] TComInterface9, [IsUnmanaged] [Nullable(0)] TComInterface10>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable where TComInterface3 : struct, IComIID, IVTable where TComInterface4 : struct, IComIID, IVTable where TComInterface5 : struct, IComIID, IVTable where TComInterface6 : struct, IComIID, IVTable where TComInterface7 : struct, IComIID, IVTable where TComInterface8 : struct, IComIID, IVTable where TComInterface9 : struct, IComIID, IVTable where TComInterface10 : struct, IComIID, IVTable { Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(10); span[0] = GetEntry<TComInterface1>(); span[1] = GetEntry<TComInterface2>(); span[2] = GetEntry<TComInterface3>(); span[3] = GetEntry<TComInterface4>(); span[4] = GetEntry<TComInterface5>(); span[5] = GetEntry<TComInterface6>(); span[6] = GetEntry<TComInterface7>(); span[7] = GetEntry<TComInterface8>(); span[8] = GetEntry<TComInterface9>(); span[9] = GetEntry<TComInterface10>(); ComInterfaceTable result = default(ComInterfaceTable); result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]); result.Count = span.Length; return result; } public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2, [IsUnmanaged] [Nullable(0)] TComInterface3, [IsUnmanaged] [Nullable(0)] TComInterface4, [IsUnmanaged] [Nullable(0)] TComInterface5, [IsUnmanaged] [Nullable(0)] TComInterface6, [IsUnmanaged] [Nullable(0)] TComInterface7, [IsUnmanaged] [Nullable(0)] TComInterface8, [IsUnmanaged] [Nullable(0)] TComInterface9, [IsUnmanaged] [Nullable(0)] TComInterface10, [IsUnmanaged] [Nullable(0)] TComInterface11, [IsUnmanaged] [Nullable(0)] TComInterface12, [IsUnmanaged] [Nullable(0)] TComInterface13, [IsUnmanaged] [Nullable(0)] TComInterface14, [IsUnmanaged] [Nullable(0)] TComInterface15, [IsUnmanaged] [Nullable(0)] TComInterface16, [IsUnmanaged] [Nullable(0)] TComInterface17, [IsUnmanaged] [Nullable(0)] TComInterface18, [IsUnmanaged] [Nullable(0)] TComInterface19, [IsUnmanaged] [Nullable(0)] TComInterface20, [IsUnmanaged] [Nullable(0)] TComInterface21, [IsUnmanaged] [Nullable(0)] TComInterface22, [IsUnmanaged] [Nullable(0)] TComInterface23, [IsUnmanaged] [Nullable(0)] TComInterface24, [IsUnmanaged] [Nullable(0)] TComInterface25, [IsUnmanaged] [Nullable(0)] TComInterface26, [IsUnmanaged] [Nullable(0)] TComInterface27>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable where TComInterface3 : struct, IComIID, IVTable where TComInterface4 : struct, IComIID, IVTable where TComInterface5 : struct, IComIID, IVTable where TComInterface6 : struct, IComIID, IVTable where TComInterface7 : struct, IComIID, IVTable where TComInterface8 : struct, IComIID, IVTable where TComInterface9 : struct, IComIID, IVTable where TComInterface10 : struct, IComIID, IVTable where TComInterface11 : struct, IComIID, IVTable where TComInterface12 : struct, IComIID, IVTable where TComInterface13 : struct, IComIID, IVTable where TComInterface14 : struct, IComIID, IVTable where TComInterface15 : struct, IComIID, IVTable where TComInterface16 : struct, IComIID, IVTable where TComInterface17 : struct, IComIID, IVTable where TComInterface18 : struct, IComIID, IVTable where TComInterface19 : struct, IComIID, IVTable where TComInterface20 : struct, IComIID, IVTable where TComInterface21 : struct, IComIID, IVTable where TComInterface22 : struct, IComIID, IVTable where TComInterface23 : struct, IComIID, IVTable where TComInterface24 : struct, IComIID, IVTable where TComInterface25 : struct, IComIID, IVTable where TComInterface26 : struct, IComIID, IVTable where TComInterface27 : struct, IComIID, IVTable { Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(27); span[0] = GetEntry<TComInterface1>(); span[1] = GetEntry<TComInterface2>(); span[2] = GetEntry<TComInterface3>(); span[3] = GetEntry<TComInterface4>(); span[4] = GetEntry<TComInterface5>(); span[5] = GetEntry<TComInterface6>(); span[6] = GetEntry<TComInterface7>(); span[7] = GetEntry<TComInterface8>(); span[8] = GetEntry<TComInterface9>(); span[9] = GetEntry<TComInterface10>(); span[10] = GetEntry<TComInterface11>(); span[11] = GetEntry<TComInterface12>(); span[12] = GetEntry<TComInterface13>(); span[13] = GetEntry<TComInterface14>(); span[14] = GetEntry<TComInterface15>(); span[15] = GetEntry<TComInterface16>(); span[16] = GetEntry<TComInterface17>(); span[17] = GetEntry<TComInterface18>(); span[18] = GetEntry<TComInterface19>(); span[19] = GetEntry<TComInterface20>(); span[20] = GetEntry<TComInterface21>(); span[21] = GetEntry<TComInterface22>(); span[22] = GetEntry<TComInterface23>(); span[23] = GetEntry<TComInterface24>(); span[24] = GetEntry<TComInterface25>(); span[25] = GetEntry<TComInterface26>(); span[26] = GetEntry<TComInterface27>(); ComInterfaceTable result = default(ComInterfaceTable); result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]); result.Count = span.Length; return result; } [MethodImpl(MethodImplOptions.AggressiveInlining)] [NullableContext(0)] private unsafe static Span<ComWrappers.ComInterfaceEntry> AllocateEntries<[Nullable(2)] T>(int count) { Span<ComWrappers.ComInterfaceEntry> result = new Span<ComWrappers.ComInterfaceEntry>((void*)(long)RuntimeHelpers.AllocateTypeAssociatedMemory(typeof(T), sizeof(ComWrappers.ComInterfaceEntry) * (count + 1)), count + 1); result[result.Length - 1] = GetEntry<IComCallableWrapper>(); return result; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private unsafe static ComWrappers.ComInterfaceEntry GetEntry<[IsUnmanaged] [Nullable(0)] TComInterface>() where TComInterface : struct, IComIID, IVTable { ComWrappers.ComInterfaceEntry result = default(ComWrappers.ComInterfaceEntry); IUnknown.Vtbl* vTable = ((IVTable)result).VTable; ((ComWrappers.ComInterfaceEntry*)(long)(IntPtr)(void*))->Vtable = (IntPtr)vTable; result.IID = *IID.Get<TComInterface>(); return result; } } }