예제 #1
0
 internal AsAnyMarshaler(IntPtr pvArrayMarshaler)
 {
     this.pvArrayMarshaler = pvArrayMarshaler;
     this.backPropAction   = AsAnyMarshaler.BackPropAction.None;
     this.layoutType       = (Type)null;
     this.cleanupWorkList  = (CleanupWorkList)null;
 }
예제 #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);
        }
예제 #3
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);
        }
예제 #4
0
        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);
        }