internal IntPtr ConvertToNative(object pManagedHome, int dwFlags) { if (pManagedHome == null) { return(IntPtr.Zero); } if (pManagedHome is ArrayWithOffset) { throw new ArgumentException(Environment.GetResourceString("Arg_MarshalAsAnyRestriction")); } if (pManagedHome.GetType().IsArray) { return(this.ConvertArrayToNative(pManagedHome, dwFlags)); } string pManagedHome1; if ((pManagedHome1 = pManagedHome as string) != null) { return(AsAnyMarshaler.ConvertStringToNative(pManagedHome1, dwFlags)); } StringBuilder pManagedHome2; if ((pManagedHome2 = pManagedHome as StringBuilder) != null) { return(this.ConvertStringBuilderToNative(pManagedHome2, dwFlags)); } if (pManagedHome.GetType().IsLayoutSequential || pManagedHome.GetType().IsExplicitLayout) { return(this.ConvertLayoutToNative(pManagedHome, dwFlags)); } throw new ArgumentException(Environment.GetResourceString("Arg_NDirectBadObject")); }
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 intPtr; if (AsAnyMarshaler.IsAnsi(dwFlags)) { StubHelpers.CheckStringLength(pManagedHome.Capacity); int num = pManagedHome.Capacity * Marshal.SystemMaxDBCSCharSize + 4; intPtr = Marshal.AllocCoTaskMem(num); byte *ptr = (byte *)((void *)intPtr); *(ptr + num - 3) = 0; *(ptr + num - 2) = 0; *(ptr + num - 1) = 0; if (AsAnyMarshaler.IsIn(dwFlags)) { int num2; byte[] src = AnsiCharMarshaler.DoAnsiConversion(pManagedHome.ToString(), AsAnyMarshaler.IsBestFit(dwFlags), AsAnyMarshaler.IsThrowOn(dwFlags), out num2); Buffer.Memcpy(ptr, 0, src, 0, num2); ptr[num2] = 0; } if (AsAnyMarshaler.IsOut(dwFlags)) { this.backPropAction = AsAnyMarshaler.BackPropAction.StringBuilderAnsi; } } else { int num3 = pManagedHome.Capacity * 2 + 4; intPtr = Marshal.AllocCoTaskMem(num3); byte *ptr2 = (byte *)((void *)intPtr); *(ptr2 + num3 - 1) = 0; *(ptr2 + num3 - 2) = 0; if (AsAnyMarshaler.IsIn(dwFlags)) { int num4 = pManagedHome.Length * 2; pManagedHome.InternalCopy(intPtr, num4); ptr2[num4] = 0; (ptr2 + num4)[1] = 0; } if (AsAnyMarshaler.IsOut(dwFlags)) { this.backPropAction = AsAnyMarshaler.BackPropAction.StringBuilderUnicode; } } return(intPtr); }
private static IntPtr ConvertStringToNative(string pManagedHome, int dwFlags) { IntPtr intPtr; if (AsAnyMarshaler.IsAnsi(dwFlags)) { intPtr = CSTRMarshaler.ConvertToNative(dwFlags & 65535, pManagedHome, IntPtr.Zero); } else { StubHelpers.CheckStringLength(pManagedHome.Length); int num = (pManagedHome.Length + 1) * 2; intPtr = Marshal.AllocCoTaskMem(num); string.InternalCopy(pManagedHome, intPtr, num); } return(intPtr); }
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 static IntPtr ConvertStringToNative(string pManagedHome, int dwFlags) { IntPtr dest; if (AsAnyMarshaler.IsAnsi(dwFlags)) { dest = CSTRMarshaler.ConvertToNative(dwFlags & (int)ushort.MaxValue, pManagedHome, IntPtr.Zero); } else { System.StubHelpers.StubHelpers.CheckStringLength(pManagedHome.Length); int num = (pManagedHome.Length + 1) * 2; dest = Marshal.AllocCoTaskMem(num); string.InternalCopy(pManagedHome, dest, num); } return(dest); }
internal IntPtr ConvertToNative(object pManagedHome, int dwFlags) { if (pManagedHome == null) { return(IntPtr.Zero); } if (pManagedHome is ArrayWithOffset) { throw new ArgumentException(Environment.GetResourceString("Arg_MarshalAsAnyRestriction")); } IntPtr result; string pManagedHome2; StringBuilder pManagedHome3; if (pManagedHome.GetType().IsArray) { result = this.ConvertArrayToNative(pManagedHome, dwFlags); } else if ((pManagedHome2 = (pManagedHome as string)) != null) { result = AsAnyMarshaler.ConvertStringToNative(pManagedHome2, dwFlags); } else if ((pManagedHome3 = (pManagedHome as StringBuilder)) != null) { result = this.ConvertStringBuilderToNative(pManagedHome3, dwFlags); } else { if (!pManagedHome.GetType().IsLayoutSequential&& !pManagedHome.GetType().IsExplicitLayout) { throw new ArgumentException(Environment.GetResourceString("Arg_NDirectBadObject")); } result = this.ConvertLayoutToNative(pManagedHome, dwFlags); } return(result); }
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); goto IL_10D; } if (elementType == typeof(UIntPtr)) { varEnum = ((IntPtr.Size == 4) ? VarEnum.VT_UI4 : VarEnum.VT_UI8); goto IL_10D; } break; case TypeCode.Boolean: varEnum = (VarEnum)254; goto IL_10D; case TypeCode.Char: varEnum = (AsAnyMarshaler.IsAnsi(dwFlags) ? ((VarEnum)253) : VarEnum.VT_UI2); goto IL_10D; case TypeCode.SByte: varEnum = VarEnum.VT_I1; goto IL_10D; case TypeCode.Byte: varEnum = VarEnum.VT_UI1; goto IL_10D; case TypeCode.Int16: varEnum = VarEnum.VT_I2; goto IL_10D; case TypeCode.UInt16: varEnum = VarEnum.VT_UI2; goto IL_10D; case TypeCode.Int32: varEnum = VarEnum.VT_I4; goto IL_10D; case TypeCode.UInt32: varEnum = VarEnum.VT_UI4; goto IL_10D; case TypeCode.Int64: varEnum = VarEnum.VT_I8; goto IL_10D; case TypeCode.UInt64: varEnum = VarEnum.VT_UI8; goto IL_10D; case TypeCode.Single: varEnum = VarEnum.VT_R4; goto IL_10D; case TypeCode.Double: varEnum = VarEnum.VT_R8; goto IL_10D; } throw new ArgumentException(Environment.GetResourceString("Arg_NDirectBadObject")); IL_10D: int num = (int)varEnum; if (AsAnyMarshaler.IsBestFit(dwFlags)) { num |= 65536; } if (AsAnyMarshaler.IsThrowOn(dwFlags)) { num |= 16777216; } MngdNativeArrayMarshaler.CreateMarshaler(this.pvArrayMarshaler, IntPtr.Zero, num); IntPtr result; IntPtr pNativeHome = new IntPtr((void *)(&result)); 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(result); }