Пример #1
0
        private static String uncompressString(byte[] buffer, ref int offset)
        {
            uint length    = SignatureBuffer.uncompressInt(buffer, ref offset);
            int  oldOffset = offset;

            offset += (int)length;
            return(MetaDataLoader.stringEncoding.GetString(buffer, oldOffset,
                                                           (int)length));
        }
Пример #2
0
        // Constructor Methods

        internal static MarshalSpec Create(byte[] buffer)
        {
            int         offset = 0;
            NativeTypes kind   = (NativeTypes)
                                 SignatureBuffer.uncompressInt(buffer, ref offset);

            switch (kind)
            {
            case NativeTypes.BOOLEAN:
            case NativeTypes.I1:
            case NativeTypes.U1:
            case NativeTypes.I2:
            case NativeTypes.U2:
            case NativeTypes.I4:
            case NativeTypes.U4:
            case NativeTypes.I8:
            case NativeTypes.U8:
            case NativeTypes.R4:
            case NativeTypes.R8:
            case NativeTypes.CURRENCY:
            case NativeTypes.BSTR:
            case NativeTypes.LPSTR:
            case NativeTypes.LPWSTR:
            case NativeTypes.LPTSTR:
            case NativeTypes.IUNKNOWN:
            case NativeTypes.IDISPATCH:
            case NativeTypes.STRUCT:
            case NativeTypes.INTF:
            case NativeTypes.INT:
            case NativeTypes.UINT:
            case NativeTypes.BYVALSTR:
            case NativeTypes.ANSIBSTR:
            case NativeTypes.TBSTR:
            case NativeTypes.VARIANTBOOL:
            case NativeTypes.FUNC:
            case NativeTypes.ASANY:
            case NativeTypes.LPSTRUCT:
            case NativeTypes.ERROR:
            case NativeTypes.MAX: {
                if (offset != buffer.Length)
                {
                    Console.WriteLine("WARNING: extra bytes in " + new MetaDataBlob(buffer));
                }
                return(new MarshalSpecNative(kind));
            }

            case NativeTypes.SAFEARRAY: {
                VariantTypes elemType;
                if (offset < buffer.Length)
                {
                    elemType = (VariantTypes)
                               SignatureBuffer.uncompressInt(buffer, ref offset);
                }
                else
                {
                    elemType = VariantTypes.VT_EMPTY;
                }
                if (offset != buffer.Length)
                {
                    Console.WriteLine("WARNING: extra bytes in " + new MetaDataBlob(buffer));
                }
                return(new MarshalSpecSafeArray(elemType));
            }

            case NativeTypes.FIXEDSYSSTRING: {
                uint elemCount =
                    SignatureBuffer.uncompressInt(buffer, ref offset);
                if (offset != buffer.Length)
                {
                    Console.WriteLine("WARNING: extra bytes in " + new MetaDataBlob(buffer));
                }
                return(new MarshalSpecFixedString(elemCount));
            }

            case NativeTypes.FIXEDARRAY: {
                uint elemCount =
                    SignatureBuffer.uncompressInt(buffer, ref offset);
                if (offset != buffer.Length)
                {
                    Console.WriteLine("WARNING: extra bytes in " + new MetaDataBlob(buffer));
                }
                return(new MarshalSpecFixedArray(elemCount));
            }

            case NativeTypes.CUSTOMMARSHALER: {
                String guid          = uncompressString(buffer, ref offset);
                String unmanagedType = uncompressString(buffer, ref offset);
                String managedType   = uncompressString(buffer, ref offset);
                String cookie        = uncompressString(buffer, ref offset);
                if (offset != buffer.Length)
                {
                    Console.WriteLine("WARNING: extra bytes in " + new MetaDataBlob(buffer));
                }
                return(new MarshalSpecCustom(guid, unmanagedType,
                                             managedType, cookie));
            }

            case NativeTypes.ARRAY: {
                NativeTypes elemType = (NativeTypes)
                                       SignatureBuffer.uncompressInt(buffer, ref offset);
                uint paramNumber =
                    ((offset < buffer.Length) ?
                     SignatureBuffer.uncompressInt(buffer, ref offset) :
                     0);
                uint extras =
                    ((offset < buffer.Length) ?
                     SignatureBuffer.uncompressInt(buffer, ref offset) :
                     0);
                if (offset != buffer.Length)
                {
                    Console.WriteLine("WARNING: extra bytes in " + new MetaDataBlob(buffer));
                }
                return(new MarshalSpecArray(elemType, paramNumber, extras));
            }

            default: {
                throw new Exception("Unknown marshal spec kind " + kind);
            }
            }
        }