Пример #1
0
        void Write(CustomAttrib ca, MethodReference ctor, MemoryBinaryWriter writer)
        {
            if (ca == null)
            {
                return;
            }

            if (ca.Prolog != CustomAttrib.StdProlog)
            {
                return;
            }

            writer.Write(ca.Prolog);

            for (int i = 0; i < ctor.Parameters.Count; i++)
            {
                Write(ca.FixedArgs [i], writer);
            }

            writer.Write(ca.NumNamed);

            for (int i = 0; i < ca.NumNamed; i++)
            {
                Write(ca.NamedArgs [i], writer);
            }
        }
Пример #2
0
        public byte [] CompressCustomAttribute(CustomAttrib ca, MethodReference ctor)
        {
            MemoryBinaryWriter writer = new MemoryBinaryWriter();

            CompressCustomAttribute(ca, ctor, writer);
            return(writer.ToArray());
        }
Пример #3
0
        CustomAttrib ReadCustomAttrib(int pos, MethodReference ctor, bool resolve)
        {
            int start, length = Utilities.ReadCompressedInteger(m_blobData, pos, out start);

            byte [] data = new byte [length];
            Buffer.BlockCopy(m_blobData, start, data, 0, length);
            try {
                return(ReadCustomAttrib(new BinaryReader(
                                            new MemoryStream(data)), data, ctor, resolve));
            } catch {
                CustomAttrib ca = new CustomAttrib(ctor);
                ca.Read = false;
                return(ca);
            }
        }
Пример #4
0
        CustomAttrib ReadCustomAttrib(BinaryReader br, byte [] data, MethodReference ctor, bool resolve)
        {
            CustomAttrib ca = new CustomAttrib(ctor);

            if (data.Length == 0)
            {
                ca.FixedArgs = CustomAttrib.FixedArg.Empty;
                ca.NamedArgs = CustomAttrib.NamedArg.Empty;
                return(ca);
            }

            bool read = true;

            ca.Prolog = br.ReadUInt16();
            if (ca.Prolog != CustomAttrib.StdProlog)
            {
                throw new MetadataFormatException("Non standard prolog for custom attribute");
            }

            if (ctor.HasParameters)
            {
                ca.FixedArgs = new CustomAttrib.FixedArg [ctor.Parameters.Count];
                for (int i = 0; i < ca.FixedArgs.Length && read; i++)
                {
                    ca.FixedArgs [i] = ReadFixedArg(data, br,
                                                    ctor.Parameters [i].ParameterType, ref read, resolve);
                }
            }
            else
            {
                ca.FixedArgs = CustomAttrib.FixedArg.Empty;
            }

            if (br.BaseStream.Position == br.BaseStream.Length)
            {
                read = false;
            }

            if (!read)
            {
                ca.Read = read;
                return(ca);
            }

            ca.NumNamed = br.ReadUInt16();
            if (ca.NumNamed > 0)
            {
                ca.NamedArgs = new CustomAttrib.NamedArg [ca.NumNamed];
                for (int i = 0; i < ca.NumNamed && read; i++)
                {
                    ca.NamedArgs [i] = ReadNamedArg(data, br, ref read, resolve);
                }
            }
            else
            {
                ca.NamedArgs = CustomAttrib.NamedArg.Empty;
            }

            ca.Read = read;
            return(ca);
        }
Пример #5
0
 void CompressCustomAttribute(CustomAttrib ca, MethodReference ctor, MemoryBinaryWriter writer)
 {
     m_sigWriter.Empty();
     Write(ca, ctor, writer);
 }
Пример #6
0
 public uint AddCustomAttribute(CustomAttrib ca, MethodReference ctor)
 {
     CompressCustomAttribute(ca, ctor, m_sigWriter);
     return(GetPointer());
 }