// Caller should lock this. internal IModule/*?*/ ResolveModuleRefReference(ModuleReference moduleReference) { // If this is an assembly try to find in referred modules if (this.PEFileReader.IsAssembly) { Assembly/*?*/ assem = this.Module as Assembly; //^ assert assem != null; int moduleKey = moduleReference.ModuleIdentity.Name.UniqueKeyIgnoringCase; IModule[] containigModules = assem.MemberModules; var n = containigModules == null ? 0 : containigModules.Length; for (int i = 0; i < n; i++) { IModule mod = containigModules[i]; if (mod.ModuleName.UniqueKeyIgnoringCase == moduleKey) return mod; } } // If not found or its not an assembly look else where... var module = this.ModuleReader.LookupModule(this.Module, moduleReference.ModuleIdentity); return module; }
/// <summary> /// Populates the list of module references. /// </summary> void LoadModuleReferences() //^ ensures this.ModuleReferenceArray != null; { uint numberOfModuleReferences = this.PEFileReader.ModuleRefTable.NumberOfRows; ModuleReference[] moduleRefList = new ModuleReference[numberOfModuleReferences + 1]; for (uint i = 1; i <= numberOfModuleReferences; ++i) { ModuleRefRow moduleRefRow = this.PEFileReader.ModuleRefTable[i]; IName moduleRefName = this.GetNameFromOffset(moduleRefRow.Name); ModuleIdentity moduleIdentity; if (this.ContainingAssembly == null) { moduleIdentity = new ModuleIdentity(moduleRefName, string.Empty); } else { moduleIdentity = new ModuleIdentity(moduleRefName, string.Empty, this.ContainingAssembly.AssemblyIdentity); } ModuleIdentity probedModuleIdentity = this.ModuleReader.metadataReaderHost.ProbeModuleReference(this.Module, moduleIdentity); uint internedModuleId = (uint)this.ModuleReader.metadataReaderHost.InternFactory.GetModuleInternedKey(probedModuleIdentity); ModuleReference moduleReference = new ModuleReference(this, i, internedModuleId, probedModuleIdentity); moduleRefList[i] = moduleReference; } //^ NonNullType.AssertInitialized(moduleRefList); this.ModuleReferenceArray = moduleRefList; }