void Write(CustomAttrib.FixedArg fa, MemoryBinaryWriter writer) { if (fa.SzArray) { writer.Write(fa.NumElem); } foreach (CustomAttrib.Elem elem in fa.Elems) { Write(elem, writer); } }
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")); } }