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); } }
public byte [] CompressCustomAttribute(CustomAttrib ca, MethodReference ctor) { MemoryBinaryWriter writer = new MemoryBinaryWriter(); CompressCustomAttribute(ca, ctor, writer); return(writer.ToArray()); }
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); } }
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); }
void CompressCustomAttribute(CustomAttrib ca, MethodReference ctor, MemoryBinaryWriter writer) { m_sigWriter.Empty(); Write(ca, ctor, writer); }
public uint AddCustomAttribute(CustomAttrib ca, MethodReference ctor) { CompressCustomAttribute(ca, ctor, m_sigWriter); return(GetPointer()); }