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

SAFEARRAY

struct SAFEARRAY
Represents a safe array.
using System; using System.CodeDom.Compiler; using System.Runtime.CompilerServices; using Windows.Win32.System.Variant; namespace Windows.Win32.System.Com { [GeneratedCode("Microsoft.Windows.CsWin32", "0.3.151+58e949951d.RR")] internal struct SAFEARRAY { internal ushort cDims; internal ADVANCED_FEATURE_FLAGS fFeatures; internal uint cbElements; internal uint cLocks; internal unsafe void* pvData; internal VariableLengthInlineArray<SAFEARRAYBOUND> rgsabound; public unsafe VARENUM VarType { get { ADVANCED_FEATURE_FLAGS aDVANCED_FEATURE_FLAGS = fFeatures & (ADVANCED_FEATURE_FLAGS.FADF_BSTR | ADVANCED_FEATURE_FLAGS.FADF_UNKNOWN | ADVANCED_FEATURE_FLAGS.FADF_DISPATCH | ADVANCED_FEATURE_FLAGS.FADF_VARIANT); if (aDVANCED_FEATURE_FLAGS == ADVANCED_FEATURE_FLAGS.FADF_BSTR && cbElements == sizeof(char*)) return VARENUM.VT_BSTR; if (aDVANCED_FEATURE_FLAGS == ADVANCED_FEATURE_FLAGS.FADF_UNKNOWN && cbElements == sizeof(IntPtr)) return VARENUM.VT_UNKNOWN; if (aDVANCED_FEATURE_FLAGS == ADVANCED_FEATURE_FLAGS.FADF_DISPATCH && cbElements == sizeof(IntPtr)) return VARENUM.VT_DISPATCH; if (aDVANCED_FEATURE_FLAGS != ADVANCED_FEATURE_FLAGS.FADF_VARIANT || cbElements != sizeof(VARIANT)) { VARENUM result = VARENUM.VT_EMPTY; fixed (SAFEARRAY* psa = &this) { PInvokeCore.SafeArrayGetVartype(psa, &result).ThrowOnFailure((IntPtr)0); return result; } } return VARENUM.VT_VARIANT; } } public unsafe SAFEARRAYBOUND GetBounds(int dimension = 0) { fixed (VariableLengthInlineArray<SAFEARRAYBOUND>* ptr = &rgsabound) { void* pointer = ptr; return new ReadOnlySpan<SAFEARRAYBOUND>(pointer, cDims)[dimension]; } } public unsafe static SAFEARRAY* CreateEmpty(VARENUM arrayType) { SAFEARRAYBOUND sAFEARRAYBOUND = default(SAFEARRAYBOUND); sAFEARRAYBOUND.cElements = 0; sAFEARRAYBOUND.lLbound = 0; SAFEARRAYBOUND sAFEARRAYBOUND2 = sAFEARRAYBOUND; return PInvokeCore.SafeArrayCreate(arrayType, 1, &sAFEARRAYBOUND2); } [return: Nullable(1)] public unsafe T GetValue<[Nullable(2)] T>(Span<int> indices) { int num = 0; int num3 = indices[num++]; uint num4 = 1; fixed (VariableLengthInlineArray<SAFEARRAYBOUND>* ptr = &rgsabound) { void* pointer = ptr; ReadOnlySpan<SAFEARRAYBOUND> readOnlySpan = new ReadOnlySpan<SAFEARRAYBOUND>(pointer, (int)cDims); int num5 = cDims - 1; uint num6 = 0; for (ushort num7 = 1; num7 < cDims; num7 = (ushort)(num7 + 1)) { num4 *= readOnlySpan[num5--].cElements; int num10 = indices[num++] - readOnlySpan[num5].lLbound; num6 = (uint)((int)num6 + num10 * (int)num4); } num6 = (uint)((int)num6 + (num3 - readOnlySpan[cDims - 1].lLbound)); return Unsafe.AsRef<T>(Unsafe.Add<T>(pvData, (int)num6)); } } internal unsafe static int SizeOf(int count) { int num = sizeof(SAFEARRAY); if (count > 1) num += checked((count - 1) * sizeof(SAFEARRAYBOUND)); else if (count < 0) { throw new ArgumentOutOfRangeException(); } return num; } } }