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); }
private unsafe IntPtr ConvertArrayToNative(object pManagedHome, int dwFlags) { Type elementType = pManagedHome.GetType().GetElementType() !; VarEnum vt; switch (Type.GetTypeCode(elementType)) { case TypeCode.SByte: vt = VarEnum.VT_I1; break; case TypeCode.Byte: vt = VarEnum.VT_UI1; break; case TypeCode.Int16: vt = VarEnum.VT_I2; break; case TypeCode.UInt16: vt = VarEnum.VT_UI2; break; case TypeCode.Int32: vt = VarEnum.VT_I4; break; case TypeCode.UInt32: vt = VarEnum.VT_UI4; break; case TypeCode.Int64: vt = VarEnum.VT_I8; break; case TypeCode.UInt64: vt = VarEnum.VT_UI8; break; case TypeCode.Single: vt = VarEnum.VT_R4; break; case TypeCode.Double: vt = VarEnum.VT_R8; break; case TypeCode.Char: vt = (IsAnsi(dwFlags) ? (VarEnum)VTHACK_ANSICHAR : VarEnum.VT_UI2); break; case TypeCode.Boolean: vt = (VarEnum)VTHACK_WINBOOL; break; case TypeCode.Object: { if (elementType == typeof(IntPtr)) { vt = (IntPtr.Size == 4 ? VarEnum.VT_I4 : VarEnum.VT_I8); } else if (elementType == typeof(UIntPtr)) { vt = (IntPtr.Size == 4 ? VarEnum.VT_UI4 : VarEnum.VT_UI8); } else { goto default; } break; } default: throw new ArgumentException(SR.Arg_NDirectBadObject); } // marshal the object as C-style array (UnmanagedType.LPArray) int dwArrayMarshalerFlags = (int)vt; if (IsBestFit(dwFlags)) { dwArrayMarshalerFlags |= (1 << 16); } if (IsThrowOn(dwFlags)) { dwArrayMarshalerFlags |= (1 << 24); } MngdNativeArrayMarshaler.CreateMarshaler( pvArrayMarshaler, IntPtr.Zero, // not needed as we marshal primitive VTs only dwArrayMarshalerFlags, IntPtr.Zero); // not needed as we marshal primitive VTs only IntPtr pNativeHome; IntPtr pNativeHomeAddr = new IntPtr(&pNativeHome); MngdNativeArrayMarshaler.ConvertSpaceToNative( pvArrayMarshaler, ref pManagedHome, pNativeHomeAddr); if (IsIn(dwFlags)) { MngdNativeArrayMarshaler.ConvertContentsToNative( pvArrayMarshaler, ref pManagedHome, pNativeHomeAddr); } if (IsOut(dwFlags)) { backPropAction = BackPropAction.Array; } return(pNativeHome); }
private unsafe IntPtr ConvertArrayToNative(object pManagedHome, int dwFlags) { int num; IntPtr ptr; Type elementType = pManagedHome.GetType().GetElementType(); VarEnum enum2 = VarEnum.VT_EMPTY; switch (Type.GetTypeCode(elementType)) { case TypeCode.Object: if (!(elementType == typeof(IntPtr))) { if (elementType == typeof(UIntPtr)) { enum2 = (IntPtr.Size == 4) ? VarEnum.VT_UI4 : VarEnum.VT_UI8; goto Label_010D; } break; } enum2 = (IntPtr.Size == 4) ? VarEnum.VT_I4 : VarEnum.VT_I8; goto Label_010D; case TypeCode.Boolean: enum2 = (VarEnum)0xfe; goto Label_010D; case TypeCode.Char: enum2 = IsAnsi(dwFlags) ? ((VarEnum)0xfd) : VarEnum.VT_UI2; goto Label_010D; case TypeCode.SByte: enum2 = VarEnum.VT_I1; goto Label_010D; case TypeCode.Byte: enum2 = VarEnum.VT_UI1; goto Label_010D; case TypeCode.Int16: enum2 = VarEnum.VT_I2; goto Label_010D; case TypeCode.UInt16: enum2 = VarEnum.VT_UI2; goto Label_010D; case TypeCode.Int32: enum2 = VarEnum.VT_I4; goto Label_010D; case TypeCode.UInt32: enum2 = VarEnum.VT_UI4; goto Label_010D; case TypeCode.Int64: enum2 = VarEnum.VT_I8; goto Label_010D; case TypeCode.UInt64: enum2 = VarEnum.VT_UI8; goto Label_010D; case TypeCode.Single: enum2 = VarEnum.VT_R4; goto Label_010D; case TypeCode.Double: enum2 = VarEnum.VT_R8; goto Label_010D; } throw new ArgumentException(Environment.GetResourceString("Arg_NDirectBadObject")); Label_010D: num = (int)enum2; if (IsBestFit(dwFlags)) { num |= 0x10000; } if (IsThrowOn(dwFlags)) { num |= 0x1000000; } MngdNativeArrayMarshaler.CreateMarshaler(this.pvArrayMarshaler, IntPtr.Zero, num); IntPtr pNativeHome = new IntPtr((void *)&ptr); MngdNativeArrayMarshaler.ConvertSpaceToNative(this.pvArrayMarshaler, ref pManagedHome, pNativeHome); if (IsIn(dwFlags)) { MngdNativeArrayMarshaler.ConvertContentsToNative(this.pvArrayMarshaler, ref pManagedHome, pNativeHome); } if (IsOut(dwFlags)) { this.backPropAction = BackPropAction.Array; } return(ptr); }