Exemplo n.º 1
0
        public AssemblyDef Resolve(IAssembly assembly, ModuleDef sourceModule)
        {
            var resolver = Resolver;

            if (resolver == null)
            {
                resolver = GetDefaultResolver();
            }

            AssemblyDef result = resolver.Resolve(assembly, sourceModule);

            var         comparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);
            AssemblyDef cachedResult;

            if (!LoadedAssemblies.TryGetValue(new AssemblyNameInfo(result), out cachedResult))
            {
                Debug.Assert(!string.IsNullOrEmpty(result.ManifestModule.Location));
                // Resolving assemblies must be done in non-UI thread, or else Wait() will deadlock.
                Debug.Assert(Manager.InvokeRequired);
                Manager.LoadModule(result.ManifestModule.Location).Wait();
                cachedResult = LoadedAssemblies[new AssemblyNameInfo(result)];
                ResolveNetModules(cachedResult);
            }
            return(cachedResult);
        }
Exemplo n.º 2
0
        void RewriteClass(XamlContext ctx, XElement elem)
        {
            var type = elem.Annotation <XamlType>();

            if (type == null || type.ResolvedType == null)
            {
                return;
            }

            var typeDef  = type.ResolvedType.ResolveTypeDef();
            var comparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);

            if (typeDef == null || !comparer.Equals(typeDef.DefinitionAssembly, ctx.Module.Assembly))
            {
                return;
            }

            var newType  = typeDef.BaseType;
            var xamlType = new XamlType(newType.DefinitionAssembly, newType.ReflectionNamespace, newType.Name);

            xamlType.ResolveNamespace(elem, ctx);

            elem.Name = xamlType.ToXName(ctx);

            var attrName = ctx.GetXamlNsName("Class", elem);

            var attrs = elem.Attributes().ToList();

            attrs.Insert(0, new XAttribute(attrName, type.ResolvedType.ReflectionFullName));
            elem.ReplaceAttributes(attrs);
        }
Exemplo n.º 3
0
            public bool Match(string assemblyFile)
            {
                #if !SILVERLIGHT
                var asmName = AssemblyName.GetAssemblyName(assemblyFile);
#else
                var asmName = new AssemblyName(assemblyFile);
#endif

                if (!AssemblyNameComparer.Equals(SourceName, asmName, false))
                {
                    return(false);
                }


                var item = new AssemblyNameResult {
                    AssemblyFile = assemblyFile, AssemblyName = asmName
                };
                if (SourceName.Version != null && SourceName.Version.Equals(asmName.Version))
                {
                    FullMatchedResult = item;
                    return(true);
                }
                else if (!IncludeVersion)
                {
                    FullMatchedResult = item;
                    return(true);
                }

                Results.Add(item);

                return(false);
            }
Exemplo n.º 4
0
		IDsDocument TryLoadFromDir2(IAssembly asmName, bool checkVersion, bool checkPublicKeyToken, string filename) {
			if (!File.Exists(filename))
				return null;

			IDsDocument document = null;
			bool error = true;
			try {
				document = documentService.TryCreateDocument(DsDocumentInfo.CreateDocument(filename));
				if (document == null)
					return null;
				document.IsAutoLoaded = true;
				var asm = document.AssemblyDef;
				if (asm == null)
					return null;
				var flags = AssemblyNameComparerFlags.All & ~(AssemblyNameComparerFlags.Version | AssemblyNameComparerFlags.PublicKeyToken);
				if (checkVersion)
					flags |= AssemblyNameComparerFlags.Version;
				if (checkPublicKeyToken)
					flags |= AssemblyNameComparerFlags.PublicKeyToken;
				bool b = new AssemblyNameComparer(flags).Equals(asmName, asm);
				if (!b)
					return null;

				error = false;
				return document;
			}
			finally {
				if (error) {
					if (document is IDisposable)
						((IDisposable)document).Dispose();
				}
			}
		}
        public bool CheckFileExistence(AssemblyName assemblyName, string searchPattern, bool caching, bool checkForBaseDir, bool checkForArchitectPlatfrom = true)
        {
            AssemblyName assemblyNameFromStorage;

            if (TryGetAssemblyNameDefinition(searchPattern, caching, assemblyName.TargetArchitecture, out assemblyNameFromStorage, checkForArchitectPlatfrom))
            {
                var areEquals = /*Telerik Authorship*/ AssemblyNameComparer.AreVersionEquals(assemblyNameFromStorage.Version, assemblyName.Version) &&
                                /*Telerik Authorship*/ AssemblyNameComparer.ArePublicKeyEquals(assemblyNameFromStorage.PublicKeyToken, assemblyName.PublicKeyToken) &&
                                assemblyName.TargetArchitecture.CanReference(assemblyNameFromStorage.TargetArchitecture) &&
                                (!checkForBaseDir || AreDefaultDirEqual(assemblyName, assemblyNameFromStorage));
                if (areEquals && caching)
                {
                    /*Telerik Authorship*/
                    ModuleDefinition           module      = AssemblyDefinition.ReadAssembly(searchPattern, readerParameters).MainModule;
                    SpecialTypeAssembly        special     = module.IsReferenceAssembly() ? SpecialTypeAssembly.Reference : SpecialTypeAssembly.None;
                    AssemblyStrongNameExtended assemblyKey = new AssemblyStrongNameExtended(assemblyName.FullName, assemblyName.TargetArchitecture, special);
                    pathRepository.AssemblyPathName.Add(assemblyKey, searchPattern);
                    if (!pathRepository.AssemblyPathArchitecture.ContainsKey(searchPattern))
                    {
                        TargetArchitecture architecture = module.GetModuleArchitecture();
                        pathRepository.AssemblyPathArchitecture.Add(new KeyValuePair <string, TargetArchitecture>(searchPattern, architecture));
                    }
                }
                return(areEquals);
            }
            return(false);
        }
Exemplo n.º 6
0
        public IDsDocument FindAssembly(IAssembly assembly)
        {
            var comparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);

            rwLock.EnterReadLock();
            try {
                foreach (var info in documents)
                {
                    if (comparer.Equals(info.Document.AssemblyDef, assembly))
                    {
                        return(info.Document);
                    }
                }
                foreach (var info in documents)
                {
                    if (info.IsAlternativeAssemblyName(assembly))
                    {
                        return(info.Document);
                    }
                }
            }
            finally {
                rwLock.ExitReadLock();
            }
            lock (tempCache) {
                foreach (var document in tempCache)
                {
                    if (comparer.Equals(document.AssemblyDef, assembly))
                    {
                        return(document);
                    }
                }
            }
            return(null);
        }
Exemplo n.º 7
0
        public string LookupXmlns(IAssembly asm, string clrNs)
        {
            var comparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);

            foreach (var map in piMappings)
            {
                if (comparer.Equals(map.Value.Assembly, asm) && map.Value.CLRNamespace == clrNs)
                {
                    return(map.Key);
                }
            }

            var scope = CurrentScope;

            while (scope != null)
            {
                foreach (var ns in scope)
                {
                    if (comparer.Equals(ns.Assembly, asm) && ns.CLRNamespace == clrNs)
                    {
                        return(ns.XMLNamespace);
                    }
                }

                scope = scope.PreviousScope;
            }

            return(null);
        }
Exemplo n.º 8
0
		void RewriteClass(XamlContext ctx, XElement elem) {
			var type = elem.Annotation<XamlType>();
			if (type == null || type.ResolvedType == null)
				return;

			var typeDef = type.ResolvedType.ResolveTypeDef();
			var comparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);
			if (typeDef == null || !comparer.Equals(typeDef.DefinitionAssembly, ctx.Module.Assembly))
				return;

			var newType = typeDef.BaseType;
			var xamlType = new XamlType(newType.DefinitionAssembly, newType.ReflectionNamespace, newType.Name);
			xamlType.ResolveNamespace(elem, ctx);

			elem.Name = xamlType.ToXName(ctx);

			var attrName = ctx.GetXamlNsName("Class", elem);

			var attrs = elem.Attributes().ToList();
			if (typeDef.IsNotPublic) {
				var classModifierName = ctx.GetXamlNsName("ClassModifier", elem);
				attrs.Insert(0, new XAttribute(classModifierName, ctx.BamlDecompilerOptions.InternalClassModifier));
			}
			attrs.Insert(0, new XAttribute(attrName, type.ResolvedType.ReflectionFullName));
			elem.ReplaceAttributes(attrs);
		}
Exemplo n.º 9
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="aname"></param>
 /// <returns></returns>
 public Assembly Resolve(AssemblyName aname)
 {
     if (Assemblys == null)
     {
         return(null);
     }
     return(Assemblys.FirstOrDefault(a => AssemblyNameComparer.Equals(aname, a.GetName(), IncludeVersion)));
 }
Exemplo n.º 10
0
        /// <summary>
        /// 解析Assembly
        /// </summary>
        /// <param name="anme"></param>
        /// <returns></returns>
        public Assembly Resolve(AssemblyName anme)
        {
            var asmName = Gac.GetAssemblyNames().FirstOrDefault(a => AssemblyNameComparer.Equals(anme, a));

            if (asmName != null)
            {
                return(Assembly.Load(asmName));
            }

            return(null);
        }
Exemplo n.º 11
0
        public string LookupXmlns(IAssembly asm, string clrNs)
        {
            var comparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);

            foreach (var ns in this)
            {
                if (comparer.Equals(ns.Assembly, asm) && ns.CLRNamespace == clrNs)
                {
                    return(ns.XMLNamespace);
                }
            }

            return(null);
        }
Exemplo n.º 12
0
 public DnSpyFile FindAssembly(IAssembly assembly)
 {
     lock (lockObj) {
         var comparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);
         foreach (var file in files)
         {
             if (comparer.Equals(file.AssemblyDef, assembly))
             {
                 return(file);
             }
         }
         return(null);
     }
 }
Exemplo n.º 13
0
        IEnumerable <ModuleDefMD> GetModules(IApp app, object targetItem)
        {
            var type = targetItem as TypeDef;

            if (type == null)
            {
                type = ((IMemberDef)targetItem).DeclaringType;
            }

            var asmComparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);

            foreach (var module in app.Modules.GetModules())
            {
                if (module.GlobalType == null)
                {
                    continue;
                }

                bool hasRef = asmComparer.Equals(module.Assembly, type.DefinitionAssembly);
                if (!hasRef)
                {
                    foreach (var reference in module.GetAssemblyRefs())
                    {
                        if (asmComparer.Equals(reference, type.DefinitionAssembly))
                        {
                            hasRef = true;
                            break;
                        }
                    }
                }
                if (!hasRef)
                {
                    continue;
                }

                if (type.Module == module)
                {
                    yield return(module);
                }
                else
                {
                    checker.UserType = module.GlobalType;
                    if (checker.CanAccess(type) ?? true)
                    {
                        yield return(module);
                    }
                }
            }
        }
Exemplo n.º 14
0
 public void BreakOnLoadAssembly(IAssembly assembly, Action <IDebuggerAssembly> action, AssemblyNameComparerFlags flags)
 {
     if (assembly == null)
     {
         throw new ArgumentNullException(nameof(assembly));
     }
     assembly = assembly.ToAssemblyRef();            // Prevent storing AssemblyDef refs
     // Use the LoadModule event since without a module, we won't know the full assembly name
     CreateBreakpoint(DebugEventKind.LoadModule, (bp, ctx) => {
         var c        = (ModuleEventContext)ctx;
         var comparer = new AssemblyNameComparer(flags);
         var asm      = c.Module.Assembly;
         if (!comparer.Equals(assembly, new AssemblyNameInfo(asm.FullName)))
         {
             return(false);
         }
         bp.Remove();
         action?.Invoke(asm);
         return(true);
     });
 }
Exemplo n.º 15
0
        public static bool ReferencesModule(ModuleDef sourceModule, ModuleDef targetModule)
        {
            if (targetModule == null)
            {
                return(false);
            }

            if (sourceModule == targetModule)
            {
                return(true);
            }

            var targetAssembly = targetModule.Assembly;

            if (targetAssembly != null)
            {
                // Don't compare version, there could be binding redirects
                var asmComparer = new AssemblyNameComparer(AssemblyNameComparerFlags.Name | AssemblyNameComparerFlags.PublicKeyToken | AssemblyNameComparerFlags.Culture | AssemblyNameComparerFlags.ContentType);
                foreach (var asmRef in sourceModule.GetAssemblyRefs())
                {
                    if (asmComparer.Equals(asmRef, targetAssembly))
                    {
                        return(true);
                    }
                }

                if (targetAssembly == sourceModule.Assembly)
                {
                    foreach (var modRef in sourceModule.GetModuleRefs())
                    {
                        if (StringComparer.OrdinalIgnoreCase.Equals(modRef.Name.String, targetModule.Name.String))
                        {
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
Exemplo n.º 16
0
        public IDsDocument FindAssembly(IAssembly assembly)
        {
            var comparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);

            lock (lockObj) {
                foreach (var document in documents)
                {
                    if (comparer.Equals(document.AssemblyDef, assembly))
                    {
                        return(document);
                    }
                }
            }
            lock (tempCache) {
                foreach (var document in tempCache)
                {
                    if (comparer.Equals(document.AssemblyDef, assembly))
                    {
                        return(document);
                    }
                }
            }
            return(null);
        }
Exemplo n.º 17
0
        void RewriteClass(XamlContext ctx, XElement elem)
        {
            var type = elem.Annotation <XamlType>();

            if (type is null || type.ResolvedType is null)
            {
                return;
            }

            var typeDef  = type.ResolvedType.ResolveTypeDef();
            var comparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);

            if (typeDef is null || !comparer.Equals(typeDef.DefinitionAssembly, ctx.Module.Assembly))
            {
                return;
            }

            var newType  = typeDef.BaseType;
            var xamlType = new XamlType(newType.DefinitionAssembly, newType.ReflectionNamespace, newType.Name);

            xamlType.ResolveNamespace(elem, ctx);

            elem.Name = xamlType.ToXName(ctx);

            var attrName = ctx.GetKnownNamespace("Class", XamlContext.KnownNamespace_Xaml, elem);

            var attrs = elem.Attributes().ToList();

            if (typeDef.IsNotPublic)
            {
                var classModifierName = ctx.GetKnownNamespace("ClassModifier", XamlContext.KnownNamespace_Xaml, elem);
                attrs.Insert(0, new XAttribute(classModifierName, ctx.BamlDecompilerOptions.InternalClassModifier));
            }
            attrs.Insert(0, new XAttribute(attrName, type.ResolvedType.ReflectionFullName));
            elem.ReplaceAttributes(attrs);
        }
        public TargetPlatform GetTargetPlatform(string assemblyFilePath, ModuleDefinition moduleDef)
        {
            TargetPlatform targetPlatform = this.DefaultTargetPlatform;

            if (string.IsNullOrEmpty(assemblyFilePath))
            {
                return(targetPlatform);
            }

            if (this.assemblyFrameworkResolverCache.AssemblyPathToTargetPlatform.ContainsKey(assemblyFilePath))
            {
                return(this.assemblyFrameworkResolverCache.AssemblyPathToTargetPlatform[assemblyFilePath]);
            }
            else
            {
                Task <TargetPlatform> targetPlatformFromDepsJson = null;

                string moduleLocation   = moduleDef.FullyQualifiedName ?? moduleDef.FilePath;
                string depsJsonLocation = Directory.GetFiles(Path.GetDirectoryName(moduleLocation), "*.deps.json").FirstOrDefault();

                if (File.Exists(depsJsonLocation))
                {
                    targetPlatformFromDepsJson = Task.Factory.StartNew(() =>
                    {
                        return(this.GetPlatformTargetFromDepsJson(moduleLocation));
                    });
                }

                ///*Telerik Authorship*/
                if (moduleDef.Assembly != null)
                {
                    targetPlatform = this.GetTargetPlatform(moduleDef);

                    if (targetPlatform != this.DefaultTargetPlatform)
                    {
                        this.assemblyFrameworkResolverCache.AddAssemblyTargetPlatformToCache(assemblyFilePath, targetPlatform);
                        return(targetPlatform);
                    }
                }

                AssemblyNameReference msCorlib = moduleDef.AssemblyReferences.FirstOrDefault(a => a.Name == "mscorlib");

                if (msCorlib == null)
                {
                    AssemblyNameReference systemRuntimeReference = moduleDef.AssemblyReferences.FirstOrDefault(x => x.Name == "System.Runtime");
                    targetPlatform = this.GetTargetPlatform(systemRuntimeReference);

                    if (targetPlatform != this.DefaultTargetPlatform)
                    {
                        this.assemblyFrameworkResolverCache.AddAssemblyTargetPlatformToCache(assemblyFilePath, targetPlatform);
                        this.assemblyFrameworkResolverCache.AddAssemblySystemRuntimeReference(assemblyFilePath, systemRuntimeReference);

                        return(targetPlatform);
                    }

                    // the next line is only to keep the old functionality
                    msCorlib = moduleDef.Assembly.Name;
                }

                if (moduleDef.Assembly != null && moduleDef.Assembly.Name.IsWindowsRuntime || msCorlib.IsFakeMscorlibReference())
                {
                    this.assemblyFrameworkResolverCache.AddAssemblyTargetPlatformToCache(assemblyFilePath, TargetPlatform.WinRT);
                    return(TargetPlatform.WinRT);
                }

                /*AssemblyName assemblyName = new AssemblyName(msCorlib.Name,
                 *                                  msCorlib.FullName,
                 *                                  msCorlib.Version,
                 *                                  msCorlib.PublicKeyToken,
                 *                                  Path.GetDirectoryName(assemliyFilePath)) { TargetArchitecture = moduleDef.GetModuleArchitecture() };
                 * IEnumerable<string> foundPaths = GetAssemblyPaths(assemblyName);
                 *
                 * return GetTargetPlatform(foundPaths.FirstOrDefault());*/

                /*Telerik Authorship*/
                if (targetPlatformFromDepsJson != null)
                {
                    targetPlatformFromDepsJson.Wait();
                    targetPlatform = targetPlatformFromDepsJson.Result;

                    if (targetPlatform != this.DefaultTargetPlatform)
                    {
                        this.assemblyFrameworkResolverCache.AddAssemblyTargetPlatformToCache(assemblyFilePath, targetPlatform);
                        return(targetPlatform);
                    }
                }

                /*Telerik Authorship*/
                TargetArchitecture moduleArchitecture = moduleDef.GetModuleArchitecture();
                /*Telerik Authorship*/
                foreach (KeyValuePair <AssemblyName, TargetPlatform> pair in Mscorlibs)
                {
                    if (AssemblyNameComparer.AreVersionEquals(pair.Key.Version, msCorlib.Version) &&
                        AssemblyNameComparer.ArePublicKeyEquals(pair.Key.PublicKeyToken, msCorlib.PublicKeyToken) &&
                        moduleArchitecture.CanReference(pair.Key.TargetArchitecture))
                    {
                        this.assemblyFrameworkResolverCache.AddAssemblyTargetPlatformToCache(assemblyFilePath, pair.Value);
                        return(pair.Value);
                    }
                }

                /*Telerik Authorship*/
                this.assemblyFrameworkResolverCache.AddAssemblyTargetPlatformToCache(assemblyFilePath, this.DefaultTargetPlatform);
                return(this.DefaultTargetPlatform);
            }
        }
Exemplo n.º 19
0
 /// <summary>
 /// 解析Assembly
 /// </summary>
 /// <param name="aname"></param>
 /// <returns></returns>
 public Assembly Resolve(AssemblyName aname)
 {
     return(AppDomain.CurrentDomain
            .GetAssemblies().FirstOrDefault(a => AssemblyNameComparer.Equals(aname, a.GetName())));
 }
 /// <summary>
 /// Finds an assembly that exactly matches the requested assembly
 /// </summary>
 /// <param name="assembly">Assembly name to find</param>
 /// <param name="paths">Search paths or <c>null</c> if none</param>
 /// <param name="moduleContext">Module context</param>
 /// <returns>An <see cref="AssemblyDef"/> instance or <c>null</c> if an exact match
 /// couldn't be found.</returns>
 AssemblyDef FindExactAssembly(AssemblyNameInfo assembly, IEnumerable<string> paths, ModuleContext moduleContext)
 {
     if (paths == null)
         return null;
     var asmComparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);
     foreach (var path in paths) {
         ModuleDefMD mod = null;
         try {
             mod = ModuleDefMD.Load(path, moduleContext);
             var asm = mod.Assembly;
             if (asm != null && asmComparer.Equals(assembly, new AssemblyNameInfo(asm))) {
                 mod = null;
                 return asm;
             }
         }
         catch {
         }
         finally {
             if (mod != null)
                 mod.Dispose();
         }
     }
     return null;
 }
        AssemblyDef FindClosestAssembly(AssemblyNameInfo assembly, AssemblyDef closest, IEnumerable<string> paths, ModuleContext moduleContext)
        {
            if (paths == null)
                return closest;
            var asmComparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);
            foreach (var path in paths) {
                ModuleDefMD mod = null;
                try {
                    mod = ModuleDefMD.Load(path, moduleContext);
                    var asm = mod.Assembly;
                    if (asm != null && asmComparer.CompareClosest(assembly, new AssemblyNameInfo(closest), new AssemblyNameInfo(asm)) == 1) {
                        if (!IsCached(closest) && closest != null && closest.ManifestModule != null)
                            closest.ManifestModule.Dispose();
                        closest = asm;
                        mod = null;
                    }
                }
                catch {
                }
                finally {
                    if (mod != null)
                        mod.Dispose();
                }
            }

            return closest;
        }
 /// <summary>
 /// Finds the closest assembly from the already cached assemblies
 /// </summary>
 /// <param name="assembly">Assembly name to find</param>
 /// <returns>The closest <see cref="AssemblyDef"/> or <c>null</c> if none found</returns>
 AssemblyDef FindClosestAssembly(AssemblyNameInfo assembly)
 {
     AssemblyDef closest = null;
     var asmComparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);
     foreach (var asm in cachedAssemblies.Values) {
         if (asm == null)
             continue;
         if (asmComparer.CompareClosest(assembly, new AssemblyNameInfo(closest), new AssemblyNameInfo(asm)) == 1)
             closest = asm;
     }
     return closest;
 }
Exemplo n.º 23
0
		public DnSpyFile FindAssembly(IAssembly assembly) {
			lock (lockObj) {
				var comparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);
				foreach (var file in files) {
					if (comparer.Equals(file.AssemblyDef, assembly))
						return file;
				}
				return null;
			}
		}
Exemplo n.º 24
0
		public void BreakOnLoadAssembly(IAssembly assembly, Action<IDebuggerAssembly> action, AssemblyNameComparerFlags flags) {
			if (assembly == null)
				throw new ArgumentNullException(nameof(assembly));
			assembly = assembly.ToAssemblyRef();// Prevent storing AssemblyDef refs
			// Use the LoadModule event since without a module, we won't know the full assembly name
			CreateBreakpoint(DebugEventKind.LoadModule, (bp, ctx) => {
				var c = (ModuleEventContext)ctx;
				var comparer = new AssemblyNameComparer(flags);
				var asm = c.Module.Assembly;
				if (!comparer.Equals(assembly, new AssemblyNameInfo(asm.FullName)))
					return false;
				bp.Remove();
				action?.Invoke(asm);
				return true;
			});
		}
Exemplo n.º 25
0
		public AssemblyDef Resolve(IAssembly assembly, ModuleDef sourceModule) {
			var resolver = Resolver;
			if (resolver == null)
				resolver = GetDefaultResolver();

			AssemblyDef result = resolver.Resolve(assembly, sourceModule);

			var comparer = new AssemblyNameComparer(AssemblyNameComparerFlags.All);
			AssemblyDef cachedResult;
			if (!LoadedAssemblies.TryGetValue(new AssemblyNameInfo(result), out cachedResult)) {
				Debug.Assert(!string.IsNullOrEmpty(result.ManifestModule.Location));
				// Resolving assemblies must be done in non-UI thread, or else Wait() will deadlock.
				Debug.Assert(Manager.InvokeRequired);
				Manager.LoadModule(result.ManifestModule.Location).Wait();
				cachedResult = LoadedAssemblies[new AssemblyNameInfo(result)];
				ResolveNetModules(cachedResult);
			}
			return cachedResult;
		}