Пример #1
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);
        }
Пример #2
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);
        }
Пример #3
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);
                    }
                }
            }
        }
Пример #4
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);
            }
Пример #5
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);
		}
Пример #6
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);
        }
Пример #7
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)));
 }
Пример #8
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);
        }
Пример #9
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);
        }
Пример #10
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);
     }
 }
Пример #11
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);
        }
Пример #12
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);
     });
 }
Пример #13
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);
        }
Пример #14
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);
        }
 /// <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;
 }
Пример #16
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;
			}
		}
Пример #17
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;
			});
		}
Пример #18
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())));
 }