public VTableFixupsBuffer(VTablesDirectory directory) { Directory = directory; foreach (var header in directory.VTableHeaders) { AddVTableHeader(header); } }
public void PersistentVTables() { var assembly = CreateTempAssembly(); var header = assembly.NetDirectory.MetadataHeader; var importer = new ReferenceImporter(header.Image); var type = new TypeDefinition(null, "SomeType", TypeAttributes.Public, importer.ImportType(typeof(object))); for (int i = 0; i < 10; i++) { var method = new MethodDefinition("Method" + i, MethodAttributes.Public | MethodAttributes.Virtual, new MethodSignature(header.Image.TypeSystem.Void)); method.MethodBody = new CilMethodBody(method) { Instructions = { CilInstruction.Create(CilOpCodes.Ret) } }; type.Methods.Add(method); } header.Image.Assembly.Modules[0].TopLevelTypes.Add(type); var mapping = header.UnlockMetadata(); var directory = new VTablesDirectory(); var vTableHeader = new VTableHeader() { Attributes = VTableAttributes.Is32Bit, }; foreach (var method in type.Methods) { vTableHeader.Table.Add(header.GetStream <TableStream>().ResolveRow(mapping[method])); } directory.VTableHeaders.Add(vTableHeader); assembly.NetDirectory.VTablesDirectory = directory; using (var stream = new MemoryStream()) { assembly.Write(new BinaryStreamWriter(stream), new CompactNetAssemblyBuilder(assembly)); assembly = WindowsAssembly.FromBytes(stream.ToArray()); directory = assembly.NetDirectory.VTablesDirectory; Assert.NotNull(directory); Assert.Equal(1, directory.VTableHeaders.Count); Assert.Equal(type.Methods.Select(x => mapping[x]), directory.VTableHeaders[0].Table.Select(x => x.MetadataToken)); } }