/// <summary> /// Set a safe array value /// </summary> /// <param name="array">The new value to set.</param> internal void SetSafeArray(Array array) { if (array == null) { throw new ArgumentNullException(nameof(array)); } const ushort vtUnknown = 13; IntPtr psa = PropVariantNativeMethods.SafeArrayCreateVector(vtUnknown, 0, (uint)array.Length); IntPtr pvData = PropVariantNativeMethods.SafeArrayAccessData(psa); try // to remember to release lock on data { for (int i = 0; i < array.Length; ++i) { object obj = array.GetValue(i); IntPtr punk = (obj != null) ? 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; }