diff --git a/ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs b/ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs index 82de99f52..25d10dcb3 100644 --- a/ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs +++ b/ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs @@ -89,16 +89,20 @@ namespace ICSharpCode.Decompiler.Metadata return Disassembler.DisassemblerHelpers.Escape(name); } - public static AssemblyReferenceHandle GetDeclaringAssembly(this TypeReferenceHandle handle, MetadataReader reader) + public static TypeSystem.IAssemblyReference GetDeclaringAssembly(this TypeReferenceHandle handle, MetadataReader reader) { var tr = reader.GetTypeReference(handle); switch (tr.ResolutionScope.Kind) { case HandleKind.TypeReference: return ((TypeReferenceHandle)tr.ResolutionScope).GetDeclaringAssembly(reader); case HandleKind.AssemblyReference: - return (AssemblyReferenceHandle)tr.ResolutionScope; + var asmRef = reader.GetAssemblyReference((AssemblyReferenceHandle)tr.ResolutionScope); + return new DefaultAssemblyReference(reader.GetString(asmRef.Name)); + case HandleKind.ModuleReference: + var modRef = reader.GetModuleReference((ModuleReferenceHandle)tr.ResolutionScope); + return new DefaultAssemblyReference(reader.GetString(modRef.Name)); default: - return default; + return DefaultAssemblyReference.CurrentAssembly; } } diff --git a/ICSharpCode.Decompiler/TypeSystem/Implementation/TypeSpecification.cs b/ICSharpCode.Decompiler/TypeSystem/Implementation/TypeSpecification.cs index b45b49568..9827fee21 100644 --- a/ICSharpCode.Decompiler/TypeSystem/Implementation/TypeSpecification.cs +++ b/ICSharpCode.Decompiler/TypeSystem/Implementation/TypeSpecification.cs @@ -184,11 +184,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation public ITypeReference GetTypeFromReference(SRM.MetadataReader reader, SRM.TypeReferenceHandle handle, byte rawTypeKind) { - var asmref = handle.GetDeclaringAssembly(reader); - if (asmref.IsNil) - return new GetClassTypeReference(handle.GetFullTypeName(reader), DefaultAssemblyReference.CurrentAssembly); - var asm = reader.GetAssemblyReference(asmref); - return new GetClassTypeReference(handle.GetFullTypeName(reader), new DefaultAssemblyReference(reader.GetString(asm.Name))); + return new GetClassTypeReference(handle.GetFullTypeName(reader), handle.GetDeclaringAssembly(reader)); } public ITypeReference GetTypeFromSpecification(SRM.MetadataReader reader, Unit genericContext, SRM.TypeSpecificationHandle handle, byte rawTypeKind) diff --git a/ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs b/ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs index 4611776e1..9644d7dfb 100644 --- a/ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs +++ b/ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs @@ -132,13 +132,8 @@ namespace ICSharpCode.Decompiler.TypeSystem public IType GetTypeFromReference(SRM.MetadataReader reader, SRM.TypeReferenceHandle handle, byte rawTypeKind) { var asmref = handle.GetDeclaringAssembly(reader); - IAssemblyReference nrAsmRef; - if (asmref.IsNil) - nrAsmRef = DefaultAssemblyReference.CurrentAssembly; - else - nrAsmRef = new DefaultAssemblyReference(reader.GetString(reader.GetAssemblyReference(asmref).Name)); bool? isReferenceType = IsReferenceType(reader, handle, rawTypeKind); - var gctr = new GetClassTypeReference(handle.GetFullTypeName(reader), nrAsmRef, isReferenceType); + var gctr = new GetClassTypeReference(handle.GetFullTypeName(reader), handle.GetDeclaringAssembly(reader), isReferenceType); return gctr.Resolve(assembly != null ? new SimpleTypeResolveContext(assembly) : new SimpleTypeResolveContext(compilation)); }