public void TestInterpretAsArray() { var elementType = ElementType.I4; int[] expected = new int[] { 1, 2, 3 }; byte[] data = new byte[] { 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0 }; var assembly = Utilities.CreateTempNetAssembly(); var importer = new ReferenceImporter(assembly.NetDirectory.MetadataHeader.GetStream<TableStream>()); var fieldType = new TypeDefinition(string.Empty, "__StaticArrayInitTypeSize=" + data.Length, importer.ImportType(typeof(ValueType))); var field = new FieldDefinition(FieldName, FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.HasFieldRva, new FieldSignature(new TypeDefOrRefSignature(fieldType) { IsValueType = true })); var fieldRva = new FieldRva(field, data); int[] actual = fieldRva.InterpretAsArray(elementType).Cast<int>().ToArray(); Assert.AreEqual(expected.Length, actual.Length, "Length of arrays differ."); for (int i = 0; i < actual.Length; i++) Assert.AreEqual(expected[i], actual[i], "Element " + i + " differs from expected."); }
public void CreateCustomSizeFieldRva() { const int dataSize = 128; var assembly = Utilities.CreateTempNetAssembly(); var tableStream = assembly.NetDirectory.MetadataHeader.GetStream<TableStream>(); var typeTable = tableStream.GetTable<TypeDefinition>(); var classLayoutTable = tableStream.GetTable<ClassLayout>(); var importer = new ReferenceImporter(tableStream); var type = new TypeDefinition(string.Empty, "__StaticArrayInitTypeSize=" + dataSize, importer.ImportType(typeof(ValueType))); type.MetadataRow.Column5 = 2; // FieldList type.MetadataRow.Column6 = 2; // MethodList typeTable.Add(type); var layout = new ClassLayout(type, 128, 1); type.ClassLayout = layout; classLayoutTable.Add(layout); TestFieldRva(assembly, new TypeDefOrRefSignature(type), Enumerable.Repeat((byte)1, dataSize).ToArray(), false); }
public void CreateRequiredModifierField() { // set up temp assembly. var assembly = Utilities.CreateTempNetAssembly(); var typeSystem = assembly.NetDirectory.MetadataHeader.TypeSystem; var tableStream = assembly.NetDirectory.MetadataHeader.GetStream<TableStream>(); var fieldTable = tableStream.GetTable<FieldDefinition>(); var importer = new ReferenceImporter(tableStream); // create field. var typeSignature = new RequiredModifierSignature(importer.ImportType(typeof(IsVolatile)), typeSystem.Int32); var field = new FieldDefinition(FieldName, FieldAttributes.Public | FieldAttributes.Static, new FieldSignature(typeSignature)); fieldTable.Add(field); // build and validate. assembly = Utilities.RebuildNetAssembly(assembly); fieldTable = assembly.NetDirectory.MetadataHeader.GetStream<TableStream>().GetTable<FieldDefinition>(); field = fieldTable.First(x => x.Name == FieldName); Assert.IsInstanceOfType(field.Signature.FieldType, typeof(RequiredModifierSignature)); var newTypeSignature = (RequiredModifierSignature)field.Signature.FieldType; Utilities.ValidateType(typeSignature.ModifierType, newTypeSignature.ModifierType); Utilities.ValidateType(typeSignature.BaseType, newTypeSignature.BaseType); }
public void CreateGenericInstanceField() { // set up temp assembly. var assembly = Utilities.CreateTempNetAssembly(); var typeSystem = assembly.NetDirectory.MetadataHeader.TypeSystem; var tableStream = assembly.NetDirectory.MetadataHeader.GetStream<TableStream>(); var fieldTable = tableStream.GetTable<FieldDefinition>(); var importer = new ReferenceImporter(tableStream); // create field. var typeSignature = new GenericInstanceTypeSignature(importer.ImportType(typeof(List<>))); typeSignature.GenericArguments.Add(typeSystem.String); var field = new FieldDefinition(FieldName, FieldAttributes.Public | FieldAttributes.Static, new FieldSignature(typeSignature)); fieldTable.Add(field); // build and validate. assembly = Utilities.RebuildNetAssembly(assembly); fieldTable = assembly.NetDirectory.MetadataHeader.GetStream<TableStream>().GetTable<FieldDefinition>(); field = fieldTable.First(x => x.Name == FieldName); Assert.IsInstanceOfType(field.Signature.FieldType, typeof(GenericInstanceTypeSignature)); var newTypeSignature = (GenericInstanceTypeSignature)field.Signature.FieldType; Utilities.ValidateType(typeSignature.GenericType, newTypeSignature.GenericType); Assert.AreEqual(typeSignature.GenericArguments.Count, newTypeSignature.GenericArguments.Count); for (int i = 0; i < typeSignature.GenericArguments.Count; i++) Assert.AreEqual(typeSignature.GenericArguments[i].FullName, newTypeSignature.GenericArguments[i].FullName); }