/// <inheritdoc/> public void Write( TinyBinaryWriter writer) { foreach (var item in _dataByteArrays) { writer.WriteBytes(item); } }
/// <inheritdoc/> public void Write( TinyBinaryWriter writer) { foreach (var method in _methods) { writer.WriteBytes(CreateByteCode(method, writer)); } }
/// <inheritdoc/> protected override void WriteSingleItem( TinyBinaryWriter writer, TypeDefinition item) { _context.StringTable.GetOrCreateStringId(item.Namespace); WriteStringReference(writer, item.Name); WriteStringReference(writer, item.Namespace); writer.WriteUInt16(GetTypeReferenceOrDefinitionId(item.BaseType)); writer.WriteUInt16(GetTypeReferenceOrDefinitionId(item.DeclaringType)); var fieldsList = item.Fields .Where(field => !field.HasConstant) .OrderByDescending(field => field.IsStatic) .ToList(); foreach (var field in fieldsList) { _context.SignaturesTable.GetOrCreateSignatureId(field); _context.SignaturesTable.GetOrCreateSignatureId(field.InitialValue); } using (var stream = new MemoryStream(6)) { WriteClassFields(fieldsList, writer.GetMemoryBasedClone(stream)); if (item.DeclaringType == null) { foreach (var method in item.Methods) { var offsets = CodeWriter .PreProcessMethod(method, _context.ByteCodeTable.FakeStringTable) .ToList(); _byteCodeOffsets.Add(method.MetadataToken.ToUInt32(), offsets); } } foreach (var nestedType in item.NestedTypes) { foreach (var method in nestedType.Methods) { var offsets = CodeWriter .PreProcessMethod(method, _context.ByteCodeTable.FakeStringTable) .ToList(); _byteCodeOffsets.Add(method.MetadataToken.ToUInt32(), offsets); } } WriteMethodBodies(item.Methods, item.Interfaces, writer); _context.SignaturesTable.WriteDataType(item, writer, false, true); writer.WriteBytes(stream.ToArray()); } writer.WriteUInt16(GetFlags(item)); // flags }
/// <inheritdoc/> public void Write( TinyBinaryWriter writer) { foreach (var signature in _idsBySignatures .OrderBy(item => item.Value) .Select(item => item.Key)) { writer.WriteBytes(signature); } }
/// <summary> /// Writes all .NET Micro Framework metadata into output stream. /// </summary> /// <param name="binaryWriter">Binary writer with correct endianness.</param> public void Write( TinyBinaryWriter binaryWriter) { var header = new TinyAssemblyDefinition(_tablesContext); header.Write(binaryWriter, true); foreach (var table in GetTables(_tablesContext)) { var tableBegin = (binaryWriter.BaseStream.Position + 3) & 0xFFFFFFFC; table.Write(binaryWriter); var padding = (4 - ((binaryWriter.BaseStream.Position - tableBegin) % 4)) % 4; binaryWriter.WriteBytes(new Byte[padding]); header.UpdateTableOffset(binaryWriter, tableBegin, padding); } binaryWriter.BaseStream.Seek(0, SeekOrigin.Begin); header.Write(binaryWriter, false); }