/// <summary> /// Set a safe array value /// </summary> /// <param name="array">The new value to set.</param> internal void SetSafeArray(Array array) { if (array is null) { throw new ArgumentNullException("array"); } const ushort vtUnknown = 13; var psa = PropVariantNativeMethods.SafeArrayCreateVector(vtUnknown, 0, (uint)array.Length); var pvData = PropVariantNativeMethods.SafeArrayAccessData(psa); try { // to remember to release lock on data for (int i = 0, l = array.Length; i < l; i++) { var obj = array.GetValue(i); var punk = obj is object?Marshal.GetIUnknownForObject(obj) : IntPtr.Zero; Marshal.WriteIntPtr(pvData, i * IntPtr.Size, punk); } } finally { PropVariantNativeMethods.SafeArrayUnaccessData(psa); } _valueType = (ushort)VarEnum.VT_ARRAY | (ushort)VarEnum.VT_UNKNOWN; _ptr = psa; }