Ejemplo n.º 1
0
        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"));
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }