diff --git a/Mono.Cecil/AssemblyReader.cs b/Mono.Cecil/AssemblyReader.cs index ee2c229a9..fb4cabfbe 100644 --- a/Mono.Cecil/AssemblyReader.cs +++ b/Mono.Cecil/AssemblyReader.cs @@ -23,9 +23,8 @@ namespace Mono.Cecil { - abstract class ModuleReader { - - readonly protected ModuleDefinition module; + internal abstract class ModuleReader { + protected readonly ModuleDefinition module; protected ModuleReader (Image image, ReadingMode mode) { @@ -34,6 +33,7 @@ protected ModuleReader (Image image, ReadingMode mode) } protected abstract void ReadModule (); + public abstract void ReadSymbols (ModuleDefinition module); protected void ReadModuleManifest (MetadataReader reader) @@ -43,7 +43,7 @@ protected void ReadModuleManifest (MetadataReader reader) ReadAssembly (reader); } - void ReadAssembly (MetadataReader reader) + private void ReadAssembly (MetadataReader reader) { var name = reader.ReadAssemblyNameDefinition (); if (name == null) { @@ -63,6 +63,9 @@ public static ModuleDefinition CreateModule (Image image, ReaderParameters param var reader = CreateModuleReader (image, parameters.ReadingMode); var module = reader.module; + if (parameters.AssemblyResolverProvider != null) + module.AssemblyResolverProvider = parameters.AssemblyResolverProvider; + if (parameters.assembly_resolver != null) module.assembly_resolver = Disposable.NotOwned (parameters.assembly_resolver); @@ -89,7 +92,7 @@ public static ModuleDefinition CreateModule (Image image, ReaderParameters param return module; } - static void ReadSymbols (ModuleDefinition module, ReaderParameters parameters) + private static void ReadSymbols (ModuleDefinition module, ReaderParameters parameters) { var symbol_reader_provider = parameters.SymbolReaderProvider; @@ -106,7 +109,8 @@ static void ReadSymbols (ModuleDefinition module, ReaderParameters parameters) if (reader != null) { try { module.ReadSymbols (reader, parameters.ThrowIfSymbolsAreNotMatching); - } catch (Exception) { + } + catch (Exception) { reader.Dispose (); throw; } @@ -117,7 +121,7 @@ static void ReadSymbols (ModuleDefinition module, ReaderParameters parameters) module.ReadSymbols (new PortablePdbReader (module.Image, module)); } - static void GetMetadataKind (ModuleDefinition module, ReaderParameters parameters) + private static void GetMetadataKind (ModuleDefinition module, ReaderParameters parameters) { if (!parameters.ApplyWindowsRuntimeProjections) { module.MetadataKind = MetadataKind.Ecma335; @@ -134,22 +138,23 @@ static void GetMetadataKind (ModuleDefinition module, ReaderParameters parameter module.MetadataKind = MetadataKind.WindowsMetadata; } - static ModuleReader CreateModuleReader (Image image, ReadingMode mode) + private static ModuleReader CreateModuleReader (Image image, ReadingMode mode) { switch (mode) { case ReadingMode.Immediate: return new ImmediateModuleReader (image); + case ReadingMode.Deferred: return new DeferredModuleReader (image); + default: throw new ArgumentException (); } } } - sealed class ImmediateModuleReader : ModuleReader { - - bool resolve_attributes; + internal sealed class ImmediateModuleReader : ModuleReader { + private bool resolve_attributes; public ImmediateModuleReader (Image image) : base (image, ReadingMode.Immediate) @@ -189,13 +194,13 @@ public void ReadModule (ModuleDefinition module, bool resolve_attributes) ReadSecurityDeclarations (assembly); } - void ReadTypes (Collection types) + private void ReadTypes (Collection types) { for (int i = 0; i < types.Count; i++) ReadType (types [i]); } - void ReadType (TypeDefinition type) + private void ReadType (TypeDefinition type) { ReadGenericParameters (type); @@ -224,7 +229,7 @@ void ReadType (TypeDefinition type) ReadCustomAttributes (type); } - void ReadInterfaces (TypeDefinition type) + private void ReadInterfaces (TypeDefinition type) { var interfaces = type.Interfaces; @@ -232,7 +237,7 @@ void ReadInterfaces (TypeDefinition type) ReadCustomAttributes (interfaces [i]); } - void ReadGenericParameters (IGenericParameterProvider provider) + private void ReadGenericParameters (IGenericParameterProvider provider) { if (!provider.HasGenericParameters) return; @@ -249,7 +254,7 @@ void ReadGenericParameters (IGenericParameterProvider provider) } } - void ReadGenericParameterConstraints (GenericParameter parameter) + private void ReadGenericParameterConstraints (GenericParameter parameter) { var constraints = parameter.Constraints; @@ -257,7 +262,7 @@ void ReadGenericParameterConstraints (GenericParameter parameter) ReadCustomAttributes (constraints [i]); } - void ReadSecurityDeclarations (ISecurityDeclarationProvider provider) + private void ReadSecurityDeclarations (ISecurityDeclarationProvider provider) { if (!provider.HasSecurityDeclarations) return; @@ -274,7 +279,7 @@ void ReadSecurityDeclarations (ISecurityDeclarationProvider provider) } } - void ReadCustomAttributes (ICustomAttributeProvider provider) + private void ReadCustomAttributes (ICustomAttributeProvider provider) { if (!provider.HasCustomAttributes) return; @@ -291,7 +296,7 @@ void ReadCustomAttributes (ICustomAttributeProvider provider) } } - void ReadFields (TypeDefinition type) + private void ReadFields (TypeDefinition type) { var fields = type.Fields; @@ -314,7 +319,7 @@ void ReadFields (TypeDefinition type) } } - void ReadMethods (TypeDefinition type) + private void ReadMethods (TypeDefinition type) { var methods = type.Methods; @@ -346,7 +351,7 @@ void ReadMethods (TypeDefinition type) } } - void ReadParameters (MethodDefinition method) + private void ReadParameters (MethodDefinition method) { var parameters = method.Parameters; @@ -363,7 +368,7 @@ void ReadParameters (MethodDefinition method) } } - void ReadProperties (TypeDefinition type) + private void ReadProperties (TypeDefinition type) { var properties = type.Properties; @@ -379,7 +384,7 @@ void ReadProperties (TypeDefinition type) } } - void ReadEvents (TypeDefinition type) + private void ReadEvents (TypeDefinition type) { var events = type.Events; @@ -400,7 +405,7 @@ public override void ReadSymbols (ModuleDefinition module) ReadTypesSymbols (module.Types, module.symbol_reader); } - void ReadTypesSymbols (Collection types, ISymbolReader symbol_reader) + private void ReadTypesSymbols (Collection types, ISymbolReader symbol_reader) { for (int i = 0; i < types.Count; i++) { var type = types [i]; @@ -413,7 +418,7 @@ void ReadTypesSymbols (Collection types, ISymbolReader symbol_re } } - void ReadMethodsSymbols (TypeDefinition type, ISymbolReader symbol_reader) + private void ReadMethodsSymbols (TypeDefinition type, ISymbolReader symbol_reader) { var methods = type.Methods; for (int i = 0; i < methods.Count; i++) { @@ -425,8 +430,7 @@ void ReadMethodsSymbols (TypeDefinition type, ISymbolReader symbol_reader) } } - sealed class DeferredModuleReader : ModuleReader { - + internal sealed class DeferredModuleReader : ModuleReader { public DeferredModuleReader (Image image) : base (image, ReadingMode.Deferred) { @@ -442,16 +446,15 @@ public override void ReadSymbols (ModuleDefinition module) } } - sealed class MetadataReader : ByteBuffer { - - readonly internal Image image; - readonly internal ModuleDefinition module; - readonly internal MetadataSystem metadata; + internal sealed class MetadataReader : ByteBuffer { + internal readonly Image image; + internal readonly ModuleDefinition module; + internal readonly MetadataSystem metadata; internal CodeReader code; internal IGenericContext context; - readonly MetadataReader metadata_reader; + private readonly MetadataReader metadata_reader; public MetadataReader (ModuleDefinition module) : base (module.Image.TableHeap.data) @@ -471,12 +474,12 @@ public MetadataReader (Image image, ModuleDefinition module, MetadataReader meta this.metadata_reader = metadata_reader; } - int GetCodedIndexSize (CodedIndex index) + private int GetCodedIndexSize (CodedIndex index) { return image.GetCodedIndexSize (index); } - uint ReadByIndexSize (int size) + private uint ReadByIndexSize (int size) { if (size == 4) return ReadUInt32 (); @@ -484,7 +487,7 @@ uint ReadByIndexSize (int size) return ReadUInt16 (); } - byte [] ReadBlob () + private byte [] ReadBlob () { var blob_heap = image.BlobHeap; if (blob_heap == null) { @@ -495,7 +498,7 @@ byte [] ReadBlob () return blob_heap.Read (ReadBlobIndex ()); } - byte [] ReadBlob (uint signature) + private byte [] ReadBlob (uint signature) { var blob_heap = image.BlobHeap; if (blob_heap == null) @@ -504,13 +507,13 @@ byte [] ReadBlob (uint signature) return blob_heap.Read (signature); } - uint ReadBlobIndex () + private uint ReadBlobIndex () { var blob_heap = image.BlobHeap; return ReadByIndexSize (blob_heap != null ? blob_heap.IndexSize : 2); } - void GetBlobView (uint signature, out byte [] blob, out int index, out int count) + private void GetBlobView (uint signature, out byte [] blob, out int index, out int count) { var blob_heap = image.BlobHeap; if (blob_heap == null) { @@ -522,48 +525,48 @@ void GetBlobView (uint signature, out byte [] blob, out int index, out int count blob_heap.GetView (signature, out blob, out index, out count); } - string ReadString () + private string ReadString () { return image.StringHeap.Read (ReadByIndexSize (image.StringHeap.IndexSize)); } - uint ReadStringIndex () + private uint ReadStringIndex () { return ReadByIndexSize (image.StringHeap.IndexSize); } - Guid ReadGuid () + private Guid ReadGuid () { return image.GuidHeap.Read (ReadByIndexSize (image.GuidHeap.IndexSize)); } - uint ReadTableIndex (Table table) + private uint ReadTableIndex (Table table) { return ReadByIndexSize (image.GetTableIndexSize (table)); } - MetadataToken ReadMetadataToken (CodedIndex index) + private MetadataToken ReadMetadataToken (CodedIndex index) { return index.GetMetadataToken (ReadByIndexSize (GetCodedIndexSize (index))); } - int MoveTo (Table table) + private int MoveTo (Table table) { var info = image.TableHeap [table]; if (info.Length != 0) - this.position = (int) info.Offset; + this.position = (int)info.Offset; - return (int) info.Length; + return (int)info.Length; } - bool MoveTo (Table table, uint row) + private bool MoveTo (Table table, uint row) { var info = image.TableHeap [table]; var length = info.Length; if (length == 0 || row > length) return false; - this.position = (int) (info.Offset + (info.RowSize * (row - 1))); + this.position = (int)(info.Offset + (info.RowSize * (row - 1))); return true; } @@ -574,7 +577,7 @@ public AssemblyNameDefinition ReadAssemblyNameDefinition () var name = new AssemblyNameDefinition (); - name.HashAlgorithm = (AssemblyHashAlgorithm) ReadUInt32 (); + name.HashAlgorithm = (AssemblyHashAlgorithm)ReadUInt32 (); PopulateVersionAndFlags (name); @@ -598,7 +601,7 @@ public ModuleDefinition Populate (ModuleDefinition module) return module; } - void InitializeAssemblyReferences () + private void InitializeAssemblyReferences () { if (metadata.AssemblyReferences != null) return; @@ -654,7 +657,7 @@ public Collection ReadModules () int length = MoveTo (Table.File); for (uint i = 1; i <= length; i++) { - var attributes = (FileAttributes) ReadUInt32 (); + var attributes = (FileAttributes)ReadUInt32 (); var name = ReadString (); ReadBlobIndex (); @@ -664,7 +667,8 @@ public Collection ReadModules () var parameters = new ReaderParameters { ReadingMode = module.ReadingMode, SymbolReaderProvider = module.SymbolReaderProvider, - AssemblyResolver = module.AssemblyResolver + AssemblyResolver = module.AssemblyResolver, + AssemblyResolverProvider = module.AssemblyResolverProvider }; var netmodule = ModuleDefinition.ReadModule (GetModuleFileName (name), parameters); @@ -676,7 +680,7 @@ public Collection ReadModules () return modules; } - string GetModuleFileName (string name) + private string GetModuleFileName (string name) { if (module.FileName == null) throw new NotSupportedException (); @@ -685,7 +689,7 @@ string GetModuleFileName (string name) return Path.Combine (path, name); } - void InitializeModuleReferences () + private void InitializeModuleReferences () { if (metadata.ModuleReferences != null) return; @@ -728,7 +732,7 @@ public Collection ReadResources () for (int i = 1; i <= length; i++) { var offset = ReadUInt32 (); - var flags = (ManifestResourceAttributes) ReadUInt32 (); + var flags = (ManifestResourceAttributes)ReadUInt32 (); var name = ReadString (); var implementation = ReadMetadataToken (CodedIndex.Implementation); @@ -738,7 +742,7 @@ public Collection ReadResources () resource = new EmbeddedResource (name, flags, offset, this); } else if (implementation.TokenType == TokenType.AssemblyRef) { resource = new AssemblyLinkedResource (name, flags) { - Assembly = (AssemblyNameReference) GetTypeReferenceScope (implementation), + Assembly = (AssemblyNameReference)GetTypeReferenceScope (implementation), }; } else if (implementation.TokenType == TokenType.File) { var file_record = ReadFileRecord (implementation.RID); @@ -756,7 +760,7 @@ public Collection ReadResources () return resources; } - Row ReadFileRecord (uint rid) + private Row ReadFileRecord (uint rid) { var position = this.position; @@ -764,7 +768,7 @@ Row ReadFileRecord (uint rid) throw new ArgumentException (); var record = new Row ( - (FileAttributes) ReadUInt32 (), + (FileAttributes)ReadUInt32 (), ReadString (), ReadBlobIndex ()); @@ -776,12 +780,12 @@ Row ReadFileRecord (uint rid) public byte [] GetManagedResource (uint offset) { return image.GetReaderAt (image.Resources.VirtualAddress, offset, (o, reader) => { - reader.Advance ((int) o); + reader.Advance ((int)o); return reader.ReadBytes (reader.ReadInt32 ()); }) ?? Empty.Array; } - void PopulateVersionAndFlags (AssemblyNameReference name) + private void PopulateVersionAndFlags (AssemblyNameReference name) { name.Version = new Version ( ReadUInt16 (), @@ -789,10 +793,10 @@ void PopulateVersionAndFlags (AssemblyNameReference name) ReadUInt16 (), ReadUInt16 ()); - name.Attributes = (AssemblyAttributes) ReadUInt32 (); + name.Attributes = (AssemblyAttributes)ReadUInt32 (); } - void PopulateNameAndCulture (AssemblyNameReference name) + private void PopulateNameAndCulture (AssemblyNameReference name) { name.Name = ReadString (); name.Culture = ReadString (); @@ -819,7 +823,7 @@ public TypeDefinitionCollection ReadTypes () return types; } - void CompleteTypes () + private void CompleteTypes () { var types = metadata.Types; @@ -831,7 +835,7 @@ void CompleteTypes () } } - void InitializeTypeDefinitions () + private void InitializeTypeDefinitions () { if (metadata.Types != null) return; @@ -857,7 +861,7 @@ void InitializeTypeDefinitions () } } - static bool IsNested (TypeAttributes attributes) + private static bool IsNested (TypeAttributes attributes) { switch (attributes & TypeAttributes.VisibilityMask) { case TypeAttributes.NestedAssembly: @@ -867,6 +871,7 @@ static bool IsNested (TypeAttributes attributes) case TypeAttributes.NestedPrivate: case TypeAttributes.NestedPublic: return true; + default: return false; } @@ -904,7 +909,7 @@ public Collection ReadNestedTypes (TypeDefinition type) return nested_types; } - void InitializeNestedTypes () + private void InitializeNestedTypes () { if (metadata.NestedTypes != null) return; @@ -925,13 +930,13 @@ void InitializeNestedTypes () } } - void AddNestedMapping (uint declaring, uint nested) + private void AddNestedMapping (uint declaring, uint nested) { metadata.SetNestedTypeMapping (declaring, AddMapping (metadata.NestedTypes, declaring, nested)); metadata.SetReverseNestedTypeMapping (nested, declaring); } - static Collection AddMapping (Dictionary> cache, TKey key, TValue value) + private static Collection AddMapping (Dictionary> cache, TKey key, TValue value) { Collection mapped; if (!cache.TryGetValue (key, out mapped)) { @@ -941,12 +946,12 @@ static Collection AddMapping (Dictionary ReadTypeLayout (TypeDefinition type) if (!metadata.ClassLayouts.TryGetValue (rid, out class_layout)) return new Row (Mixin.NoDataMarker, Mixin.NoDataMarker); - type.PackingSize = (short) class_layout.Col1; - type.ClassSize = (int) class_layout.Col2; + type.PackingSize = (short)class_layout.Col1; + type.ClassSize = (int)class_layout.Col2; metadata.ClassLayouts.Remove (rid); - return new Row ((short) class_layout.Col1, (int) class_layout.Col2); + return new Row ((short)class_layout.Col1, (int)class_layout.Col2); } - void InitializeTypeLayouts () + private void InitializeTypeLayouts () { if (metadata.ClassLayouts != null) return; @@ -1042,7 +1047,7 @@ void InitializeTypeLayouts () public TypeReference GetTypeDefOrRef (MetadataToken token) { - return (TypeReference) LookupToken (token); + return (TypeReference)LookupToken (token); } public TypeDefinition GetTypeDefinition (uint rid) @@ -1061,7 +1066,7 @@ public TypeDefinition GetTypeDefinition (uint rid) return type; } - TypeDefinition ReadTypeDefinition (uint rid) + private TypeDefinition ReadTypeDefinition (uint rid) { if (!MoveTo (Table.TypeDef, rid)) return null; @@ -1069,7 +1074,7 @@ TypeDefinition ReadTypeDefinition (uint rid) return ReadType (rid); } - void InitializeTypeReferences () + private void InitializeTypeReferences () { if (metadata.TypeReferences != null) return; @@ -1099,7 +1104,7 @@ public TypeReference GetTypeReference (string scope, string full_name) return null; } - TypeReference GetTypeReference (uint rid) + private TypeReference GetTypeReference (uint rid) { InitializeTypeReferences (); @@ -1110,7 +1115,7 @@ TypeReference GetTypeReference (uint rid) return ReadTypeReference (rid); } - TypeReference ReadTypeReference (uint rid) + private TypeReference ReadTypeReference (uint rid) { if (!MoveTo (Table.TypeRef, rid)) return null; @@ -1156,22 +1161,24 @@ TypeReference ReadTypeReference (uint rid) return type; } - IMetadataScope GetTypeReferenceScope (MetadataToken scope) + private IMetadataScope GetTypeReferenceScope (MetadataToken scope) { if (scope.TokenType == TokenType.Module) return module; - IMetadataScope[] scopes; + IMetadataScope [] scopes; switch (scope.TokenType) { case TokenType.AssemblyRef: InitializeAssemblyReferences (); scopes = metadata.AssemblyReferences; break; + case TokenType.ModuleRef: InitializeModuleReferences (); scopes = metadata.ModuleReferences; break; + default: throw new NotSupportedException (); } @@ -1197,7 +1204,7 @@ public IEnumerable GetTypeReferences () return type_references; } - TypeReference GetTypeSpecification (uint rid) + private TypeReference GetTypeSpecification (uint rid) { if (!MoveTo (Table.TypeSpec, rid)) return null; @@ -1210,7 +1217,7 @@ TypeReference GetTypeSpecification (uint rid) return type; } - SignatureReader ReadSignature (uint signature) + private SignatureReader ReadSignature (uint signature) { return new SignatureReader (signature, this); } @@ -1239,7 +1246,7 @@ public InterfaceImplementationCollection ReadInterfaces (TypeDefinition type) interfaces.Add ( new InterfaceImplementation ( GetTypeDefOrRef (mapping [i].Col2), - new MetadataToken(TokenType.InterfaceImpl, mapping [i].Col1))); + new MetadataToken (TokenType.InterfaceImpl, mapping [i].Col1))); } metadata.RemoveInterfaceMapping (type); @@ -1247,7 +1254,7 @@ public InterfaceImplementationCollection ReadInterfaces (TypeDefinition type) return interfaces; } - void InitializeInterfaces () + private void InitializeInterfaces () { if (metadata.Interfaces != null) return; @@ -1264,7 +1271,7 @@ void InitializeInterfaces () } } - void AddInterfaceMapping (uint type, Row @interface) + private void AddInterfaceMapping (uint type, Row @interface) { metadata.SetInterfaceMapping (type, AddMapping (metadata.Interfaces, type, @interface)); } @@ -1275,7 +1282,7 @@ public Collection ReadFields (TypeDefinition type) if (fields_range.Length == 0) return new MemberDefinitionCollection (type); - var fields = new MemberDefinitionCollection (type, (int) fields_range.Length); + var fields = new MemberDefinitionCollection (type, (int)fields_range.Length); this.context = type; if (!MoveTo (Table.FieldPtr, fields_range.Start)) { @@ -1290,9 +1297,9 @@ public Collection ReadFields (TypeDefinition type) return fields; } - void ReadField (uint field_rid, Collection fields) + private void ReadField (uint field_rid, Collection fields) { - var attributes = (FieldAttributes) ReadUInt16 (); + var attributes = (FieldAttributes)ReadUInt16 (); var name = ReadString (); var signature = ReadBlobIndex (); @@ -1309,7 +1316,7 @@ void ReadField (uint field_rid, Collection fields) WindowsRuntimeProjections.Project (field); } - void InitializeFields () + private void InitializeFields () { if (metadata.Fields != null) return; @@ -1317,7 +1324,7 @@ void InitializeFields () metadata.Fields = new FieldDefinition [image.GetTableLength (Table.Field)]; } - TypeReference ReadFieldType (uint signature) + private TypeReference ReadFieldType (uint signature) { var reader = ReadSignature (signature); @@ -1347,15 +1354,15 @@ public int ReadFieldRVA (FieldDefinition field) field.InitialValue = GetFieldInitializeValue (size, rva); - return (int) rva; + return (int)rva; } - byte [] GetFieldInitializeValue (int size, RVA rva) + private byte [] GetFieldInitializeValue (int size, RVA rva) { return image.GetReaderAt (rva, size, (s, reader) => reader.ReadBytes (s)) ?? Empty.Array; } - static int GetFieldTypeSize (TypeReference type) + private static int GetFieldTypeSize (TypeReference type) { int size = 0; @@ -1365,28 +1372,34 @@ static int GetFieldTypeSize (TypeReference type) case ElementType.I1: size = 1; break; + case ElementType.U2: case ElementType.I2: case ElementType.Char: size = 2; break; + case ElementType.U4: case ElementType.I4: case ElementType.R4: size = 4; break; + case ElementType.U8: case ElementType.I8: case ElementType.R8: size = 8; break; + case ElementType.Ptr: case ElementType.FnPtr: size = IntPtr.Size; break; + case ElementType.CModOpt: case ElementType.CModReqD: - return GetFieldTypeSize (((IModifierType) type).ElementType); + return GetFieldTypeSize (((IModifierType)type).ElementType); + default: var field_type = type.Resolve (); if (field_type != null && field_type.HasLayoutInfo) @@ -1398,7 +1411,7 @@ static int GetFieldTypeSize (TypeReference type) return size; } - void InitializeFieldRVAs () + private void InitializeFieldRVAs () { if (metadata.FieldRVAs != null) return; @@ -1425,10 +1438,10 @@ public int ReadFieldLayout (FieldDefinition field) metadata.FieldLayouts.Remove (rid); - return (int) offset; + return (int)offset; } - void InitializeFieldLayouts () + private void InitializeFieldLayouts () { if (metadata.FieldLayouts != null) return; @@ -1464,7 +1477,7 @@ public Collection ReadEvents (TypeDefinition type) if (!metadata.TryGetEventsRange (type, out range)) return new MemberDefinitionCollection (type); - var events = new MemberDefinitionCollection (type, (int) range.Length); + var events = new MemberDefinitionCollection (type, (int)range.Length); metadata.RemoveEventsRange (type); @@ -1485,9 +1498,9 @@ public Collection ReadEvents (TypeDefinition type) return events; } - void ReadEvent (uint event_rid, Collection events) + private void ReadEvent (uint event_rid, Collection events) { - var attributes = (EventAttributes) ReadUInt16 (); + var attributes = (EventAttributes)ReadUInt16 (); var name = ReadString (); var event_type = GetTypeDefOrRef (ReadMetadataToken (CodedIndex.TypeDefOrRef)); @@ -1500,7 +1513,7 @@ void ReadEvent (uint event_rid, Collection events) events.Add (@event); } - void InitializeEvents () + private void InitializeEvents () { if (metadata.Events != null) return; @@ -1538,7 +1551,7 @@ public Collection ReadProperties (TypeDefinition type) metadata.RemovePropertiesRange (type); - var properties = new MemberDefinitionCollection (type, (int) range.Length); + var properties = new MemberDefinitionCollection (type, (int)range.Length); if (range.Length == 0) return properties; @@ -1556,9 +1569,9 @@ public Collection ReadProperties (TypeDefinition type) return properties; } - void ReadProperty (uint property_rid, Collection properties) + private void ReadProperty (uint property_rid, Collection properties) { - var attributes = (PropertyAttributes) ReadUInt16 (); + var attributes = (PropertyAttributes)ReadUInt16 (); var name = ReadString (); var signature = ReadBlobIndex (); @@ -1584,7 +1597,7 @@ void ReadProperty (uint property_rid, Collection properties) properties.Add (property); } - void InitializeProperties () + private void InitializeProperties () { if (metadata.Properties != null) return; @@ -1600,7 +1613,7 @@ void InitializeProperties () } } - MethodSemanticsAttributes ReadMethodSemantics (MethodDefinition method) + private MethodSemanticsAttributes ReadMethodSemantics (MethodDefinition method) { InitializeMethodSemantics (); Row row; @@ -1613,41 +1626,47 @@ MethodSemanticsAttributes ReadMethodSemantics (MethodDefinition method) case MethodSemanticsAttributes.AddOn: GetEvent (type, row.Col2).add_method = method; break; + case MethodSemanticsAttributes.Fire: GetEvent (type, row.Col2).invoke_method = method; break; + case MethodSemanticsAttributes.RemoveOn: GetEvent (type, row.Col2).remove_method = method; break; + case MethodSemanticsAttributes.Getter: GetProperty (type, row.Col2).get_method = method; break; + case MethodSemanticsAttributes.Setter: GetProperty (type, row.Col2).set_method = method; break; + case MethodSemanticsAttributes.Other: switch (row.Col2.TokenType) { case TokenType.Event: { - var @event = GetEvent (type, row.Col2); - if (@event.other_methods == null) - @event.other_methods = new Collection (); + var @event = GetEvent (type, row.Col2); + if (@event.other_methods == null) + @event.other_methods = new Collection (); - @event.other_methods.Add (method); - break; - } + @event.other_methods.Add (method); + break; + } case TokenType.Property: { - var property = GetProperty (type, row.Col2); - if (property.other_methods == null) - property.other_methods = new Collection (); + var property = GetProperty (type, row.Col2); + if (property.other_methods == null) + property.other_methods = new Collection (); - property.other_methods.Add (method); + property.other_methods.Add (method); - break; - } + break; + } default: throw new NotSupportedException (); } break; + default: throw new NotSupportedException (); } @@ -1657,7 +1676,7 @@ MethodSemanticsAttributes ReadMethodSemantics (MethodDefinition method) return row.Col1; } - static EventDefinition GetEvent (TypeDefinition type, MetadataToken token) + private static EventDefinition GetEvent (TypeDefinition type, MetadataToken token) { if (token.TokenType != TokenType.Event) throw new ArgumentException (); @@ -1665,7 +1684,7 @@ static EventDefinition GetEvent (TypeDefinition type, MetadataToken token) return GetMember (type.Events, token); } - static PropertyDefinition GetProperty (TypeDefinition type, MetadataToken token) + private static PropertyDefinition GetProperty (TypeDefinition type, MetadataToken token) { if (token.TokenType != TokenType.Property) throw new ArgumentException (); @@ -1673,7 +1692,7 @@ static PropertyDefinition GetProperty (TypeDefinition type, MetadataToken token) return GetMember (type.Properties, token); } - static TMember GetMember (Collection members, MetadataToken token) where TMember : IMemberDefinition + private static TMember GetMember (Collection members, MetadataToken token) where TMember : IMemberDefinition { for (int i = 0; i < members.Count; i++) { var member = members [i]; @@ -1684,7 +1703,7 @@ static TMember GetMember (Collection members, MetadataToken to throw new ArgumentException (); } - void InitializeMethodSemantics () + private void InitializeMethodSemantics () { if (metadata.Semantics != null) return; @@ -1694,7 +1713,7 @@ void InitializeMethodSemantics () var semantics = metadata.Semantics = new Dictionary> (0); for (uint i = 0; i < length; i++) { - var attributes = (MethodSemanticsAttributes) ReadUInt16 (); + var attributes = (MethodSemanticsAttributes)ReadUInt16 (); var method_rid = ReadTableIndex (Table.Method); var association = ReadMetadataToken (CodedIndex.HasSemantics); @@ -1717,7 +1736,7 @@ public void ReadAllSemantics (MethodDefinition method) ReadAllSemantics (method.DeclaringType); } - void ReadAllSemantics (TypeDefinition type) + private void ReadAllSemantics (TypeDefinition type) { var methods = type.Methods; for (int i = 0; i < methods.Count; i++) { @@ -1736,7 +1755,7 @@ public Collection ReadMethods (TypeDefinition type) if (methods_range.Length == 0) return new MemberDefinitionCollection (type); - var methods = new MemberDefinitionCollection (type, (int) methods_range.Length); + var methods = new MemberDefinitionCollection (type, (int)methods_range.Length); if (!MoveTo (Table.MethodPtr, methods_range.Start)) { if (!MoveTo (Table.Method, methods_range.Start)) return methods; @@ -1749,7 +1768,7 @@ public Collection ReadMethods (TypeDefinition type) return methods; } - void ReadPointers (Table ptr, Table table, Range range, Collection members, Action> reader) + private void ReadPointers (Table ptr, Table table, Range range, Collection members, Action> reader) where TMember : IMemberDefinition { for (uint i = 0; i < range.Length; i++) { @@ -1762,12 +1781,12 @@ void ReadPointers (Table ptr, Table table, Range range, Collection methods) + private void ReadMethod (uint method_rid, Collection methods) { var method = new MethodDefinition (); method.rva = ReadUInt32 (); - method.ImplAttributes = (MethodImplAttributes) ReadUInt16 (); - method.Attributes = (MethodAttributes) ReadUInt16 (); + method.ImplAttributes = (MethodImplAttributes)ReadUInt16 (); + method.Attributes = (MethodAttributes)ReadUInt16 (); method.Name = ReadString (); method.token = new MetadataToken (TokenType.Method, method_rid); @@ -1807,7 +1826,7 @@ void ReadMethod (uint method_rid, Collection methods) WindowsRuntimeProjections.Project (method); } - void ReadParameters (MethodDefinition method, Range param_range) + private void ReadParameters (MethodDefinition method, Range param_range) { if (!MoveTo (Table.ParamPtr, param_range.Start)) { if (!MoveTo (Table.Param, param_range.Start)) @@ -1819,7 +1838,7 @@ void ReadParameters (MethodDefinition method, Range param_range) ReadParameterPointers (method, param_range); } - void ReadParameterPointers (MethodDefinition method, Range range) + private void ReadParameterPointers (MethodDefinition method, Range range) { for (uint i = 0; i < range.Length; i++) { MoveTo (Table.ParamPtr, range.Start + i); @@ -1832,9 +1851,9 @@ void ReadParameterPointers (MethodDefinition method, Range range) } } - void ReadParameter (uint param_rid, MethodDefinition method) + private void ReadParameter (uint param_rid, MethodDefinition method) { - var attributes = (ParameterAttributes) ReadUInt16 (); + var attributes = (ParameterAttributes)ReadUInt16 (); var sequence = ReadUInt16 (); var name = ReadString (); @@ -1847,7 +1866,7 @@ void ReadParameter (uint param_rid, MethodDefinition method) parameter.Attributes = attributes; } - void ReadMethodSignature (uint signature, IMethodSignature method) + private void ReadMethodSignature (uint signature, IMethodSignature method) { var reader = ReadSignature (signature); reader.ReadMethodSignature (method); @@ -1868,10 +1887,10 @@ public PInvokeInfo ReadPInvokeInfo (MethodDefinition method) return new PInvokeInfo ( row.Col1, image.StringHeap.Read (row.Col2), - module.ModuleReferences [(int) row.Col3 - 1]); + module.ModuleReferences [(int)row.Col3 - 1]); } - void InitializePInvokes () + private void InitializePInvokes () { if (metadata.PInvokes != null) return; @@ -1881,7 +1900,7 @@ void InitializePInvokes () var pinvokes = metadata.PInvokes = new Dictionary> (length); for (int i = 1; i <= length; i++) { - var attributes = (PInvokeAttributes) ReadUInt16 (); + var attributes = (PInvokeAttributes)ReadUInt16 (); var method = ReadMetadataToken (CodedIndex.MemberForwarded); var name = ReadStringIndex (); var scope = ReadTableIndex (Table.File); @@ -1922,14 +1941,14 @@ public Collection ReadGenericParameters (IGenericParameterProv return generic_parameters; } - void ReadGenericParametersRange (Range range, IGenericParameterProvider provider, GenericParameterCollection generic_parameters) + private void ReadGenericParametersRange (Range range, IGenericParameterProvider provider, GenericParameterCollection generic_parameters) { if (!MoveTo (Table.GenericParam, range.Start)) return; for (uint i = 0; i < range.Length; i++) { ReadUInt16 (); // index - var flags = (GenericParameterAttributes) ReadUInt16 (); + var flags = (GenericParameterAttributes)ReadUInt16 (); ReadMetadataToken (CodedIndex.TypeOrMethodDef); var name = ReadString (); @@ -1941,7 +1960,7 @@ void ReadGenericParametersRange (Range range, IGenericParameterProvider provider } } - void InitializeGenericParameters () + private void InitializeGenericParameters () { if (metadata.GenericParameters != null) return; @@ -1952,10 +1971,10 @@ void InitializeGenericParameters () var next = ReadMetadataToken (CodedIndex.TypeOrMethodDef); ReadStringIndex (); return next; - }); + }); } - Dictionary InitializeRanges (Table table, Func get_next) + private Dictionary InitializeRanges (Table table, Func get_next) { int length = MoveTo (table); var ranges = new Dictionary (length); @@ -1985,7 +2004,7 @@ Dictionary InitializeRanges (Table table, Func ranges, MetadataToken owner, Range range) + private static void AddRange (Dictionary ranges, MetadataToken owner, Range range) { if (owner.RID == 0) return; @@ -1996,7 +2015,7 @@ static void AddRange (Dictionary ranges, MetadataToken return; } - ranges [owner] = slots.Add(range); + ranges [owner] = slots.Add (range); } public bool HasGenericConstraints (GenericParameter generic_parameter) @@ -2020,7 +2039,7 @@ public GenericParameterConstraintCollection ReadGenericConstraints (GenericParam var constraints = new GenericParameterConstraintCollection (generic_parameter, mapping.Count); - this.context = (IGenericContext) generic_parameter.Owner; + this.context = (IGenericContext)generic_parameter.Owner; for (int i = 0; i < mapping.Count; i++) { constraints.Add ( @@ -2034,7 +2053,7 @@ public GenericParameterConstraintCollection ReadGenericConstraints (GenericParam return constraints; } - void InitializeGenericConstraints () + private void InitializeGenericConstraints () { if (metadata.GenericConstraints != null) return; @@ -2050,7 +2069,7 @@ void InitializeGenericConstraints () } } - void AddGenericConstraintMapping (uint generic_parameter, Row constraint) + private void AddGenericConstraintMapping (uint generic_parameter, Row constraint) { metadata.SetGenericConstraintMapping ( generic_parameter, @@ -2081,14 +2100,14 @@ public Collection ReadOverrides (MethodDefinition method) this.context = method; for (int i = 0; i < mapping.Count; i++) - overrides.Add ((MethodReference) LookupToken (mapping [i])); + overrides.Add ((MethodReference)LookupToken (mapping [i])); metadata.RemoveOverrideMapping (method); return overrides; } - void InitializeOverrides () + private void InitializeOverrides () { if (metadata.Overrides != null) return; @@ -2110,7 +2129,7 @@ void InitializeOverrides () } } - void AddOverrideMapping (uint method_rid, MetadataToken @override) + private void AddOverrideMapping (uint method_rid, MetadataToken @override) { metadata.SetOverrideMapping ( method_rid, @@ -2158,7 +2177,7 @@ public VariableDefinitionCollection ReadVariables (MetadataToken local_var_token if (count == 0) return null; - var variables = new VariableDefinitionCollection (method, (int) count); + var variables = new VariableDefinitionCollection (method, (int)count); for (int i = 0; i < count; i++) variables.Add (new VariableDefinition (reader.ReadTypeSignature ())); @@ -2184,24 +2203,31 @@ public IMetadataTokenProvider LookupToken (MetadataToken token) case TokenType.TypeDef: element = GetTypeDefinition (rid); break; + case TokenType.TypeRef: element = GetTypeReference (rid); break; + case TokenType.TypeSpec: element = GetTypeSpecification (rid); break; + case TokenType.Field: element = GetFieldDefinition (rid); break; + case TokenType.Method: element = GetMethodDefinition (rid); break; + case TokenType.MemberRef: element = GetMemberReference (rid); break; + case TokenType.MethodSpec: element = GetMethodSpecification (rid); break; + default: return null; } @@ -2223,7 +2249,7 @@ public FieldDefinition GetFieldDefinition (uint rid) return LookupField (rid); } - FieldDefinition LookupField (uint rid) + private FieldDefinition LookupField (uint rid) { var type = metadata.GetFieldDeclaringType (rid); if (type == null) @@ -2245,7 +2271,7 @@ public MethodDefinition GetMethodDefinition (uint rid) return LookupMethod (rid); } - MethodDefinition LookupMethod (uint rid) + private MethodDefinition LookupMethod (uint rid) { var type = metadata.GetMethodDeclaringType (rid); if (type == null) @@ -2256,12 +2282,12 @@ MethodDefinition LookupMethod (uint rid) return metadata.GetMethodDefinition (rid); } - MethodSpecification GetMethodSpecification (uint rid) + private MethodSpecification GetMethodSpecification (uint rid) { if (!MoveTo (Table.MethodSpec, rid)) return null; - var element_method = (MethodReference) LookupToken ( + var element_method = (MethodReference)LookupToken ( ReadMetadataToken (CodedIndex.MethodDefOrRef)); var signature = ReadBlobIndex (); @@ -2270,7 +2296,7 @@ MethodSpecification GetMethodSpecification (uint rid) return method_spec; } - MethodSpecification ReadMethodSpecSignature (uint signature, MethodReference method) + private MethodSpecification ReadMethodSpecSignature (uint signature, MethodReference method) { var reader = ReadSignature (signature); const byte methodspec_sig = 0x0a; @@ -2282,14 +2308,14 @@ MethodSpecification ReadMethodSpecSignature (uint signature, MethodReference met var arity = reader.ReadCompressedUInt32 (); - var instance = new GenericInstanceMethod (method, (int) arity); + var instance = new GenericInstanceMethod (method, (int)arity); reader.ReadGenericInstanceSignature (method, instance, arity); return instance; } - MemberReference GetMemberReference (uint rid) + private MemberReference GetMemberReference (uint rid) { InitializeMemberReferences (); @@ -2303,7 +2329,7 @@ MemberReference GetMemberReference (uint rid) return member; } - MemberReference ReadMemberReference (uint rid) + private MemberReference ReadMemberReference (uint rid) { if (!MoveTo (Table.MemberRef, rid)) return null; @@ -2320,9 +2346,11 @@ MemberReference ReadMemberReference (uint rid) case TokenType.TypeSpec: member = ReadTypeMemberReference (token, name, signature); break; + case TokenType.Method: member = ReadMethodMemberReference (token, name, signature); break; + default: throw new NotSupportedException (); } @@ -2331,7 +2359,7 @@ MemberReference ReadMemberReference (uint rid) return member; } - MemberReference ReadTypeMemberReference (MetadataToken type, string name, uint signature) + private MemberReference ReadTypeMemberReference (MetadataToken type, string name, uint signature) { var declaring_type = GetTypeDefOrRef (type); @@ -2344,7 +2372,7 @@ MemberReference ReadTypeMemberReference (MetadataToken type, string name, uint s return member; } - MemberReference ReadMemberReferenceSignature (uint signature, TypeReference declaring_type) + private MemberReference ReadMemberReferenceSignature (uint signature, TypeReference declaring_type) { var reader = ReadSignature (signature); const byte field_sig = 0x6; @@ -2363,7 +2391,7 @@ MemberReference ReadMemberReferenceSignature (uint signature, TypeReference decl } } - MemberReference ReadMethodMemberReference (MetadataToken token, string name, uint signature) + private MemberReference ReadMethodMemberReference (MetadataToken token, string name, uint signature) { var method = GetMethodDefinition (token.RID); @@ -2375,7 +2403,7 @@ MemberReference ReadMethodMemberReference (MetadataToken token, string name, uin return member; } - void InitializeMemberReferences () + private void InitializeMemberReferences () { if (metadata.MemberReferences != null) return; @@ -2404,7 +2432,7 @@ public IEnumerable GetMemberReferences () return member_references; } - void InitializeConstants () + private void InitializeConstants () { if (metadata.Constants != null) return; @@ -2414,7 +2442,7 @@ void InitializeConstants () var constants = metadata.Constants = new Dictionary> (length); for (uint i = 1; i <= length; i++) { - var type = (ElementType) ReadUInt16 (); + var type = (ElementType)ReadUInt16 (); var owner = ReadMetadataToken (CodedIndex.HasConstant); var signature = ReadBlobIndex (); @@ -2449,20 +2477,22 @@ public object ReadConstant (IConstantProvider owner) return ReadConstantValue (row.Col1, row.Col2); } - object ReadConstantValue (ElementType etype, uint signature) + private object ReadConstantValue (ElementType etype, uint signature) { switch (etype) { case ElementType.Class: case ElementType.Object: return null; + case ElementType.String: return ReadConstantString (signature); + default: return ReadConstantPrimitive (etype, signature); } } - string ReadConstantString (uint signature) + private string ReadConstantString (uint signature) { byte [] blob; int index, count; @@ -2477,7 +2507,7 @@ string ReadConstantString (uint signature) return Encoding.Unicode.GetString (blob, index, count); } - object ReadConstantPrimitive (ElementType type, uint signature) + private object ReadConstantPrimitive (ElementType type, uint signature) { var reader = ReadSignature (signature); return reader.ReadConstantSignature (type); @@ -2494,7 +2524,7 @@ internal void InitializeCustomAttributes () ReadMetadataToken (CodedIndex.CustomAttributeType); ReadBlobIndex (); return next; - }); + }); } public bool HasCustomAttributes (ICustomAttributeProvider owner) @@ -2530,7 +2560,7 @@ public Collection ReadCustomAttributes (ICustomAttributeProvide return custom_attributes; } - void ReadCustomAttributeRange (Range range, Collection custom_attributes) + private void ReadCustomAttributeRange (Range range, Collection custom_attributes) { if (!MoveTo (Table.CustomAttribute, range.Start)) return; @@ -2538,7 +2568,7 @@ void ReadCustomAttributeRange (Range range, Collection custom_a for (var i = 0; i < range.Length; i++) { ReadMetadataToken (CodedIndex.HasCustomAttribute); - var constructor = (MethodReference) LookupToken ( + var constructor = (MethodReference)LookupToken ( ReadMetadataToken (CodedIndex.CustomAttributeType)); var signature = ReadBlobIndex (); @@ -2547,13 +2577,13 @@ void ReadCustomAttributeRange (Range range, Collection custom_a } } - static int RangesSize (Range [] ranges) + private static int RangesSize (Range [] ranges) { uint size = 0; for (int i = 0; i < ranges.Length; i++) size += ranges [i].Length; - return (int) size; + return (int)size; } public IEnumerable GetCustomAttributes () @@ -2561,7 +2591,7 @@ public IEnumerable GetCustomAttributes () InitializeTypeDefinitions (); var length = image.TableHeap [Table.CustomAttribute].Length; - var custom_attributes = new Collection ((int) length); + var custom_attributes = new Collection ((int)length); ReadCustomAttributeRange (new Range (1, length), custom_attributes); return custom_attributes; @@ -2597,7 +2627,7 @@ public void ReadCustomAttributeSignature (CustomAttribute attribute) reader.ReadCustomAttributeNamedArguments (named, ref attribute.fields, ref attribute.properties); } - void InitializeMarshalInfos () + private void InitializeMarshalInfos () { if (metadata.FieldMarshals != null) return; @@ -2638,7 +2668,7 @@ public MarshalInfo ReadMarshalInfo (IMarshalInfoProvider owner) return reader.ReadMarshalInfo (); } - void InitializeSecurityDeclarations () + private void InitializeSecurityDeclarations () { if (metadata.SecurityDeclarations != null) return; @@ -2649,7 +2679,7 @@ void InitializeSecurityDeclarations () var next = ReadMetadataToken (CodedIndex.HasDeclSecurity); ReadBlobIndex (); return next; - }); + }); } public bool HasSecurityDeclarations (ISecurityDeclarationProvider owner) @@ -2681,13 +2711,13 @@ public Collection ReadSecurityDeclarations (ISecurityDeclar return security_declarations; } - void ReadSecurityDeclarationRange (Range range, Collection security_declarations) + private void ReadSecurityDeclarationRange (Range range, Collection security_declarations) { if (!MoveTo (Table.DeclSecurity, range.Start)) return; for (int i = 0; i < range.Length; i++) { - var action = (SecurityAction) ReadUInt16 (); + var action = (SecurityAction)ReadUInt16 (); ReadMetadataToken (CodedIndex.HasDeclSecurity); var signature = ReadBlobIndex (); @@ -2712,7 +2742,7 @@ public void ReadSecurityDeclarationSignature (SecurityDeclaration declaration) reader.position++; var count = reader.ReadCompressedUInt32 (); - var attributes = new Collection ((int) count); + var attributes = new Collection ((int)count); for (int i = 0; i < count; i++) attributes.Add (reader.ReadSecurityAttribute ()); @@ -2720,7 +2750,7 @@ public void ReadSecurityDeclarationSignature (SecurityDeclaration declaration) declaration.security_attributes = attributes; } - void ReadXmlSecurityDeclaration (uint signature, SecurityDeclaration declaration) + private void ReadXmlSecurityDeclaration (uint signature, SecurityDeclaration declaration) { var attributes = new Collection (1); @@ -2749,7 +2779,7 @@ public Collection ReadExportedTypes () var exported_types = new Collection (length); for (int i = 1; i <= length; i++) { - var attributes = (TypeAttributes) ReadUInt32 (); + var attributes = (TypeAttributes)ReadUInt32 (); var identifier = ReadUInt32 (); var name = ReadString (); var @namespace = ReadString (); @@ -2763,15 +2793,16 @@ public Collection ReadExportedTypes () case TokenType.File: scope = GetExportedTypeScope (implementation); break; + case TokenType.ExportedType: // FIXME: if the table is not properly sorted - declaring_type = exported_types [(int) implementation.RID - 1]; + declaring_type = exported_types [(int)implementation.RID - 1]; break; } var exported_type = new ExportedType (@namespace, name, module, scope) { Attributes = attributes, - Identifier = (int) identifier, + Identifier = (int)identifier, DeclaringType = declaring_type, }; exported_type.token = new MetadataToken (TokenType.ExportedType, i); @@ -2782,7 +2813,7 @@ public Collection ReadExportedTypes () return exported_types; } - IMetadataScope GetExportedTypeScope (MetadataToken token) + private IMetadataScope GetExportedTypeScope (MetadataToken token) { var position = this.position; IMetadataScope scope; @@ -2792,10 +2823,12 @@ IMetadataScope GetExportedTypeScope (MetadataToken token) InitializeAssemblyReferences (); scope = metadata.GetAssemblyNameReference (token.RID); break; + case TokenType.File: InitializeModuleReferences (); scope = GetModuleReferenceFromFile (token); break; + default: throw new NotSupportedException (); } @@ -2804,7 +2837,7 @@ IMetadataScope GetExportedTypeScope (MetadataToken token) return scope; } - ModuleReference GetModuleReferenceFromFile (MetadataToken token) + private ModuleReference GetModuleReferenceFromFile (MetadataToken token) { if (!MoveTo (Table.File, token.RID)) return null; @@ -2825,7 +2858,7 @@ ModuleReference GetModuleReferenceFromFile (MetadataToken token) return reference; } - void InitializeDocuments () + private void InitializeDocuments () { if (metadata.Documents != null) return; @@ -2880,7 +2913,7 @@ public Document GetDocument (uint rid) return document; } - void InitializeLocalScopes () + private void InitializeLocalScopes () { if (metadata.LocalScopes != null) return; @@ -2929,7 +2962,7 @@ public ScopeDebugInformation ReadScope (MethodDefinition method) return method_scope; } - static bool AddScope (Collection scopes, ScopeDebugInformation scope) + private static bool AddScope (Collection scopes, ScopeDebugInformation scope) { if (scopes.IsNullOrEmpty ()) return false; @@ -2947,12 +2980,11 @@ static bool AddScope (Collection scopes, ScopeDebugInform return false; } - ScopeDebugInformation ReadLocalScope (Row record) + private ScopeDebugInformation ReadLocalScope (Row record) { - var scope = new ScopeDebugInformation - { - start = new InstructionOffset ((int) record.Col4), - end = new InstructionOffset ((int) (record.Col4 + record.Col5)), + var scope = new ScopeDebugInformation { + start = new InstructionOffset ((int)record.Col4), + end = new InstructionOffset ((int)(record.Col4 + record.Col5)), token = new MetadataToken (TokenType.LocalScope, record.Col6), }; @@ -2960,7 +2992,7 @@ ScopeDebugInformation ReadLocalScope (Row scope.import = metadata.GetImportScope (record.Col1); if (record.Col2.Length > 0) { - scope.variables = new Collection ((int) record.Col2.Length); + scope.variables = new Collection ((int)record.Col2.Length); for (uint i = 0; i < record.Col2.Length; i++) { var variable = ReadLocalVariable (record.Col2.Start + i); if (variable != null) @@ -2969,7 +3001,7 @@ ScopeDebugInformation ReadLocalScope (Row } if (record.Col3.Length > 0) { - scope.constants = new Collection ((int) record.Col3.Length); + scope.constants = new Collection ((int)record.Col3.Length); for (uint i = 0; i < record.Col3.Length; i++) { var constant = ReadLocalConstant (record.Col3.Start + i); if (constant != null) @@ -2980,12 +3012,12 @@ ScopeDebugInformation ReadLocalScope (Row return scope; } - VariableDebugInformation ReadLocalVariable (uint rid) + private VariableDebugInformation ReadLocalVariable (uint rid) { if (!MoveTo (Table.LocalVariable, rid)) return null; - var attributes = (VariableAttributes) ReadUInt16 (); + var attributes = (VariableAttributes)ReadUInt16 (); var index = ReadUInt16 (); var name = ReadString (); @@ -2994,7 +3026,7 @@ VariableDebugInformation ReadLocalVariable (uint rid) return variable; } - ConstantDebugInformation ReadLocalConstant (uint rid) + private ConstantDebugInformation ReadLocalConstant (uint rid) { if (!MoveTo (Table.LocalConstant, rid)) return null; @@ -3008,15 +3040,15 @@ ConstantDebugInformation ReadLocalConstant (uint rid) if (!signature.CanReadMore ()) value = ""; else if (signature.buffer [signature.position] != 0xff) { - var bytes = signature.ReadBytes ((int) (signature.sig_length - (signature.position - signature.start))); + var bytes = signature.ReadBytes ((int)(signature.sig_length - (signature.position - signature.start))); value = Encoding.Unicode.GetString (bytes, 0, bytes.Length); } else value = null; } else if (type.IsTypeOf ("System", "Decimal")) { var b = signature.ReadByte (); - value = new decimal (signature.ReadInt32 (), signature.ReadInt32 (), signature.ReadInt32 (), (b & 0x80) != 0, (byte) (b & 0x7f)); + value = new decimal (signature.ReadInt32 (), signature.ReadInt32 (), signature.ReadInt32 (), (b & 0x80) != 0, (byte)(b & 0x7f)); } else if (type.IsTypeOf ("System", "DateTime")) { - value = new DateTime (signature.ReadInt64()); + value = new DateTime (signature.ReadInt64 ()); } else if (type.etype == ElementType.Object || type.etype == ElementType.None || type.etype == ElementType.Class || type.etype == ElementType.Array || type.etype == ElementType.GenericInst) { value = null; } else @@ -3027,7 +3059,7 @@ ConstantDebugInformation ReadLocalConstant (uint rid) return constant; } - void InitializeImportScopes () + private void InitializeImportScopes () { if (metadata.ImportScopes != null) return; @@ -3066,12 +3098,12 @@ public string ReadUTF8StringBlob (uint signature) return ReadStringBlob (signature, Encoding.UTF8); } - string ReadUnicodeStringBlob (uint signature) + private string ReadUnicodeStringBlob (uint signature) { return ReadStringBlob (signature, Encoding.Unicode); } - string ReadStringBlob (uint signature, Encoding encoding) + private string ReadStringBlob (uint signature, Encoding encoding) { byte [] blob; int index, count; @@ -3083,45 +3115,53 @@ string ReadStringBlob (uint signature, Encoding encoding) return encoding.GetString (blob, index, count); } - ImportTarget ReadImportTarget (SignatureReader signature) + private ImportTarget ReadImportTarget (SignatureReader signature) { AssemblyNameReference reference = null; string @namespace = null; string alias = null; TypeReference type = null; - var kind = (ImportTargetKind) signature.ReadCompressedUInt32 (); + var kind = (ImportTargetKind)signature.ReadCompressedUInt32 (); switch (kind) { case ImportTargetKind.ImportNamespace: @namespace = ReadUTF8StringBlob (signature.ReadCompressedUInt32 ()); break; + case ImportTargetKind.ImportNamespaceInAssembly: reference = metadata.GetAssemblyNameReference (signature.ReadCompressedUInt32 ()); @namespace = ReadUTF8StringBlob (signature.ReadCompressedUInt32 ()); break; + case ImportTargetKind.ImportType: type = signature.ReadTypeToken (); break; + case ImportTargetKind.ImportXmlNamespaceWithAlias: alias = ReadUTF8StringBlob (signature.ReadCompressedUInt32 ()); @namespace = ReadUTF8StringBlob (signature.ReadCompressedUInt32 ()); break; + case ImportTargetKind.ImportAlias: alias = ReadUTF8StringBlob (signature.ReadCompressedUInt32 ()); break; + case ImportTargetKind.DefineAssemblyAlias: alias = ReadUTF8StringBlob (signature.ReadCompressedUInt32 ()); reference = metadata.GetAssemblyNameReference (signature.ReadCompressedUInt32 ()); break; + case ImportTargetKind.DefineNamespaceAlias: alias = ReadUTF8StringBlob (signature.ReadCompressedUInt32 ()); @namespace = ReadUTF8StringBlob (signature.ReadCompressedUInt32 ()); break; + case ImportTargetKind.DefineNamespaceInAssemblyAlias: alias = ReadUTF8StringBlob (signature.ReadCompressedUInt32 ()); reference = metadata.GetAssemblyNameReference (signature.ReadCompressedUInt32 ()); @namespace = ReadUTF8StringBlob (signature.ReadCompressedUInt32 ()); break; + case ImportTargetKind.DefineTypeAlias: alias = ReadUTF8StringBlob (signature.ReadCompressedUInt32 ()); type = signature.ReadTypeToken (); @@ -3136,7 +3176,7 @@ ImportTarget ReadImportTarget (SignatureReader signature) }; } - void InitializeStateMachineMethods () + private void InitializeStateMachineMethods () { if (metadata.StateMachineMethods != null) return; @@ -3160,7 +3200,7 @@ public MethodDefinition ReadStateMachineKickoffMethod (MethodDefinition method) return GetMethodDefinition (rid); } - void InitializeCustomDebugInformations () + private void InitializeCustomDebugInformations () { if (metadata.CustomDebugInformations != null) return; @@ -3241,7 +3281,7 @@ public Collection GetCustomDebugInformation (ICustomDebu public byte [] ReadRawEmbeddedSourceDebugInformation (uint index) { var signature = ReadSignature (index); - return signature.ReadBytes ((int) signature.sig_length); + return signature.ReadBytes ((int)signature.sig_length); } public Row ReadEmbeddedSourceDebugInformation (uint index) @@ -3251,9 +3291,9 @@ public Row ReadEmbeddedSourceDebugInformation (uint index) var length = signature.sig_length - 4; if (format == 0) { - return new Row (signature.ReadBytes ((int) length), false); + return new Row (signature.ReadBytes ((int)length), false); } else if (format > 0) { - var compressed_stream = new MemoryStream (signature.ReadBytes ((int) length)); + var compressed_stream = new MemoryStream (signature.ReadBytes ((int)length)); var decompressed_document = new byte [format]; // if positive, format is the decompressed length of the document var decompressed_stream = new MemoryStream (decompressed_document); @@ -3266,12 +3306,11 @@ public Row ReadEmbeddedSourceDebugInformation (uint index) } } - sealed class SignatureReader : ByteBuffer { + internal sealed class SignatureReader : ByteBuffer { + private readonly MetadataReader reader; + internal readonly uint start, sig_length; - readonly MetadataReader reader; - readonly internal uint start, sig_length; - - TypeSystem TypeSystem { + private TypeSystem TypeSystem { get { return reader.module.TypeSystem; } } @@ -3279,20 +3318,20 @@ public SignatureReader (uint blob, MetadataReader reader) : base (reader.image.BlobHeap.data) { this.reader = reader; - this.position = (int) blob; - this.sig_length = ReadCompressedUInt32(); - this.start = (uint) this.position; + this.position = (int)blob; + this.sig_length = ReadCompressedUInt32 (); + this.start = (uint)this.position; } - MetadataToken ReadTypeTokenSignature () + private MetadataToken ReadTypeTokenSignature () { return CodedIndex.TypeDefOrRef.GetMetadataToken (ReadCompressedUInt32 ()); } - GenericParameter GetGenericParameter (GenericParameterType type, uint var) + private GenericParameter GetGenericParameter (GenericParameterType type, uint var) { var context = reader.context; - int index = (int) var; + int index = (int)var; if (context == null) return GetUnboundGenericParameter (type, index); @@ -3303,9 +3342,11 @@ GenericParameter GetGenericParameter (GenericParameterType type, uint var) case GenericParameterType.Type: provider = context.Type; break; + case GenericParameterType.Method: provider = context.Method; break; + default: throw new NotSupportedException (); } @@ -3319,12 +3360,12 @@ GenericParameter GetGenericParameter (GenericParameterType type, uint var) return provider.GenericParameters [index]; } - GenericParameter GetUnboundGenericParameter (GenericParameterType type, int index) + private GenericParameter GetUnboundGenericParameter (GenericParameterType type, int index) { return new GenericParameter (index, type, reader.module); } - static void CheckGenericContext (IGenericParameterProvider owner, int index) + private static void CheckGenericContext (IGenericParameterProvider owner, int index) { var owner_parameters = owner.GenericParameters; @@ -3335,7 +3376,7 @@ static void CheckGenericContext (IGenericParameterProvider owner, int index) public void ReadGenericInstanceSignature (IGenericParameterProvider provider, IGenericInstance instance, uint arity) { if (!provider.IsDefinition) - CheckGenericContext (provider, (int) arity - 1); + CheckGenericContext (provider, (int)arity - 1); var instance_arguments = instance.GenericArguments; @@ -3343,7 +3384,7 @@ public void ReadGenericInstanceSignature (IGenericParameterProvider provider, IG instance_arguments.Add (ReadTypeSignature ()); } - ArrayType ReadArrayTypeSignature () + private ArrayType ReadArrayTypeSignature () { var array = new ArrayType (ReadTypeSignature ()); @@ -3366,7 +3407,7 @@ ArrayType ReadArrayTypeSignature () lower = low_bounds [i]; if (i < sizes.Length) - upper = lower + (int) sizes [i] - 1; + upper = lower + (int)sizes [i] - 1; array.Dimensions.Add (new ArrayDimension (lower, upper)); } @@ -3374,14 +3415,14 @@ ArrayType ReadArrayTypeSignature () return array; } - TypeReference GetTypeDefOrRef (MetadataToken token) + private TypeReference GetTypeDefOrRef (MetadataToken token) { return reader.GetTypeDefOrRef (token); } public TypeReference ReadTypeSignature () { - return ReadTypeSignature ((ElementType) ReadByte ()); + return ReadTypeSignature ((ElementType)ReadByte ()); } public TypeReference ReadTypeToken () @@ -3389,59 +3430,70 @@ public TypeReference ReadTypeToken () return GetTypeDefOrRef (ReadTypeTokenSignature ()); } - TypeReference ReadTypeSignature (ElementType etype) + private TypeReference ReadTypeSignature (ElementType etype) { switch (etype) { case ElementType.ValueType: { - var value_type = GetTypeDefOrRef (ReadTypeTokenSignature ()); - value_type.KnownValueType (); - return value_type; - } + var value_type = GetTypeDefOrRef (ReadTypeTokenSignature ()); + value_type.KnownValueType (); + return value_type; + } case ElementType.Class: return GetTypeDefOrRef (ReadTypeTokenSignature ()); + case ElementType.Ptr: return new PointerType (ReadTypeSignature ()); + case ElementType.FnPtr: { - var fptr = new FunctionPointerType (); - ReadMethodSignature (fptr); - return fptr; - } + var fptr = new FunctionPointerType (); + ReadMethodSignature (fptr); + return fptr; + } case ElementType.ByRef: return new ByReferenceType (ReadTypeSignature ()); + case ElementType.Pinned: return new PinnedType (ReadTypeSignature ()); + case ElementType.SzArray: return new ArrayType (ReadTypeSignature ()); + case ElementType.Array: return ReadArrayTypeSignature (); + case ElementType.CModOpt: return new OptionalModifierType ( GetTypeDefOrRef (ReadTypeTokenSignature ()), ReadTypeSignature ()); + case ElementType.CModReqD: return new RequiredModifierType ( GetTypeDefOrRef (ReadTypeTokenSignature ()), ReadTypeSignature ()); + case ElementType.Sentinel: return new SentinelType (ReadTypeSignature ()); + case ElementType.Var: return GetGenericParameter (GenericParameterType.Type, ReadCompressedUInt32 ()); + case ElementType.MVar: return GetGenericParameter (GenericParameterType.Method, ReadCompressedUInt32 ()); + case ElementType.GenericInst: { - var is_value_type = ReadByte () == (byte) ElementType.ValueType; - var element_type = GetTypeDefOrRef (ReadTypeTokenSignature ()); + var is_value_type = ReadByte () == (byte)ElementType.ValueType; + var element_type = GetTypeDefOrRef (ReadTypeTokenSignature ()); - var arity = ReadCompressedUInt32 (); - var generic_instance = new GenericInstanceType (element_type, (int) arity); + var arity = ReadCompressedUInt32 (); + var generic_instance = new GenericInstanceType (element_type, (int)arity); - ReadGenericInstanceSignature (element_type, generic_instance, arity); + ReadGenericInstanceSignature (element_type, generic_instance, arity); - if (is_value_type) { - generic_instance.KnownValueType (); - element_type.GetElementType ().KnownValueType (); - } + if (is_value_type) { + generic_instance.KnownValueType (); + element_type.GetElementType ().KnownValueType (); + } - return generic_instance; - } + return generic_instance; + } case ElementType.Object: return TypeSystem.Object; case ElementType.Void: return TypeSystem.Void; case ElementType.TypedByRef: return TypeSystem.TypedReference; @@ -3460,15 +3512,15 @@ public void ReadMethodSignature (IMethodSignature method) if ((calling_convention & has_this) != 0) { method.HasThis = true; - calling_convention = (byte) (calling_convention & ~has_this); + calling_convention = (byte)(calling_convention & ~has_this); } if ((calling_convention & explicit_this) != 0) { method.ExplicitThis = true; - calling_convention = (byte) (calling_convention & ~explicit_this); + calling_convention = (byte)(calling_convention & ~explicit_this); } - method.CallingConvention = (MethodCallingConvention) calling_convention; + method.CallingConvention = (MethodCallingConvention)calling_convention; var generic_context = method as MethodReference; if (generic_context != null && !generic_context.DeclaringType.IsArray) @@ -3478,7 +3530,7 @@ public void ReadMethodSignature (IMethodSignature method) var arity = ReadCompressedUInt32 (); if (generic_context != null && !generic_context.IsDefinition) - CheckGenericContext (generic_context, (int) arity -1 ); + CheckGenericContext (generic_context, (int)arity - 1); } var param_count = ReadCompressedUInt32 (); @@ -3492,7 +3544,7 @@ public void ReadMethodSignature (IMethodSignature method) var method_ref = method as MethodReference; if (method_ref != null) - parameters = method_ref.parameters = new ParameterDefinitionCollection (method, (int) param_count); + parameters = method_ref.parameters = new ParameterDefinitionCollection (method, (int)param_count); else parameters = method.Parameters; @@ -3518,10 +3570,10 @@ public void ReadCustomAttributeConstructorArguments (CustomAttribute attribute, ReadCustomAttributeFixedArgument (parameters [i].ParameterType)); } - CustomAttributeArgument ReadCustomAttributeFixedArgument (TypeReference type) + private CustomAttributeArgument ReadCustomAttributeFixedArgument (TypeReference type) { if (type.IsArray) - return ReadCustomAttributeFixedArrayArgument ((ArrayType) type); + return ReadCustomAttributeFixedArrayArgument ((ArrayType)type); return ReadCustomAttributeElement (type); } @@ -3535,7 +3587,7 @@ public void ReadCustomAttributeNamedArguments (ushort count, ref Collection fields, ref Collection properties) + private void ReadCustomAttributeNamedArgument (ref Collection fields, ref Collection properties) { var kind = ReadByte (); var type = ReadCustomAttributeFieldOrPropType (); @@ -3546,9 +3598,11 @@ void ReadCustomAttributeNamedArgument (ref Collection GetCustomAttributeNamedArgumentCollection (ref Collection collection) + private static Collection GetCustomAttributeNamedArgumentCollection (ref Collection collection) { if (collection != null) return collection; @@ -3564,7 +3618,7 @@ static Collection GetCustomAttributeNamedArgumentC return collection = new Collection (); } - CustomAttributeArgument ReadCustomAttributeFixedArrayArgument (ArrayType type) + private CustomAttributeArgument ReadCustomAttributeFixedArrayArgument (ArrayType type) { var length = ReadUInt32 (); @@ -3583,10 +3637,10 @@ CustomAttributeArgument ReadCustomAttributeFixedArrayArgument (ArrayType type) return new CustomAttributeArgument (type, arguments); } - CustomAttributeArgument ReadCustomAttributeElement (TypeReference type) + private CustomAttributeArgument ReadCustomAttributeElement (TypeReference type) { if (type.IsArray) - return ReadCustomAttributeFixedArrayArgument ((ArrayType) type); + return ReadCustomAttributeFixedArrayArgument ((ArrayType)type); return new CustomAttributeArgument ( type, @@ -3595,7 +3649,7 @@ CustomAttributeArgument ReadCustomAttributeElement (TypeReference type) : ReadCustomAttributeElementValue (type)); } - object ReadCustomAttributeElementValue (TypeReference type) + private object ReadCustomAttributeElementValue (TypeReference type) { var etype = type.etype; if (etype == ElementType.GenericInst) { @@ -3608,95 +3662,126 @@ object ReadCustomAttributeElementValue (TypeReference type) switch (etype) { case ElementType.String: return ReadUTF8String (); + case ElementType.None: if (type.IsTypeOf ("System", "Type")) return ReadTypeReference (); return ReadCustomAttributeEnum (type); + default: return ReadPrimitiveValue (etype); } } - object ReadPrimitiveValue (ElementType type) + private object ReadPrimitiveValue (ElementType type) { switch (type) { case ElementType.Boolean: return ReadByte () == 1; + case ElementType.I1: - return (sbyte) ReadByte (); + return (sbyte)ReadByte (); + case ElementType.U1: return ReadByte (); + case ElementType.Char: - return (char) ReadUInt16 (); + return (char)ReadUInt16 (); + case ElementType.I2: return ReadInt16 (); + case ElementType.U2: return ReadUInt16 (); + case ElementType.I4: return ReadInt32 (); + case ElementType.U4: return ReadUInt32 (); + case ElementType.I8: return ReadInt64 (); + case ElementType.U8: return ReadUInt64 (); + case ElementType.R4: return ReadSingle (); + case ElementType.R8: return ReadDouble (); + default: throw new NotImplementedException (type.ToString ()); } } - TypeReference GetPrimitiveType (ElementType etype) + private TypeReference GetPrimitiveType (ElementType etype) { switch (etype) { case ElementType.Boolean: return TypeSystem.Boolean; + case ElementType.Char: return TypeSystem.Char; + case ElementType.I1: return TypeSystem.SByte; + case ElementType.U1: return TypeSystem.Byte; + case ElementType.I2: return TypeSystem.Int16; + case ElementType.U2: return TypeSystem.UInt16; + case ElementType.I4: return TypeSystem.Int32; + case ElementType.U4: return TypeSystem.UInt32; + case ElementType.I8: return TypeSystem.Int64; + case ElementType.U8: return TypeSystem.UInt64; + case ElementType.R4: return TypeSystem.Single; + case ElementType.R8: return TypeSystem.Double; + case ElementType.String: return TypeSystem.String; + default: throw new NotImplementedException (etype.ToString ()); } } - TypeReference ReadCustomAttributeFieldOrPropType () + private TypeReference ReadCustomAttributeFieldOrPropType () { - var etype = (ElementType) ReadByte (); + var etype = (ElementType)ReadByte (); switch (etype) { case ElementType.Boxed: return TypeSystem.Object; + case ElementType.SzArray: return new ArrayType (ReadCustomAttributeFieldOrPropType ()); + case ElementType.Enum: return ReadTypeReference (); + case ElementType.Type: return TypeSystem.LookupType ("System", "Type"); + default: return GetPrimitiveType (etype); } @@ -3707,7 +3792,7 @@ public TypeReference ReadTypeReference () return TypeParser.ParseType (reader.module, ReadUTF8String ()); } - object ReadCustomAttributeEnum (TypeReference enum_type) + private object ReadCustomAttributeEnum (TypeReference enum_type) { var type = enum_type.CheckedResolve (); if (!type.IsEnum) @@ -3723,7 +3808,7 @@ public SecurityAttribute ReadSecurityAttribute () ReadCompressedUInt32 (); ReadCustomAttributeNamedArguments ( - (ushort) ReadCompressedUInt32 (), + (ushort)ReadCompressedUInt32 (), ref attribute.fields, ref attribute.properties); @@ -3735,69 +3820,69 @@ public MarshalInfo ReadMarshalInfo () var native = ReadNativeType (); switch (native) { case NativeType.Array: { - var array = new ArrayMarshalInfo (); - if (CanReadMore ()) - array.element_type = ReadNativeType (); - if (CanReadMore ()) - array.size_parameter_index = (int) ReadCompressedUInt32 (); - if (CanReadMore ()) - array.size = (int) ReadCompressedUInt32 (); - if (CanReadMore ()) - array.size_parameter_multiplier = (int) ReadCompressedUInt32 (); - return array; - } + var array = new ArrayMarshalInfo (); + if (CanReadMore ()) + array.element_type = ReadNativeType (); + if (CanReadMore ()) + array.size_parameter_index = (int)ReadCompressedUInt32 (); + if (CanReadMore ()) + array.size = (int)ReadCompressedUInt32 (); + if (CanReadMore ()) + array.size_parameter_multiplier = (int)ReadCompressedUInt32 (); + return array; + } case NativeType.SafeArray: { - var array = new SafeArrayMarshalInfo (); - if (CanReadMore ()) - array.element_type = ReadVariantType (); - return array; - } + var array = new SafeArrayMarshalInfo (); + if (CanReadMore ()) + array.element_type = ReadVariantType (); + return array; + } case NativeType.FixedArray: { - var array = new FixedArrayMarshalInfo (); - if (CanReadMore ()) - array.size = (int) ReadCompressedUInt32 (); - if (CanReadMore ()) - array.element_type = ReadNativeType (); - return array; - } + var array = new FixedArrayMarshalInfo (); + if (CanReadMore ()) + array.size = (int)ReadCompressedUInt32 (); + if (CanReadMore ()) + array.element_type = ReadNativeType (); + return array; + } case NativeType.FixedSysString: { - var sys_string = new FixedSysStringMarshalInfo (); - if (CanReadMore ()) - sys_string.size = (int) ReadCompressedUInt32 (); - return sys_string; - } + var sys_string = new FixedSysStringMarshalInfo (); + if (CanReadMore ()) + sys_string.size = (int)ReadCompressedUInt32 (); + return sys_string; + } case NativeType.CustomMarshaler: { - var marshaler = new CustomMarshalInfo (); - var guid_value = ReadUTF8String (); - marshaler.guid = !string.IsNullOrEmpty (guid_value) ? new Guid (guid_value) : Guid.Empty; - marshaler.unmanaged_type = ReadUTF8String (); - marshaler.managed_type = ReadTypeReference (); - marshaler.cookie = ReadUTF8String (); - return marshaler; - } + var marshaler = new CustomMarshalInfo (); + var guid_value = ReadUTF8String (); + marshaler.guid = !string.IsNullOrEmpty (guid_value) ? new Guid (guid_value) : Guid.Empty; + marshaler.unmanaged_type = ReadUTF8String (); + marshaler.managed_type = ReadTypeReference (); + marshaler.cookie = ReadUTF8String (); + return marshaler; + } default: return new MarshalInfo (native); } } - NativeType ReadNativeType () + private NativeType ReadNativeType () { - return (NativeType) ReadByte (); + return (NativeType)ReadByte (); } - VariantType ReadVariantType () + private VariantType ReadVariantType () { - return (VariantType) ReadByte (); + return (VariantType)ReadByte (); } - string ReadUTF8String () + private string ReadUTF8String () { if (buffer [position] == 0xff) { position++; return null; } - var length = (int) ReadCompressedUInt32 (); + var length = (int)ReadCompressedUInt32 (); if (length == 0) return string.Empty; @@ -3812,7 +3897,7 @@ string ReadUTF8String () public string ReadDocumentName () { - var separator = (char) buffer [position]; + var separator = (char)buffer [position]; position++; var builder = new StringBuilder (); @@ -3846,9 +3931,9 @@ public Collection ReadSequencePoints (Document document) var bytes_remaining_for_sequencepoints = sig_length - (position - start); var estimated_sequencepoint_amount = (int)bytes_remaining_for_sequencepoints / 5; var sequence_points = new Collection (estimated_sequencepoint_amount); - + for (var i = 0; CanReadMore (); i++) { - var delta_il = (int) ReadCompressedUInt32 (); + var delta_il = (int)ReadCompressedUInt32 (); if (i > 0 && delta_il == 0) { document = reader.GetDocument (ReadCompressedUInt32 ()); continue; @@ -3856,9 +3941,9 @@ public Collection ReadSequencePoints (Document document) offset += delta_il; - var delta_lines = (int) ReadCompressedUInt32 (); + var delta_lines = (int)ReadCompressedUInt32 (); var delta_columns = delta_lines == 0 - ? (int) ReadCompressedUInt32 () + ? (int)ReadCompressedUInt32 () : ReadCompressedInt32 (); if (delta_lines == 0 && delta_columns == 0) { @@ -3872,8 +3957,8 @@ public Collection ReadSequencePoints (Document document) } if (first_non_hidden) { - start_line = (int) ReadCompressedUInt32 (); - start_column = (int) ReadCompressedUInt32 (); + start_line = (int)ReadCompressedUInt32 (); + start_column = (int)ReadCompressedUInt32 (); } else { start_line += ReadCompressedInt32 (); start_column += ReadCompressedInt32 (); @@ -3896,4 +3981,4 @@ public bool CanReadMore () return (position - start) < sig_length; } } -} +} \ No newline at end of file diff --git a/Mono.Cecil/BaseAssemblyResolver.cs b/Mono.Cecil/BaseAssemblyResolver.cs index fd9e5c968..1029039c4 100644 --- a/Mono.Cecil/BaseAssemblyResolver.cs +++ b/Mono.Cecil/BaseAssemblyResolver.cs @@ -21,8 +21,7 @@ namespace Mono.Cecil { public delegate AssemblyDefinition AssemblyResolveEventHandler (object sender, AssemblyNameReference reference); public sealed class AssemblyResolveEventArgs : EventArgs { - - readonly AssemblyNameReference reference; + private readonly AssemblyNameReference reference; public AssemblyNameReference AssemblyReference { get { return reference; } @@ -37,9 +36,9 @@ public AssemblyResolveEventArgs (AssemblyNameReference reference) #if !NET_CORE [Serializable] #endif - public sealed class AssemblyResolutionException : FileNotFoundException { - readonly AssemblyNameReference reference; + public sealed class AssemblyResolutionException : FileNotFoundException { + private readonly AssemblyNameReference reference; public AssemblyNameReference AssemblyReference { get { return reference; } @@ -67,18 +66,15 @@ public AssemblyResolutionException (AssemblyNameReference reference, Exception i } public abstract class BaseAssemblyResolver : IAssemblyResolver { + private static readonly bool on_mono = Type.GetType ("Mono.Runtime") != null; - static readonly bool on_mono = Type.GetType ("Mono.Runtime") != null; - - readonly Collection directories; + private readonly Collection directories; -#if NET_CORE // Maps file names of available trusted platform assemblies to their full paths. // Internal for testing. internal static readonly Lazy> TrustedPlatformAssemblies = new Lazy> (CreateTrustedPlatformAssemblyMap); -#else - Collection gac_paths; -#endif + + private Collection gac_paths; public void AddSearchDirectory (string directory) { @@ -90,6 +86,12 @@ public void RemoveSearchDirectory (string directory) directories.Remove (directory); } + protected bool NetCore { get; set; } + + protected bool AsMono { get; set; } + + protected Module CoreModule { get; set; } + public string [] GetSearchDirectories () { var directories = new string [this.directories.size]; @@ -102,9 +104,17 @@ public string [] GetSearchDirectories () protected BaseAssemblyResolver () { directories = new Collection (2) { ".", "bin" }; +#if NET_CORE + NetCore = true; +#else + NetCore = false; +#endif + + AsMono = on_mono; + CoreModule = typeof (object).Module; } - AssemblyDefinition GetAssembly (string file, ReaderParameters parameters) + private AssemblyDefinition GetAssembly (string file, ReaderParameters parameters) { if (parameters.AssemblyResolver == null) parameters.AssemblyResolver = this; @@ -133,13 +143,33 @@ public virtual AssemblyDefinition Resolve (AssemblyNameReference name, ReaderPar }; } -#if NET_CORE - assembly = SearchTrustedPlatformAssemblies (name, parameters); + assembly = NetCore ? SearchTrustedPlatformAssemblies (name, parameters) : + SearchFrameworkAssemblies (name, parameters); if (assembly != null) return assembly; -#else - var framework_dir = Path.GetDirectoryName (typeof (object).Module.FullyQualifiedName); - var framework_dirs = on_mono + + assembly = LastChanceResolution (assembly, name, parameters); + if (assembly != null) + return assembly; + + throw new AssemblyResolutionException (name); + } + + protected virtual AssemblyDefinition LastChanceResolution (AssemblyDefinition assembly, AssemblyNameReference name, ReaderParameters parameters) + { + if (ResolveFailure != null) { + assembly = ResolveFailure (this, name); + } + + return assembly; + } + + protected AssemblyDefinition SearchFrameworkAssemblies (AssemblyNameReference name, ReaderParameters parameters) + { + AssemblyDefinition assembly = null; + + var framework_dir = Path.GetDirectoryName (CoreModule.FullyQualifiedName); + var framework_dirs = AsMono ? new [] { framework_dir, Path.Combine (framework_dir, "Facades") } : new [] { framework_dir }; @@ -160,20 +190,10 @@ public virtual AssemblyDefinition Resolve (AssemblyNameReference name, ReaderPar return assembly; assembly = SearchDirectory (name, framework_dirs, parameters); - if (assembly != null) - return assembly; -#endif - if (ResolveFailure != null) { - assembly = ResolveFailure (this, name); - if (assembly != null) - return assembly; - } - - throw new AssemblyResolutionException (name); + return assembly; } -#if NET_CORE - AssemblyDefinition SearchTrustedPlatformAssemblies (AssemblyNameReference name, ReaderParameters parameters) + protected AssemblyDefinition SearchTrustedPlatformAssemblies (AssemblyNameReference name, ReaderParameters parameters) { if (name.IsWindowsRuntime) return null; @@ -184,15 +204,16 @@ AssemblyDefinition SearchTrustedPlatformAssemblies (AssemblyNameReference name, return null; } - static Dictionary CreateTrustedPlatformAssemblyMap () + private static Dictionary CreateTrustedPlatformAssemblyMap () { var result = new Dictionary (StringComparer.OrdinalIgnoreCase); string paths; try { - paths = (string) AppDomain.CurrentDomain.GetData ("TRUSTED_PLATFORM_ASSEMBLIES"); - } catch { + paths = (string)AppDomain.CurrentDomain.GetData ("TRUSTED_PLATFORM_ASSEMBLIES"); + } + catch { paths = null; } @@ -205,7 +226,6 @@ static Dictionary CreateTrustedPlatformAssemblyMap () return result; } -#endif protected virtual AssemblyDefinition SearchDirectory (AssemblyNameReference name, IEnumerable directories, ReaderParameters parameters) { @@ -217,7 +237,8 @@ protected virtual AssemblyDefinition SearchDirectory (AssemblyNameReference name continue; try { return GetAssembly (file, parameters); - } catch (System.BadImageFormatException) { + } + catch (System.BadImageFormatException) { continue; } } @@ -226,25 +247,24 @@ protected virtual AssemblyDefinition SearchDirectory (AssemblyNameReference name return null; } - static bool IsZero (Version version) + private static bool IsZero (Version version) { return version.Major == 0 && version.Minor == 0 && version.Build == 0 && version.Revision == 0; } -#if !NET_CORE - AssemblyDefinition GetCorlib (AssemblyNameReference reference, ReaderParameters parameters) + private AssemblyDefinition GetCorlib (AssemblyNameReference reference, ReaderParameters parameters) { var version = reference.Version; - var corlib = typeof (object).Assembly.GetName (); + var corlib = CoreModule.Assembly.GetName (); // GetFramework if (corlib.Version == version || IsZero (version)) - return GetAssembly (typeof (object).Module.FullyQualifiedName, parameters); + return GetAssembly (CoreModule.FullyQualifiedName, parameters); var path = Directory.GetParent ( Directory.GetParent ( - typeof (object).Module.FullyQualifiedName).FullName + CoreModule.FullyQualifiedName).FullName ).FullName; - if (on_mono) { + if (AsMono) { if (version.Major == 1) path = Path.Combine (path, "1.0"); else if (version.Major == 2) { @@ -264,12 +284,15 @@ AssemblyDefinition GetCorlib (AssemblyNameReference reference, ReaderParameters else path = Path.Combine (path, "v1.1.4322"); break; + case 2: path = Path.Combine (path, "v2.0.50727"); break; + case 4: path = Path.Combine (path, "v4.0.30319"); break; + default: throw new NotSupportedException ("Version not supported: " + version); } @@ -279,7 +302,7 @@ AssemblyDefinition GetCorlib (AssemblyNameReference reference, ReaderParameters if (File.Exists (file)) return GetAssembly (file, parameters); - if (on_mono && Directory.Exists (path + "-api")) { + if (AsMono && Directory.Exists (path + "-api")) { file = Path.Combine (path + "-api", "mscorlib.dll"); if (File.Exists (file)) return GetAssembly (file, parameters); @@ -288,10 +311,10 @@ AssemblyDefinition GetCorlib (AssemblyNameReference reference, ReaderParameters return null; } - static Collection GetGacPaths () + private static Collection GetGacPaths (bool mono, Module core) { - if (on_mono) - return GetDefaultMonoGacPaths (); + if (mono) + return GetDefaultMonoGacPaths (core); var paths = new Collection (2); var windir = Environment.GetEnvironmentVariable ("WINDIR"); @@ -303,10 +326,10 @@ static Collection GetGacPaths () return paths; } - static Collection GetDefaultMonoGacPaths () + private static Collection GetDefaultMonoGacPaths (Module core) { var paths = new Collection (1); - var gac = GetCurrentMonoGac (); + var gac = GetCurrentMonoGac (core); if (gac != null) paths.Add (gac); @@ -327,29 +350,29 @@ static Collection GetDefaultMonoGacPaths () return paths; } - static string GetCurrentMonoGac () + private static string GetCurrentMonoGac (Module core) { return Path.Combine ( Directory.GetParent ( - Path.GetDirectoryName (typeof (object).Module.FullyQualifiedName)).FullName, + Path.GetDirectoryName (core.FullyQualifiedName)).FullName, // GetFrameworkDirectory "gac"); } - AssemblyDefinition GetAssemblyInGac (AssemblyNameReference reference, ReaderParameters parameters) + private AssemblyDefinition GetAssemblyInGac (AssemblyNameReference reference, ReaderParameters parameters) { if (reference.PublicKeyToken == null || reference.PublicKeyToken.Length == 0) return null; if (gac_paths == null) - gac_paths = GetGacPaths (); + gac_paths = GetGacPaths (AsMono, CoreModule); - if (on_mono) + if (AsMono) return GetAssemblyInMonoGac (reference, parameters); return GetAssemblyInNetGac (reference, parameters); } - AssemblyDefinition GetAssemblyInMonoGac (AssemblyNameReference reference, ReaderParameters parameters) + private AssemblyDefinition GetAssemblyInMonoGac (AssemblyNameReference reference, ReaderParameters parameters) { for (int i = 0; i < gac_paths.Count; i++) { var gac_path = gac_paths [i]; @@ -361,7 +384,7 @@ AssemblyDefinition GetAssemblyInMonoGac (AssemblyNameReference reference, Reader return null; } - AssemblyDefinition GetAssemblyInNetGac (AssemblyNameReference reference, ReaderParameters parameters) + private AssemblyDefinition GetAssemblyInNetGac (AssemblyNameReference reference, ReaderParameters parameters) { var gacs = new [] { "GAC_MSIL", "GAC_32", "GAC_64", "GAC" }; var prefixes = new [] { string.Empty, "v4.0_" }; @@ -378,7 +401,7 @@ AssemblyDefinition GetAssemblyInNetGac (AssemblyNameReference reference, ReaderP return null; } - static string GetAssemblyFile (AssemblyNameReference reference, string prefix, string gac) + private static string GetAssemblyFile (AssemblyNameReference reference, string prefix, string gac) { var gac_folder = new StringBuilder () .Append (prefix) @@ -393,7 +416,7 @@ static string GetAssemblyFile (AssemblyNameReference reference, string prefix, s Path.Combine (gac, reference.Name), gac_folder.ToString ()), reference.Name + ".dll"); } -#endif + public void Dispose () { Dispose (true); @@ -404,4 +427,4 @@ protected virtual void Dispose (bool disposing) { } } -} +} \ No newline at end of file diff --git a/Mono.Cecil/DefaultAssemblyResolver.cs b/Mono.Cecil/DefaultAssemblyResolver.cs index 755071ea4..626209926 100644 --- a/Mono.Cecil/DefaultAssemblyResolver.cs +++ b/Mono.Cecil/DefaultAssemblyResolver.cs @@ -10,18 +10,32 @@ using System; using System.Collections.Generic; +using System.Linq; namespace Mono.Cecil { - public class DefaultAssemblyResolver : BaseAssemblyResolver { + public class DefaultAssemblyResolverProvider : IAssemblyResolverProvider { + public IAssemblyResolver Create (AssemblyDefinition assembly) + { + return new DefaultAssemblyResolver (); + } + } - readonly IDictionary cache; + public class DefaultAssemblyResolver : BaseAssemblyResolver { + private readonly IDictionary cache; public DefaultAssemblyResolver () { cache = new Dictionary (StringComparer.Ordinal); } + public DefaultAssemblyResolver (bool asNetCore, bool asMono, System.Reflection.Module core) : this () + { + base.NetCore = asNetCore; + base.AsMono = asMono; + base.CoreModule = core; + } + public override AssemblyDefinition Resolve (AssemblyNameReference name) { Mixin.CheckName (name); @@ -58,4 +72,38 @@ protected override void Dispose (bool disposing) base.Dispose (disposing); } } -} + + public class AdaptiveAssemblyResolverProvider : IAssemblyResolverProvider { + public IAssemblyResolver Create (AssemblyDefinition assembly) + { + var blob = assembly.CustomAttributes + .Where (a => a.AttributeType.FullName.Equals ("System.Runtime.Versioning.TargetFrameworkAttribute", StringComparison.Ordinal)) + .FirstOrDefault ()?.GetBlob (); + var core = !System.Text.Encoding.ASCII.GetString ((blob ?? new byte [3]).Skip (3).ToArray ()).StartsWith (".NETFramework"); + return new AdaptiveAssemblyResolver (core); + } + } + + public class AdaptiveAssemblyResolver : DefaultAssemblyResolver { + public AdaptiveAssemblyResolver (bool core) : + base (core, false, typeof (object).Module) // harmless by experiment + { + } + + protected override AssemblyDefinition LastChanceResolution (AssemblyDefinition assembly, AssemblyNameReference name, ReaderParameters parameters) + { + if (!base.NetCore) { + try // the mono gac + { + base.AsMono = true; + assembly = base.SearchFrameworkAssemblies (name, parameters); + if (assembly != null) + return assembly; + } + finally { base.AsMono = false; } + } + + return base.LastChanceResolution (assembly, name, parameters); + } + } +} \ No newline at end of file diff --git a/Mono.Cecil/MetadataResolver.cs b/Mono.Cecil/MetadataResolver.cs index 6511b4187..c0922dab4 100644 --- a/Mono.Cecil/MetadataResolver.cs +++ b/Mono.Cecil/MetadataResolver.cs @@ -16,21 +16,28 @@ namespace Mono.Cecil { public interface IAssemblyResolver : IDisposable { AssemblyDefinition Resolve (AssemblyNameReference name); + AssemblyDefinition Resolve (AssemblyNameReference name, ReaderParameters parameters); } + public interface IAssemblyResolverProvider { + IAssemblyResolver Create (AssemblyDefinition assembly); + } + public interface IMetadataResolver { TypeDefinition Resolve (TypeReference type); + FieldDefinition Resolve (FieldReference field); + MethodDefinition Resolve (MethodReference method); } #if !NET_CORE [Serializable] #endif - public sealed class ResolutionException : Exception { - readonly MemberReference member; + public sealed class ResolutionException : Exception { + private readonly MemberReference member; public MemberReference Member { get { return member; } @@ -79,8 +86,7 @@ public ResolutionException (MemberReference member, Exception innerException) } public class MetadataResolver : IMetadataResolver { - - readonly IAssemblyResolver assembly_resolver; + private readonly IAssemblyResolver assembly_resolver; public IAssemblyResolver AssemblyResolver { get { return assembly_resolver; } @@ -107,19 +113,21 @@ public virtual TypeDefinition Resolve (TypeReference type) switch (scope.MetadataScopeType) { case MetadataScopeType.AssemblyNameReference: - var assembly = assembly_resolver.Resolve ((AssemblyNameReference) scope); + var assembly = assembly_resolver.Resolve ((AssemblyNameReference)scope); if (assembly == null) return null; return GetType (assembly.MainModule, type); + case MetadataScopeType.ModuleDefinition: - return GetType ((ModuleDefinition) scope, type); + return GetType ((ModuleDefinition)scope, type); + case MetadataScopeType.ModuleReference: if (type.Module.Assembly == null) return null; var modules = type.Module.Assembly.Modules; - var module_ref = (ModuleReference) scope; + var module_ref = (ModuleReference)scope; for (int i = 0; i < modules.Count; i++) { var netmodule = modules [i]; if (netmodule.Name == module_ref.Name) @@ -131,7 +139,7 @@ public virtual TypeDefinition Resolve (TypeReference type) throw new NotSupportedException (); } - static TypeDefinition GetType (ModuleDefinition module, TypeReference reference) + private static TypeDefinition GetType (ModuleDefinition module, TypeReference reference) { var type = GetTypeDefinition (module, reference); if (type != null) @@ -156,7 +164,7 @@ static TypeDefinition GetType (ModuleDefinition module, TypeReference reference) return null; } - static TypeDefinition GetTypeDefinition (ModuleDefinition module, TypeReference type) + private static TypeDefinition GetTypeDefinition (ModuleDefinition module, TypeReference type) { if (!type.IsNested) return module.GetType (type.Namespace, type.Name); @@ -182,7 +190,7 @@ public virtual FieldDefinition Resolve (FieldReference field) return GetField (type, field); } - FieldDefinition GetField (TypeDefinition type, FieldReference reference) + private FieldDefinition GetField (TypeDefinition type, FieldReference reference) { while (type != null) { var field = GetField (type.Fields, reference); @@ -198,7 +206,7 @@ FieldDefinition GetField (TypeDefinition type, FieldReference reference) return null; } - static FieldDefinition GetField (Collection fields, FieldReference reference) + private static FieldDefinition GetField (Collection fields, FieldReference reference) { for (int i = 0; i < fields.Count; i++) { var field = fields [i]; @@ -231,7 +239,7 @@ public virtual MethodDefinition Resolve (MethodReference method) return GetMethod (type, method); } - MethodDefinition GetMethod (TypeDefinition type, MethodReference reference) + private MethodDefinition GetMethod (TypeDefinition type, MethodReference reference) { while (type != null) { var method = GetMethod (type.Methods, reference); @@ -285,7 +293,7 @@ public static MethodDefinition GetMethod (Collection methods, return null; } - static bool AreSame (Collection a, Collection b) + private static bool AreSame (Collection a, Collection b) { var count = a.Count; @@ -302,7 +310,7 @@ static bool AreSame (Collection a, Collection= reference.Parameters.Count) return false; @@ -317,24 +325,24 @@ static bool IsVarArgCallTo (MethodDefinition method, MethodReference reference) return true; } - static bool AreSame (TypeSpecification a, TypeSpecification b) + private static bool AreSame (TypeSpecification a, TypeSpecification b) { if (!AreSame (a.ElementType, b.ElementType)) return false; if (a.IsGenericInstance) - return AreSame ((GenericInstanceType) a, (GenericInstanceType) b); + return AreSame ((GenericInstanceType)a, (GenericInstanceType)b); if (a.IsRequiredModifier || a.IsOptionalModifier) - return AreSame ((IModifierType) a, (IModifierType) b); + return AreSame ((IModifierType)a, (IModifierType)b); if (a.IsArray) - return AreSame ((ArrayType) a, (ArrayType) b); + return AreSame ((ArrayType)a, (ArrayType)b); return true; } - static bool AreSame (ArrayType a, ArrayType b) + private static bool AreSame (ArrayType a, ArrayType b) { if (a.Rank != b.Rank) return false; @@ -344,12 +352,12 @@ static bool AreSame (ArrayType a, ArrayType b) return true; } - static bool AreSame (IModifierType a, IModifierType b) + private static bool AreSame (IModifierType a, IModifierType b) { return AreSame (a.ModifierType, b.ModifierType); } - static bool AreSame (GenericInstanceType a, GenericInstanceType b) + private static bool AreSame (GenericInstanceType a, GenericInstanceType b) { if (a.GenericArguments.Count != b.GenericArguments.Count) return false; @@ -361,12 +369,12 @@ static bool AreSame (GenericInstanceType a, GenericInstanceType b) return true; } - static bool AreSame (GenericParameter a, GenericParameter b) + private static bool AreSame (GenericParameter a, GenericParameter b) { return a.Position == b.Position; } - static bool AreSame (TypeReference a, TypeReference b) + private static bool AreSame (TypeReference a, TypeReference b) { if (ReferenceEquals (a, b)) return true; @@ -378,10 +386,10 @@ static bool AreSame (TypeReference a, TypeReference b) return false; if (a.IsGenericParameter) - return AreSame ((GenericParameter) a, (GenericParameter) b); + return AreSame ((GenericParameter)a, (GenericParameter)b); if (a.IsTypeSpecification ()) - return AreSame ((TypeSpecification) a, (TypeSpecification) b); + return AreSame ((TypeSpecification)a, (TypeSpecification)b); if (a.Name != b.Name || a.Namespace != b.Namespace) return false; diff --git a/Mono.Cecil/ModuleDefinition.cs b/Mono.Cecil/ModuleDefinition.cs index b17f7c466..161e7e37e 100644 --- a/Mono.Cecil/ModuleDefinition.cs +++ b/Mono.Cecil/ModuleDefinition.cs @@ -27,19 +27,18 @@ public enum ReadingMode { } public sealed class ReaderParameters { - - ReadingMode reading_mode; + private ReadingMode reading_mode; internal IAssemblyResolver assembly_resolver; internal IMetadataResolver metadata_resolver; internal IMetadataImporterProvider metadata_importer_provider; internal IReflectionImporterProvider reflection_importer_provider; - Stream symbol_stream; - ISymbolReaderProvider symbol_reader_provider; - bool read_symbols; - bool throw_symbols_mismatch; - bool projections; - bool in_memory; - bool read_write; + private Stream symbol_stream; + private ISymbolReaderProvider symbol_reader_provider; + private bool read_symbols; + private bool throw_symbols_mismatch; + private bool projections; + private bool in_memory; + private bool read_write; public ReadingMode ReadingMode { get { return reading_mode; } @@ -51,6 +50,8 @@ public bool InMemory { set { in_memory = value; } } + public IAssemblyResolverProvider AssemblyResolverProvider { get; set; } + public IAssemblyResolver AssemblyResolver { get { return assembly_resolver; } set { assembly_resolver = value; } @@ -114,15 +115,14 @@ public ReaderParameters (ReadingMode readingMode) } public sealed class ModuleParameters { - - ModuleKind kind; - TargetRuntime runtime; - uint? timestamp; - TargetArchitecture architecture; - IAssemblyResolver assembly_resolver; - IMetadataResolver metadata_resolver; - IMetadataImporterProvider metadata_importer_provider; - IReflectionImporterProvider reflection_importer_provider; + private ModuleKind kind; + private TargetRuntime runtime; + private uint? timestamp; + private TargetArchitecture architecture; + private IAssemblyResolver assembly_resolver; + private IMetadataResolver metadata_resolver; + private IMetadataImporterProvider metadata_importer_provider; + private IReflectionImporterProvider reflection_importer_provider; public ModuleKind Kind { get { return kind; } @@ -144,6 +144,8 @@ public TargetArchitecture Architecture { set { architecture = value; } } + public IAssemblyResolverProvider AssemblyResolverProvider { get; set; } + public IAssemblyResolver AssemblyResolver { get { return assembly_resolver; } set { assembly_resolver = value; } @@ -171,21 +173,20 @@ public ModuleParameters () this.architecture = TargetArchitecture.I386; } - static TargetRuntime GetCurrentRuntime () + private static TargetRuntime GetCurrentRuntime () { return typeof (object).Assembly.ImageRuntimeVersion.ParseRuntime (); } } public sealed class WriterParameters { - - uint? timestamp; - Stream symbol_stream; - ISymbolWriterProvider symbol_writer_provider; - bool write_symbols; - byte [] key_blob; - string key_container; - SR.StrongNameKeyPair key_pair; + private uint? timestamp; + private Stream symbol_stream; + private ISymbolWriterProvider symbol_writer_provider; + private bool write_symbols; + private byte [] key_blob; + private string key_container; + private SR.StrongNameKeyPair key_pair; public uint? Timestamp { get { return timestamp; } @@ -230,7 +231,6 @@ public SR.StrongNameKeyPair StrongNameKeyPair { } public sealed class ModuleDefinition : ModuleReference, ICustomAttributeProvider, ICustomDebugInformationProvider, IDisposable { - internal Image Image; internal MetadataSystem MetadataSystem; internal ReadingMode ReadingMode; @@ -241,17 +241,17 @@ public sealed class ModuleDefinition : ModuleReference, ICustomAttributeProvider internal IMetadataResolver metadata_resolver; internal TypeSystem type_system; internal readonly MetadataReader reader; - readonly string file_name; + private readonly string file_name; internal string runtime_version; internal ModuleKind kind; - WindowsRuntimeProjections projections; - MetadataKind metadata_kind; - TargetRuntime runtime; - TargetArchitecture architecture; - ModuleAttributes attributes; - ModuleCharacteristics characteristics; - Guid mvid; + private WindowsRuntimeProjections projections; + private MetadataKind metadata_kind; + private TargetRuntime runtime; + private TargetArchitecture architecture; + private ModuleAttributes attributes; + private ModuleCharacteristics characteristics; + private Guid mvid; internal ushort linker_version = 8; internal ushort subsystem_major = 4; @@ -259,18 +259,18 @@ public sealed class ModuleDefinition : ModuleReference, ICustomAttributeProvider internal uint timestamp; internal AssemblyDefinition assembly; - MethodDefinition entry_point; - bool entry_point_set; + private MethodDefinition entry_point; + private bool entry_point_set; internal IReflectionImporter reflection_importer; internal IMetadataImporter metadata_importer; - Collection custom_attributes; - Collection references; - Collection modules; - Collection resources; - Collection exported_types; - TypeDefinitionCollection types; + private Collection custom_attributes; + private Collection references; + private Collection modules; + private Collection resources; + private Collection exported_types; + private TypeDefinitionCollection types; internal Collection custom_infos; @@ -382,11 +382,16 @@ internal IMetadataImporter MetadataImporter { } } + public IAssemblyResolverProvider AssemblyResolverProvider { get; internal set; } + public IAssemblyResolver AssemblyResolver { get { if (assembly_resolver.value == null) { lock (module_lock) { - assembly_resolver = Disposable.Owned (new DefaultAssemblyResolver () as IAssemblyResolver); + assembly_resolver = Disposable.Owned ( + (AssemblyResolverProvider != null) ? + AssemblyResolverProvider.Create (this.assembly) : + new DefaultAssemblyResolver () as IAssemblyResolver); } } @@ -640,7 +645,7 @@ public bool TryGetTypeReference (string scope, string fullName, out TypeReferenc return (type = GetTypeReference (scope, fullName)) != null; } - TypeReference GetTypeReference (string scope, string fullname) + private TypeReference GetTypeReference (string scope, string fullname) { return Read (new Row (scope, fullname), (row, reader) => reader.GetTypeReference (row.Col1, row.Col2)); } @@ -684,14 +689,14 @@ public TypeDefinition GetType (string fullName) if (position > 0) return GetNestedType (fullName); - return ((TypeDefinitionCollection) this.Types).GetType (fullName); + return ((TypeDefinitionCollection)this.Types).GetType (fullName); } public TypeDefinition GetType (string @namespace, string name) { Mixin.CheckName (name); - return ((TypeDefinitionCollection) this.Types).GetType (@namespace ?? string.Empty, name); + return ((TypeDefinitionCollection)this.Types).GetType (@namespace ?? string.Empty, name); } public IEnumerable GetTypes () @@ -699,7 +704,7 @@ public IEnumerable GetTypes () return GetTypes (Types); } - static IEnumerable GetTypes (Collection types) + private static IEnumerable GetTypes (Collection types) { for (int i = 0; i < types.Count; i++) { var type = types [i]; @@ -714,7 +719,7 @@ static IEnumerable GetTypes (Collection types) } } - TypeDefinition GetNestedType (string fullname) + private TypeDefinition GetNestedType (string fullname) { var names = fullname.Split ('/'); var type = GetType (names [0]); @@ -748,7 +753,7 @@ internal TypeDefinition Resolve (TypeReference type) return MetadataResolver.Resolve (type); } - static void CheckContext (IGenericParameterProvider context, ModuleDefinition module) + private static void CheckContext (IGenericParameterProvider context, ModuleDefinition module) { if (context == null) return; @@ -921,14 +926,14 @@ public MethodReference ImportReference (MethodReference method, IGenericParamete public IMetadataTokenProvider LookupToken (int token) { - return LookupToken (new MetadataToken ((uint) token)); + return LookupToken (new MetadataToken ((uint)token)); } public IMetadataTokenProvider LookupToken (MetadataToken token) { return Read (token, (t, reader) => reader.LookupToken (t)); } - + public void ImmediateRead () { if (!HasImage) @@ -938,7 +943,7 @@ public void ImmediateRead () moduleReader.ReadModule (this, resolve_attributes: true); } - readonly object module_lock = new object(); + private readonly object module_lock = new object (); internal object SyncRoot { get { return module_lock; } @@ -1017,11 +1022,13 @@ public static ModuleDefinition CreateModule (string name, ModuleParameters param architecture = parameters.Architecture, mvid = Guid.NewGuid (), Attributes = ModuleAttributes.ILOnly, - Characteristics = (ModuleCharacteristics) 0x8540, + Characteristics = (ModuleCharacteristics)0x8540, }; if (parameters.AssemblyResolver != null) module.assembly_resolver = Disposable.NotOwned (parameters.AssemblyResolver); + else if (parameters.AssemblyResolverProvider != null) + module.AssemblyResolverProvider = parameters.AssemblyResolverProvider; if (parameters.MetadataResolver != null) module.metadata_resolver = parameters.MetadataResolver; @@ -1044,7 +1051,7 @@ public static ModuleDefinition CreateModule (string name, ModuleParameters param return module; } - static AssemblyNameDefinition CreateAssemblyName (string name) + private static AssemblyNameDefinition CreateAssemblyName (string name) { if (name.EndsWith (".dll") || name.EndsWith (".exe")) name = name.Substring (0, name.Length - 4); @@ -1063,7 +1070,7 @@ public void ReadSymbols () public void ReadSymbols (ISymbolReader reader) { - ReadSymbols(reader, throwIfSymbolsAreNotMaching: true); + ReadSymbols (reader, throwIfSymbolsAreNotMaching: true); } public void ReadSymbols (ISymbolReader reader, bool throwIfSymbolsAreNotMaching) @@ -1098,7 +1105,7 @@ public static ModuleDefinition ReadModule (string fileName, ReaderParameters par var stream = GetFileStream (fileName, FileMode.Open, parameters.ReadWrite ? FileAccess.ReadWrite : FileAccess.Read, FileShare.Read); if (parameters.InMemory) { - var memory = new MemoryStream (stream.CanSeek ? (int) stream.Length : 0); + var memory = new MemoryStream (stream.CanSeek ? (int)stream.Length : 0); using (stream) stream.CopyTo (memory); @@ -1108,13 +1115,14 @@ public static ModuleDefinition ReadModule (string fileName, ReaderParameters par try { return ReadModule (Disposable.Owned (stream), fileName, parameters); - } catch (Exception) { + } + catch (Exception) { stream.Dispose (); throw; } } - static Stream GetFileStream (string fileName, FileMode mode, FileAccess access, FileShare share) + private static Stream GetFileStream (string fileName, FileMode mode, FileAccess access, FileShare share) { Mixin.CheckFileName (fileName); @@ -1134,7 +1142,7 @@ public static ModuleDefinition ReadModule (Stream stream, ReaderParameters param return ReadModule (Disposable.NotOwned (stream), stream.GetFileName (), parameters); } - static ModuleDefinition ReadModule (Disposable stream, string fileName, ReaderParameters parameters) + private static ModuleDefinition ReadModule (Disposable stream, string fileName, ReaderParameters parameters) { Mixin.CheckParameters (parameters); @@ -1183,7 +1191,7 @@ public void Write (Stream stream, WriterParameters parameters) } } - static partial class Mixin { + internal static partial class Mixin { public enum Argument { name, @@ -1279,7 +1287,7 @@ public static void CheckParameters (object parameters) public static uint GetTimestamp () { - return (uint) DateTime.UtcNow.Subtract (new DateTime (1970, 1, 1)).TotalSeconds; + return (uint)DateTime.UtcNow.Subtract (new DateTime (1970, 1, 1)).TotalSeconds; } public static bool HasImage (this ModuleDefinition self) @@ -1306,8 +1314,10 @@ public static TargetRuntime ParseRuntime (this string self) return self [3] == '0' ? TargetRuntime.Net_1_0 : TargetRuntime.Net_1_1; + case '2': return TargetRuntime.Net_2_0; + case '4': default: return TargetRuntime.Net_4_0; @@ -1319,10 +1329,13 @@ public static string RuntimeVersionString (this TargetRuntime runtime) switch (runtime) { case TargetRuntime.Net_1_0: return "v1.0.3705"; + case TargetRuntime.Net_1_1: return "v1.1.4322"; + case TargetRuntime.Net_2_0: return "v2.0.50727"; + case TargetRuntime.Net_4_0: default: return "v4.0.30319"; @@ -1337,7 +1350,7 @@ public static bool IsWindowsMetadata (this ModuleDefinition module) public static byte [] ReadAll (this Stream self) { int read; - var memory = new MemoryStream ((int) self.Length); + var memory = new MemoryStream ((int)self.Length); var buffer = new byte [1024]; while ((read = self.Read (buffer, 0, buffer.Length)) != 0) @@ -1350,4 +1363,4 @@ public static void Read (object o) { } } -} +} \ No newline at end of file diff --git a/Test/Mono.Cecil.Tests/ResolveTests.cs b/Test/Mono.Cecil.Tests/ResolveTests.cs index bce000327..ce09025c6 100644 --- a/Test/Mono.Cecil.Tests/ResolveTests.cs +++ b/Test/Mono.Cecil.Tests/ResolveTests.cs @@ -12,7 +12,6 @@ namespace Mono.Cecil.Tests { [TestFixture] public class ResolveTests : BaseTestFixture { - [Test] public void StringEmpty () { @@ -26,11 +25,11 @@ public void StringEmpty () Assert.IsNotNull (definition); Assert.AreEqual ("System.String System.String::Empty", definition.FullName); - Assert.AreEqual (Platform.OnCoreClr ? "System.Private.CoreLib" : "mscorlib", + Assert.AreEqual (Platform.OnCoreClr ? "System.Private.CoreLib" : "mscorlib", definition.Module.Assembly.Name.Name); } - delegate string GetSubstring (string str, int start, int length); + private delegate string GetSubstring (string str, int start, int length); [Test] public void StringSubstring () @@ -58,7 +57,7 @@ public void StringLength () Assert.AreEqual ("get_Length", definition.Name); Assert.AreEqual ("System.String", definition.DeclaringType.FullName); - Assert.AreEqual (Platform.OnCoreClr ? "System.Private.CoreLib" : "mscorlib", + Assert.AreEqual (Platform.OnCoreClr ? "System.Private.CoreLib" : "mscorlib", definition.Module.Assembly.Name.Name); } @@ -100,8 +99,7 @@ public void DictionaryOfStringTypeDefinitionTryGetValue () definition.Module.Assembly.Name.Name); } - class CustomResolver : DefaultAssemblyResolver { - + private class CustomResolver : DefaultAssemblyResolver { public void Register (AssemblyDefinition assembly) { this.RegisterAssembly (assembly); @@ -173,7 +171,7 @@ public void NestedTypeForwarder () [Test] public void RectangularArrayResolveGetMethod () { - var get_a_b = GetReference, MethodReference> (matrix => matrix [2, 2]); + var get_a_b = GetReference, MethodReference> (matrix => matrix [2, 2]); Assert.AreEqual ("Get", get_a_b.Name); Assert.IsNotNull (get_a_b.Module); @@ -201,7 +199,7 @@ public void ResolveFunctionPointer () var field = global.GetField ("__onexitbegin_app_domain"); var type = field.FieldType as PointerType; - Assert.IsNotNull(type); + Assert.IsNotNull (type); var fnptr = type.ElementType as FunctionPointerType; Assert.IsNotNull (fnptr); @@ -247,6 +245,25 @@ public void ResolvePortableClassLibraryReference () } } + [Test] + public void ResolveFrameworkGACReference () + { + // only makes sense on Windows + OnlyOnWindows (); + + var resolver = new AdaptiveAssemblyResolverProvider (); + var parameters = new ReaderParameters { AssemblyResolverProvider = resolver }; + + using (var module = GetResourceModule ("FrameworkWPF.dll", parameters)) { + var rt_folder = Path.Combine (Path.GetTempPath (), "FrameworkWPF"); + if (!Directory.Exists (rt_folder)) + Directory.CreateDirectory (rt_folder); + var rt_module = Path.Combine (rt_folder, Path.GetFileName ("FrameworkWPF.dll")); + var writer_parameters = new WriterParameters (); + module.Write (rt_module, writer_parameters); + } + } + [Test] public void ResolveModuleReferenceFromMemberReferenceTest () { @@ -282,20 +299,21 @@ public void ResolveModuleReferenceFromMemberReferenceOfSingleNetModuleTest () Assert.IsNull (methodTypeRef.Resolve ()); } } - TRet GetReference (TDel code) + + private TRet GetReference (TDel code) { var @delegate = code as Delegate; if (@delegate == null) throw new InvalidOperationException (); - var reference = (TRet) GetReturnee (GetMethodFromDelegate (@delegate)); + var reference = (TRet)GetReturnee (GetMethodFromDelegate (@delegate)); Assert.IsNotNull (reference); return reference; } - static object GetReturnee (MethodDefinition method) + private static object GetReturnee (MethodDefinition method) { Assert.IsTrue (method.HasBody); @@ -311,6 +329,7 @@ static object GetReturnee (MethodDefinition method) case OperandType.InlineType: case OperandType.InlineMethod: return instruction.Operand; + default: instruction = instruction.Previous; break; @@ -320,14 +339,14 @@ static object GetReturnee (MethodDefinition method) throw new InvalidOperationException (); } - MethodDefinition GetMethodFromDelegate (Delegate @delegate) + private MethodDefinition GetMethodFromDelegate (Delegate @delegate) { var method = @delegate.Method; - var type = (TypeDefinition) TypeParser.ParseType (GetCurrentModule (), method.DeclaringType.FullName); + var type = (TypeDefinition)TypeParser.ParseType (GetCurrentModule (), method.DeclaringType.FullName); Assert.IsNotNull (type); return type.Methods.Where (m => m.Name == method.Name).First (); } } -} +} \ No newline at end of file diff --git a/Test/Resources/assemblies/FrameworkWPF.dll b/Test/Resources/assemblies/FrameworkWPF.dll new file mode 100644 index 000000000..34d7d3455 Binary files /dev/null and b/Test/Resources/assemblies/FrameworkWPF.dll differ diff --git a/Test/Resources/assemblies/FrameworkWPF.pdb b/Test/Resources/assemblies/FrameworkWPF.pdb new file mode 100644 index 000000000..43931a538 Binary files /dev/null and b/Test/Resources/assemblies/FrameworkWPF.pdb differ