// dnlib: See LICENSE.txt for more info using System.Diagnostics; namespace dnlib.DotNet.MD { public partial class TablesStream { /// /// Reads a raw Module row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadModuleRow(uint rid, out RawModuleRow row) { var table = ModuleTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawModuleRow( reader.Unsafe_ReadUInt16(), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader), table.Column3.Unsafe_Read24(ref reader), table.Column4.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw TypeRef row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadTypeRefRow(uint rid, out RawTypeRefRow row) { var table = TypeRefTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawTypeRefRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw TypeDef row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadTypeDefRow(uint rid, out RawTypeDefRow row) { var table = TypeDefTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawTypeDefRow( reader.Unsafe_ReadUInt32(), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader), table.Column3.Unsafe_Read24(ref reader), table.Column4.Unsafe_Read24(ref reader), table.Column5.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw FieldPtr row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadFieldPtrRow(uint rid, out RawFieldPtrRow row) { var table = FieldPtrTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawFieldPtrRow(table.Column0.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw Field row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadFieldRow(uint rid, out RawFieldRow row) { var table = FieldTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawFieldRow( reader.Unsafe_ReadUInt16(), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw MethodPtr row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadMethodPtrRow(uint rid, out RawMethodPtrRow row) { var table = MethodPtrTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawMethodPtrRow(table.Column0.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw Method row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadMethodRow(uint rid, out RawMethodRow row) { var table = MethodTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var mrr = methodRowReader; if (mrr is not null && mrr.TryReadRow(rid, out row)) return true; var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawMethodRow( reader.Unsafe_ReadUInt32(), reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt16(), table.Column3.Unsafe_Read24(ref reader), table.Column4.Unsafe_Read24(ref reader), table.Column5.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw ParamPtr row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadParamPtrRow(uint rid, out RawParamPtrRow row) { var table = ParamPtrTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawParamPtrRow(table.Column0.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw Param row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadParamRow(uint rid, out RawParamRow row) { var table = ParamTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawParamRow( reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt16(), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw InterfaceImpl row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadInterfaceImplRow(uint rid, out RawInterfaceImplRow row) { var table = InterfaceImplTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawInterfaceImplRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw MemberRef row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadMemberRefRow(uint rid, out RawMemberRefRow row) { var table = MemberRefTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawMemberRefRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw Constant row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadConstantRow(uint rid, out RawConstantRow row) { var table = ConstantTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawConstantRow( reader.Unsafe_ReadByte(), reader.Unsafe_ReadByte(), table.Column2.Unsafe_Read24(ref reader), table.Column3.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw CustomAttribute row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadCustomAttributeRow(uint rid, out RawCustomAttributeRow row) { var table = CustomAttributeTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawCustomAttributeRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw FieldMarshal row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadFieldMarshalRow(uint rid, out RawFieldMarshalRow row) { var table = FieldMarshalTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawFieldMarshalRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw DeclSecurity row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadDeclSecurityRow(uint rid, out RawDeclSecurityRow row) { var table = DeclSecurityTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawDeclSecurityRow( (short)reader.Unsafe_ReadUInt16(), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw ClassLayout row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadClassLayoutRow(uint rid, out RawClassLayoutRow row) { var table = ClassLayoutTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawClassLayoutRow( reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt32(), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw FieldLayout row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadFieldLayoutRow(uint rid, out RawFieldLayoutRow row) { var table = FieldLayoutTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawFieldLayoutRow( reader.Unsafe_ReadUInt32(), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw StandAloneSig row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadStandAloneSigRow(uint rid, out RawStandAloneSigRow row) { var table = StandAloneSigTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawStandAloneSigRow(table.Column0.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw EventMap row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadEventMapRow(uint rid, out RawEventMapRow row) { var table = EventMapTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawEventMapRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw EventPtr row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadEventPtrRow(uint rid, out RawEventPtrRow row) { var table = EventPtrTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawEventPtrRow(table.Column0.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw Event row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadEventRow(uint rid, out RawEventRow row) { var table = EventTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawEventRow( reader.Unsafe_ReadUInt16(), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw PropertyMap row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadPropertyMapRow(uint rid, out RawPropertyMapRow row) { var table = PropertyMapTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawPropertyMapRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw PropertyPtr row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadPropertyPtrRow(uint rid, out RawPropertyPtrRow row) { var table = PropertyPtrTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawPropertyPtrRow(table.Column0.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw Property row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadPropertyRow(uint rid, out RawPropertyRow row) { var table = PropertyTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawPropertyRow( reader.Unsafe_ReadUInt16(), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw MethodSemantics row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadMethodSemanticsRow(uint rid, out RawMethodSemanticsRow row) { var table = MethodSemanticsTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawMethodSemanticsRow( reader.Unsafe_ReadUInt16(), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw MethodImpl row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadMethodImplRow(uint rid, out RawMethodImplRow row) { var table = MethodImplTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawMethodImplRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw ModuleRef row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadModuleRefRow(uint rid, out RawModuleRefRow row) { var table = ModuleRefTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawModuleRefRow(table.Column0.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw TypeSpec row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadTypeSpecRow(uint rid, out RawTypeSpecRow row) { var table = TypeSpecTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawTypeSpecRow(table.Column0.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw ImplMap row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadImplMapRow(uint rid, out RawImplMapRow row) { var table = ImplMapTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawImplMapRow( reader.Unsafe_ReadUInt16(), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader), table.Column3.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw FieldRVA row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadFieldRVARow(uint rid, out RawFieldRVARow row) { var table = FieldRVATable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawFieldRVARow( reader.Unsafe_ReadUInt32(), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw ENCLog row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadENCLogRow(uint rid, out RawENCLogRow row) { var table = ENCLogTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawENCLogRow( reader.Unsafe_ReadUInt32(), reader.Unsafe_ReadUInt32()); return true; } /// /// Reads a raw ENCMap row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadENCMapRow(uint rid, out RawENCMapRow row) { var table = ENCMapTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawENCMapRow(reader.Unsafe_ReadUInt32()); return true; } /// /// Reads a raw Assembly row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadAssemblyRow(uint rid, out RawAssemblyRow row) { var table = AssemblyTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawAssemblyRow( reader.Unsafe_ReadUInt32(), reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt32(), table.Column6.Unsafe_Read24(ref reader), table.Column7.Unsafe_Read24(ref reader), table.Column8.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw AssemblyProcessor row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadAssemblyProcessorRow(uint rid, out RawAssemblyProcessorRow row) { var table = AssemblyProcessorTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawAssemblyProcessorRow(reader.Unsafe_ReadUInt32()); return true; } /// /// Reads a raw AssemblyOS row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadAssemblyOSRow(uint rid, out RawAssemblyOSRow row) { var table = AssemblyOSTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawAssemblyOSRow( reader.Unsafe_ReadUInt32(), reader.Unsafe_ReadUInt32(), reader.Unsafe_ReadUInt32()); return true; } /// /// Reads a raw AssemblyRef row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadAssemblyRefRow(uint rid, out RawAssemblyRefRow row) { var table = AssemblyRefTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawAssemblyRefRow( reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt32(), table.Column5.Unsafe_Read24(ref reader), table.Column6.Unsafe_Read24(ref reader), table.Column7.Unsafe_Read24(ref reader), table.Column8.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw AssemblyRefProcessor row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadAssemblyRefProcessorRow(uint rid, out RawAssemblyRefProcessorRow row) { var table = AssemblyRefProcessorTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawAssemblyRefProcessorRow( reader.Unsafe_ReadUInt32(), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw AssemblyRefOS row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadAssemblyRefOSRow(uint rid, out RawAssemblyRefOSRow row) { var table = AssemblyRefOSTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawAssemblyRefOSRow( reader.Unsafe_ReadUInt32(), reader.Unsafe_ReadUInt32(), reader.Unsafe_ReadUInt32(), table.Column3.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw File row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadFileRow(uint rid, out RawFileRow row) { var table = FileTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawFileRow( reader.Unsafe_ReadUInt32(), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw ExportedType row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadExportedTypeRow(uint rid, out RawExportedTypeRow row) { var table = ExportedTypeTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawExportedTypeRow( reader.Unsafe_ReadUInt32(), reader.Unsafe_ReadUInt32(), table.Column2.Unsafe_Read24(ref reader), table.Column3.Unsafe_Read24(ref reader), table.Column4.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw ManifestResource row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadManifestResourceRow(uint rid, out RawManifestResourceRow row) { var table = ManifestResourceTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawManifestResourceRow( reader.Unsafe_ReadUInt32(), reader.Unsafe_ReadUInt32(), table.Column2.Unsafe_Read24(ref reader), table.Column3.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw NestedClass row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadNestedClassRow(uint rid, out RawNestedClassRow row) { var table = NestedClassTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawNestedClassRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw GenericParam row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadGenericParamRow(uint rid, out RawGenericParamRow row) { var table = GenericParamTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; if (table.Column4 is null) { row = new RawGenericParamRow( reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt16(), table.Column2.Unsafe_Read24(ref reader), table.Column3.Unsafe_Read24(ref reader)); return true; } else { row = new RawGenericParamRow( reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt16(), table.Column2.Unsafe_Read24(ref reader), table.Column3.Unsafe_Read24(ref reader), table.Column4.Unsafe_Read24(ref reader)); return true; } } /// /// Reads a raw MethodSpec row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadMethodSpecRow(uint rid, out RawMethodSpecRow row) { var table = MethodSpecTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawMethodSpecRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw GenericParamConstraint row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadGenericParamConstraintRow(uint rid, out RawGenericParamConstraintRow row) { var table = GenericParamConstraintTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawGenericParamConstraintRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw Document row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadDocumentRow(uint rid, out RawDocumentRow row) { var table = DocumentTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawDocumentRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader), table.Column3.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw MethodDebugInformation row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadMethodDebugInformationRow(uint rid, out RawMethodDebugInformationRow row) { var table = MethodDebugInformationTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawMethodDebugInformationRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw LocalScope row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadLocalScopeRow(uint rid, out RawLocalScopeRow row) { var table = LocalScopeTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawLocalScopeRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader), table.Column3.Unsafe_Read24(ref reader), reader.Unsafe_ReadUInt32(), reader.Unsafe_ReadUInt32()); return true; } /// /// Reads a raw LocalVariable row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadLocalVariableRow(uint rid, out RawLocalVariableRow row) { var table = LocalVariableTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawLocalVariableRow( reader.Unsafe_ReadUInt16(), reader.Unsafe_ReadUInt16(), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw LocalConstant row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadLocalConstantRow(uint rid, out RawLocalConstantRow row) { var table = LocalConstantTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawLocalConstantRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw ImportScope row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadImportScopeRow(uint rid, out RawImportScopeRow row) { var table = ImportScopeTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawImportScopeRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw StateMachineMethod row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadStateMachineMethodRow(uint rid, out RawStateMachineMethodRow row) { var table = StateMachineMethodTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawStateMachineMethodRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader)); return true; } /// /// Reads a raw CustomDebugInformation row or returns false if the row doesn't exist /// /// Row ID /// Row data /// public bool TryReadCustomDebugInformationRow(uint rid, out RawCustomDebugInformationRow row) { var table = CustomDebugInformationTable; if (table.IsInvalidRID(rid)) { row = default; return false; } var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize; row = new RawCustomDebugInformationRow( table.Column0.Unsafe_Read24(ref reader), table.Column1.Unsafe_Read24(ref reader), table.Column2.Unsafe_Read24(ref reader)); return true; } /// /// Reads a column /// /// The table /// Row ID /// Column index in /// Result is put here or 0 if we return false /// true if we could read the column, false otherwise public bool TryReadColumn(MDTable table, uint rid, int colIndex, out uint value) => TryReadColumn(table, rid, table.TableInfo.Columns[colIndex], out value); /// /// Reads a column /// /// The table /// Row ID /// Column /// Result is put here or 0 if we return false /// true if we could read the column, false otherwise public bool TryReadColumn(MDTable table, uint rid, ColumnInfo column, out uint value) { if (table.IsInvalidRID(rid)) { value = 0; return false; } var cr = columnReader; if (cr is not null && cr.ReadColumn(table, rid, column, out value)) return true; var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize + (uint)column.Offset; value = column.Read(ref reader); return true; } internal bool TryReadColumn24(MDTable table, uint rid, int colIndex, out uint value) => TryReadColumn24(table, rid, table.TableInfo.Columns[colIndex], out value); internal bool TryReadColumn24(MDTable table, uint rid, ColumnInfo column, out uint value) { Debug.Assert(column.Size == 2 || column.Size == 4); if (table.IsInvalidRID(rid)) { value = 0; return false; } var cr = columnReader; if (cr is not null && cr.ReadColumn(table, rid, column, out value)) return true; var reader = table.DataReader; reader.Position = (rid - 1) * (uint)table.TableInfo.RowSize + (uint)column.Offset; value = column.Size == 2 ? reader.Unsafe_ReadUInt16() : reader.Unsafe_ReadUInt32(); return true; } } }