internal AsAnyMarshaler(IntPtr pvArrayMarshaler) { this.pvArrayMarshaler = pvArrayMarshaler; this.backPropAction = AsAnyMarshaler.BackPropAction.None; this.layoutType = (Type)null; this.cleanupWorkList = (CleanupWorkList)null; }
private unsafe IntPtr ConvertLayoutToNative(object pManagedHome, int dwFlags) { IntPtr num = Marshal.AllocCoTaskMem(Marshal.SizeOfHelper(pManagedHome.GetType(), false)); if (AsAnyMarshaler.IsIn(dwFlags)) { System.StubHelpers.StubHelpers.FmtClassUpdateNativeInternal(pManagedHome, (byte *)num.ToPointer(), ref this.cleanupWorkList); } if (AsAnyMarshaler.IsOut(dwFlags)) { this.backPropAction = AsAnyMarshaler.BackPropAction.Layout; } this.layoutType = pManagedHome.GetType(); return(num); }
private unsafe IntPtr ConvertStringBuilderToNative(StringBuilder pManagedHome, int dwFlags) { IntPtr dest; if (AsAnyMarshaler.IsAnsi(dwFlags)) { System.StubHelpers.StubHelpers.CheckStringLength(pManagedHome.Capacity); int cb = pManagedHome.Capacity * Marshal.SystemMaxDBCSCharSize + 4; dest = Marshal.AllocCoTaskMem(cb); byte *pDest = (byte *)(void *)dest; *(pDest + cb - 3) = (byte)0; *(pDest + cb - 2) = (byte)0; *(pDest + cb - 1) = (byte)0; if (AsAnyMarshaler.IsIn(dwFlags)) { int cbLength; byte[] src = AnsiCharMarshaler.DoAnsiConversion(pManagedHome.ToString(), AsAnyMarshaler.IsBestFit(dwFlags), AsAnyMarshaler.IsThrowOn(dwFlags), out cbLength); Buffer.Memcpy(pDest, 0, src, 0, cbLength); pDest[cbLength] = (byte)0; } if (AsAnyMarshaler.IsOut(dwFlags)) { this.backPropAction = AsAnyMarshaler.BackPropAction.StringBuilderAnsi; } } else { int cb = pManagedHome.Capacity * 2 + 4; dest = Marshal.AllocCoTaskMem(cb); byte *numPtr = (byte *)(void *)dest; *(numPtr + cb - 1) = (byte)0; *(numPtr + cb - 2) = (byte)0; if (AsAnyMarshaler.IsIn(dwFlags)) { int len = pManagedHome.Length * 2; pManagedHome.InternalCopy(dest, len); (numPtr + len)[0] = (byte)0; (numPtr + len)[1] = (byte)0; } if (AsAnyMarshaler.IsOut(dwFlags)) { this.backPropAction = AsAnyMarshaler.BackPropAction.StringBuilderUnicode; } } return(dest); }
private unsafe IntPtr ConvertArrayToNative(object pManagedHome, int dwFlags) { Type elementType = pManagedHome.GetType().GetElementType(); VarEnum varEnum; switch (Type.GetTypeCode(elementType)) { case TypeCode.Object: if (elementType == typeof(IntPtr)) { varEnum = IntPtr.Size == 4 ? VarEnum.VT_I4 : VarEnum.VT_I8; break; } if (elementType == typeof(UIntPtr)) { varEnum = IntPtr.Size == 4 ? VarEnum.VT_UI4 : VarEnum.VT_UI8; break; } goto default; case TypeCode.Boolean: varEnum = (VarEnum)254; break; case TypeCode.Char: varEnum = AsAnyMarshaler.IsAnsi(dwFlags) ? (VarEnum)253 : VarEnum.VT_UI2; break; case TypeCode.SByte: varEnum = VarEnum.VT_I1; break; case TypeCode.Byte: varEnum = VarEnum.VT_UI1; break; case TypeCode.Int16: varEnum = VarEnum.VT_I2; break; case TypeCode.UInt16: varEnum = VarEnum.VT_UI2; break; case TypeCode.Int32: varEnum = VarEnum.VT_I4; break; case TypeCode.UInt32: varEnum = VarEnum.VT_UI4; break; case TypeCode.Int64: varEnum = VarEnum.VT_I8; break; case TypeCode.UInt64: varEnum = VarEnum.VT_UI8; break; case TypeCode.Single: varEnum = VarEnum.VT_R4; break; case TypeCode.Double: varEnum = VarEnum.VT_R8; break; default: throw new ArgumentException(Environment.GetResourceString("Arg_NDirectBadObject")); } int dwFlags1 = (int)varEnum; if (AsAnyMarshaler.IsBestFit(dwFlags)) { dwFlags1 |= 65536; } if (AsAnyMarshaler.IsThrowOn(dwFlags)) { dwFlags1 |= 16777216; } MngdNativeArrayMarshaler.CreateMarshaler(this.pvArrayMarshaler, IntPtr.Zero, dwFlags1); IntPtr num; IntPtr pNativeHome = new IntPtr((void *)&num); MngdNativeArrayMarshaler.ConvertSpaceToNative(this.pvArrayMarshaler, ref pManagedHome, pNativeHome); if (AsAnyMarshaler.IsIn(dwFlags)) { MngdNativeArrayMarshaler.ConvertContentsToNative(this.pvArrayMarshaler, ref pManagedHome, pNativeHome); } if (AsAnyMarshaler.IsOut(dwFlags)) { this.backPropAction = AsAnyMarshaler.BackPropAction.Array; } return(num); }