string ReadUTF8String() { byte b = reader.ReadByte(); if (b == 0xFF) return null; uint len = reader.ReadCompressedUInt32(b); if (len == 0) return string.Empty; return Encoding.UTF8.GetString(reader.ReadBytes((int)len)); }
// Reads the new (.NET 2.0+) DeclSecurity blob format DmdCustomAttributeData[] ReadBinaryFormat(SecurityAction action) { int numAttrs = (int)reader.ReadCompressedUInt32(); DmdCustomAttributeData[]? res = new DmdCustomAttributeData[numAttrs]; IList <DmdType>?genericTypeArguments = null; int w = 0; for (int i = 0; i < numAttrs; i++) { var name = ReadUTF8String(); var type = DmdTypeNameParser.ParseThrow(module, name ?? string.Empty, genericTypeArguments); reader.ReadCompressedUInt32(); // int blobLength int numNamedArgs = (int)reader.ReadCompressedUInt32(); var namedArgs = DmdCustomAttributeReader.ReadNamedArguments(module, reader, type, numNamedArgs, genericTypeArguments); if (namedArgs is null) { throw new IOException(); } var(ctor, ctorArguments) = GetConstructor(type, action); Debug.Assert(!(ctor is null)); if (ctor is null) { continue; } res[w++] = new DmdCustomAttributeData(ctor, ctorArguments, namedArgs, isPseudoCustomAttribute: false); } if (res.Length != w) { if (w == 0) { return(Array.Empty <DmdCustomAttributeData>()); } Array.Resize(ref res, w); } return(res !); }
string ReadUTF8String() { byte b = reader.ReadByte(); if (b == 0xFF) { return(null); } uint len = reader.ReadCompressedUInt32(b); if (len == 0) { return(string.Empty); } return(Encoding.UTF8.GetString(reader.ReadBytes((int)len))); }
DmdMarshalType Read() { const int DEFAULT = 0; try { var nativeType = (UnmanagedType)reader.ReadByte(); UnmanagedType nt; int size; switch (nativeType) { case UnmanagedType.ByValTStr: size = CanRead ? (int)reader.ReadCompressedUInt32() : DEFAULT; return(DmdMarshalType.CreateFixedSysString(size)); case UnmanagedType.SafeArray: var vt = CanRead ? (VarEnum)reader.ReadCompressedUInt32() : DEFAULT; var udtName = CanRead ? ReadUTF8String() : null; var udtRef = udtName == null ? null : DmdTypeNameParser.Parse(module, udtName, genericTypeArguments); return(DmdMarshalType.CreateSafeArray(vt, udtRef)); case UnmanagedType.ByValArray: size = CanRead ? (int)reader.ReadCompressedUInt32() : DEFAULT; nt = CanRead ? (UnmanagedType)reader.ReadCompressedUInt32() : DEFAULT; return(DmdMarshalType.CreateFixedArray(size, nt)); case UnmanagedType.LPArray: nt = CanRead ? (UnmanagedType)reader.ReadCompressedUInt32() : DEFAULT; int paramNum = CanRead ? (int)reader.ReadCompressedUInt32() : DEFAULT; size = CanRead ? (int)reader.ReadCompressedUInt32() : DEFAULT; bool hasFlags = CanRead; int flags = hasFlags ? (int)reader.ReadCompressedUInt32() : DEFAULT; const int ntaSizeParamIndexSpecified = 1; if (hasFlags && (flags & ntaSizeParamIndexSpecified) == 0) { paramNum = 0; } return(DmdMarshalType.CreateArray(nt, (short)paramNum, size)); case UnmanagedType.CustomMarshaler: var guid = ReadUTF8String(); var nativeTypeName = ReadUTF8String(); var custMarshalerName = ReadUTF8String(); var cmRef = DmdTypeNameParser.Parse(module, custMarshalerName, genericTypeArguments); var cookie = ReadUTF8String(); return(DmdMarshalType.CreateCustomMarshaler(custMarshalerName, cmRef, cookie)); case UnmanagedType.IUnknown: case UnmanagedType.IDispatch: case UnmanagedType.Interface: int iidParamIndex = CanRead ? (int)reader.ReadCompressedUInt32() : DEFAULT; return(DmdMarshalType.CreateInterface(nativeType, iidParamIndex)); default: return(DmdMarshalType.Create(nativeType)); } } catch (ArgumentException) { } catch (IOException) { } return(null); }