コード例 #1
0
        CustomAttrib.FixedArg ReadFixedArg(byte [] data, BinaryReader br,
                                           bool array, object param, ref bool read)
        {
            CustomAttrib.FixedArg fa = new CustomAttrib.FixedArg();
            if (array)
            {
                fa.SzArray = true;
                fa.NumElem = br.ReadUInt32();

                if (fa.NumElem == 0 || fa.NumElem == 0xffffffff)
                {
                    fa.Elems = new CustomAttrib.Elem [0];
                    return(fa);
                }

                if (param is ArrayType)
                {
                    param = ((ArrayType)param).ElementType;
                }

                fa.Elems = new CustomAttrib.Elem [fa.NumElem];
                for (int i = 0; i < fa.NumElem; i++)
                {
                    fa.Elems [i] = ReadElem(data, br, param, ref read);
                }
            }
            else
            {
                fa.Elems = new CustomAttrib.Elem [] { ReadElem(data, br, param, ref read) }
            };

            return(fa);
        }
コード例 #2
0
        void Write(CustomAttrib.FixedArg fa, MemoryBinaryWriter writer)
        {
            if (fa.SzArray)
            {
                writer.Write(fa.NumElem);
            }

            foreach (CustomAttrib.Elem elem in fa.Elems)
            {
                Write(elem, writer);
            }
        }
コード例 #3
0
        CustomAttrib.FixedArg CreateFixedArg(TypeReference type, object value)
        {
            CustomAttrib.FixedArg fa = new CustomAttrib.FixedArg ();
            if (value is object []) {
                fa.SzArray = true;
                object [] values = value as object [];
                TypeReference obj = ((ArrayType) type).ElementType;
                fa.NumElem = (uint) values.Length;
                fa.Elems = new CustomAttrib.Elem [values.Length];
                for (int i = 0; i < values.Length; i++)
                    fa.Elems [i] = CreateElem (obj, values [i]);
            } else {
                fa.Elems = new CustomAttrib.Elem [1];
                fa.Elems [0] = CreateElem (type, value);
            }

            return fa;
        }
コード例 #4
0
        CustomAttrib.FixedArg ReadFixedArg(byte [] data, BinaryReader br,
                                           TypeReference param, ref bool read, bool resolve)
        {
            CustomAttrib.FixedArg fa = new CustomAttrib.FixedArg();
            if (param is ArrayType)
            {
                param      = ((ArrayType)param).ElementType;
                fa.SzArray = true;
                fa.NumElem = br.ReadUInt32();

                if (fa.NumElem == 0 || fa.NumElem == 0xffffffff)
                {
                    fa.Elems   = new CustomAttrib.Elem [0];
                    fa.NumElem = 0;
                    return(fa);
                }

                fa.Elems = new CustomAttrib.Elem [fa.NumElem];
                for (int i = 0; i < fa.NumElem; i++)
                {
                    fa.Elems [i] = ReadElem(data, br, param, ref read, resolve);
                }
            }
            else
            {
                fa.Elems = new CustomAttrib.Elem [] { ReadElem(data, br, param, ref read, resolve) }
            };

            return(fa);
        }

        TypeReference CreateEnumTypeReference(string enumName)
        {
            string asmName  = null;
            int    asmStart = enumName.IndexOf(',');

            if (asmStart != -1)
            {
                asmName  = enumName.Substring(asmStart + 1);
                enumName = enumName.Substring(0, asmStart);
            }
            // Inner class style is reflection style.
            enumName = enumName.Replace('+', '/');
            AssemblyNameReference asm;

            if (asmName == null)
            {
                // If no assembly is given then the ECMA standard says the
                // assembly is either the current one or mscorlib.
                if (m_reflectReader.Module.Types.Contains(enumName))
                {
                    return(m_reflectReader.Module.Types [enumName]);
                }

                asm = m_reflectReader.Corlib;
            }
            else
            {
                asm = AssemblyNameReference.Parse(asmName);
            }

            string [] outers        = enumName.Split('/');
            string    outerfullname = outers [0];
            string    ns            = null;
            int       nsIndex       = outerfullname.LastIndexOf('.');

            if (nsIndex != -1)
            {
                ns = outerfullname.Substring(0, nsIndex);
            }
            string        name    = outerfullname.Substring(nsIndex + 1);
            TypeReference decType = new TypeReference(name, ns, asm);

            for (int i = 1; i < outers.Length; i++)
            {
                TypeReference t = new TypeReference(outers [i], null, asm);
                t.Module        = m_reflectReader.Module;
                t.DeclaringType = decType;
                decType         = t;
            }
            decType.Module      = m_reflectReader.Module;
            decType.IsValueType = true;

            return(decType);
        }

        TypeReference ReadTypeReference(byte [] data, BinaryReader br, out ElementType elemType)
        {
            bool array = false;

            elemType = (ElementType)br.ReadByte();
            if (elemType == ElementType.SzArray)
            {
                elemType = (ElementType)br.ReadByte();
                array    = true;
            }

            TypeReference res;

            if (elemType == ElementType.Enum)
            {
                res = CreateEnumTypeReference(ReadUTF8String(data, br));
            }
            else
            {
                res = TypeReferenceFromElemType(elemType);
            }

            if (array)
            {
                res = new ArrayType(res);
            }

            return(res);
        }

        TypeReference TypeReferenceFromElemType(ElementType elemType)
        {
            switch (elemType)
            {
            case ElementType.Boxed:
            case ElementType.Object:
                return(m_reflectReader.SearchCoreType(Constants.Object));

            case ElementType.String:
                return(m_reflectReader.SearchCoreType(Constants.String));

            case ElementType.Type:
                return(m_reflectReader.SearchCoreType(Constants.Type));

            case ElementType.Boolean:
                return(m_reflectReader.SearchCoreType(Constants.Boolean));

            case ElementType.Char:
                return(m_reflectReader.SearchCoreType(Constants.Char));

            case ElementType.R4:
                return(m_reflectReader.SearchCoreType(Constants.Single));

            case ElementType.R8:
                return(m_reflectReader.SearchCoreType(Constants.Double));

            case ElementType.I1:
                return(m_reflectReader.SearchCoreType(Constants.SByte));

            case ElementType.I2:
                return(m_reflectReader.SearchCoreType(Constants.Int16));

            case ElementType.I4:
                return(m_reflectReader.SearchCoreType(Constants.Int32));

            case ElementType.I8:
                return(m_reflectReader.SearchCoreType(Constants.Int64));

            case ElementType.U1:
                return(m_reflectReader.SearchCoreType(Constants.Byte));

            case ElementType.U2:
                return(m_reflectReader.SearchCoreType(Constants.UInt16));

            case ElementType.U4:
                return(m_reflectReader.SearchCoreType(Constants.UInt32));

            case ElementType.U8:
                return(m_reflectReader.SearchCoreType(Constants.UInt64));

            default:
                throw new MetadataFormatException("Non valid type in CustomAttrib.Elem: 0x{0}",
                                                  ((byte)elemType).ToString("x2"));
            }
        }
コード例 #5
0
ファイル: SignatureReader.cs プロジェクト: sidecut/xaeios
        CustomAttrib.FixedArg ReadFixedArg(byte [] data, BinaryReader br,
			TypeReference param, ref bool read, bool resolve)
        {
            CustomAttrib.FixedArg fa = new CustomAttrib.FixedArg ();
            if (param is ArrayType) {
                param = ((ArrayType) param).ElementType;
                fa.SzArray = true;
                fa.NumElem = br.ReadUInt32 ();

                if (fa.NumElem == 0 || fa.NumElem == 0xffffffff) {
                    fa.Elems = new CustomAttrib.Elem [0];
                    fa.NumElem = 0;
                    return fa;
                }

                fa.Elems = new CustomAttrib.Elem [fa.NumElem];
                for (int i = 0; i < fa.NumElem; i++)
                    fa.Elems [i] = ReadElem (data, br, param, ref read, resolve);
            } else
                fa.Elems = new CustomAttrib.Elem [] { ReadElem (data, br, param, ref read, resolve) };

            return fa;
        }