コード例 #1
0
        private AssemblyNameInfo[] InjectMsTestIntoReferencedAssemblyNames(IMetadataAssembly assembly)
        {
            var referencedAssemblyNames = assembly.ReferencedAssembliesNames;
            var updatedReferencedAssemblyNames = new AssemblyNameInfo[referencedAssemblyNames.Length + 1];

            Array.Copy(referencedAssemblyNames, updatedReferencedAssemblyNames, referencedAssemblyNames.Length);
            updatedReferencedAssemblyNames[referencedAssemblyNames.Length] = new AssemblyNameInfo(DotNetMsTestAssemblyName);

            SetReferencedAssemblyNames(assembly, updatedReferencedAssemblyNames);

            return referencedAssemblyNames;
        }
コード例 #2
0
 public IMetadataAccess ResolveAssembly(AssemblyNameInfo name, out FileSystemPath assemblyLocation)
 {
     try
     {
         Assembly assembly = Assembly.Load(name.FullName);
         assemblyLocation = new FileSystemPath((AssemblyUtils.GetAssemblyLocalPath(assembly)));
         return MetadataProviderFactory.DefaultProvider.GetFromFile(assemblyLocation);
     }
     catch
     {
         assemblyLocation = null;
         return null;
     }
 }
コード例 #3
0
 public IEnumerable<FileSystemPath> GetAnnotationsFiles(AssemblyNameInfo assemblyName = null, FileSystemPath assemblyLocation = null)
 {
     if (assemblyName == null)
         return annotations.Values;
     return annotations[assemblyName.Name];
 }
コード例 #4
0
 private static string NameAndVersion([NotNull] this AssemblyNameInfo assemblyName)
 {
     return(string.Format("{0}, {1}", SanitizeAssemblyName(assemblyName.Name), assemblyName.Version));
 }
コード例 #5
0
 public IMetadataTypeInfo GetTypeInfoFromQualifiedName(string name, AssemblyNameInfo assemblyName, bool searchReferencedAssemblies)
 {
     return(_metadataAssembly.GetTypeInfoFromQualifiedName(name, assemblyName, searchReferencedAssemblies));
 }
コード例 #6
0
 public GacEntry(AssemblyNameInfo r, string fileName)
 {
     this.r        = r;
     this.fileName = fileName;
 }
コード例 #7
0
 /// <inheritdoc/>
 public AssemblyDef Resolve(AssemblyNameInfo assembly, ModuleDef sourceModule)
 {
     return(null);
 }
コード例 #8
0
 public IEnumerable<FileSystemPath> GetAnnotationsFiles(AssemblyNameInfo assemblyName,
     FileSystemPath assemblyLocation)
 {
     return extensionManager.IsInstalled() ? EmptyList<FileSystemPath>.InstanceList : myAnnotations[assemblyName.Name];
 }
コード例 #9
0
		/// <inheritdoc/>
		public AssemblyDef Resolve(AssemblyNameInfo assembly, ModuleDef sourceModule) {
			return null;
		}
コード例 #10
0
 private static bool ReferencesAssembly(IProject project, AssemblyNameInfo name)
 {
     AssemblyNameInfo info;
     return ReferencedAssembliesService.IsProjectReferencingAssemblyByName(project,
         project.GetCurrentTargetFrameworkId(), name, out info);
 }
コード例 #11
0
        /// <summary>
        /// Determinates whether member of the base type is visible from a derived type.
        /// </summary>
        /// <param name="baseMember">The member which visibility is checked.</param>
        /// <param name="derivedType">The derived type.</param>
        /// <returns>true if the member is visible from derived type, othewise false.</returns>
        public static bool IsVisibleFromDerived(IMemberDef?baseMember, TypeDef?derivedType)
        {
            if (baseMember is null)
            {
                return(false);
            }
            if (derivedType is null)
            {
                return(false);
            }

            MethodAttributes attrs = GetAccessAttributes(baseMember) & MethodAttributes.MemberAccessMask;

            if (attrs == MethodAttributes.Private)
            {
                return(false);
            }

            if (baseMember.DeclaringType.Module == derivedType.Module)
            {
                return(true);
            }

            if (attrs == MethodAttributes.Assembly || attrs == MethodAttributes.FamANDAssem)
            {
                var derivedTypeAsm = derivedType.Module.Assembly;
                var asm            = baseMember.DeclaringType.Module.Assembly;

                if (derivedTypeAsm is not null && asm is not null)
                {
                    foreach (var attribute in asm.CustomAttributes)
                    {
                        if (!Compare(attribute.AttributeType, systemRuntimeCompilerServicesString, internalsVisibleToAttributeString))
                        {
                            continue;
                        }
                        if (attribute.ConstructorArguments.Count == 0)
                        {
                            continue;
                        }
                        string assemblyName = attribute.ConstructorArguments[0].Value as UTF8String;
                        if (assemblyName is null)
                        {
                            continue;
                        }
                        assemblyName = new AssemblyNameInfo(assemblyName).Name;
                        if (StringComparer.OrdinalIgnoreCase.Equals(assemblyName, derivedTypeAsm.Name))
                        {
                            return(true);
                        }
                    }
                    foreach (var attribute in derivedTypeAsm.CustomAttributes)
                    {
                        if (!Compare(attribute.AttributeType, systemRuntimeCompilerServicesString, ignoresAccessChecksToAttributeString))
                        {
                            continue;
                        }
                        if (attribute.ConstructorArguments.Count == 0)
                        {
                            continue;
                        }
                        string assemblyName = attribute.ConstructorArguments[0].Value as UTF8String;
                        if (assemblyName is null)
                        {
                            continue;
                        }
                        assemblyName = new AssemblyNameInfo(assemblyName).Name;
                        if (StringComparer.OrdinalIgnoreCase.Equals(assemblyName, asm.Name))
                        {
                            return(true);
                        }
                    }
                }

                return(false);
            }

            return(true);
        }
コード例 #12
0
 public IMetadataTypeInfo GetTypeInfoFromQualifiedName(string name, AssemblyNameInfo assemblyName, bool searchReferencedAssemblies)
 {
     return _metadataAssembly.GetTypeInfoFromQualifiedName(name, assemblyName, searchReferencedAssemblies);
 }
コード例 #13
0
 public static bool IsProjectReferencingAssembly([CanBeNull] this IProjectElement projectElement, AssemblyNameInfo assemblyNameInfo)
 {
     AssemblyNameInfo referencedAssembly;
     return ReferencedAssembliesService.IsProjectReferencingAssemblyByName(projectElement, assemblyNameInfo, out referencedAssembly);
 }
コード例 #14
0
 private static AssemblyNameInfo MockAssemblyNameInfo(string name, string version)
 {
     return(AssemblyNameInfo.Create(name, new Version(version)));
 }
コード例 #15
0
 private static bool ReferencesAssembly(IProject project, TargetFrameworkId targetFrameworkId, AssemblyNameInfo name)
 {
     return(ReferencedAssembliesService.IsProjectReferencingAssemblyByName(project,
                                                                           targetFrameworkId, name, out var _));
 }
コード例 #16
0
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="asmName">Assembly name info</param>
		/// <exception cref="ArgumentNullException">If <paramref name="asmName"/> is <c>null</c></exception>
		public AssemblyRefUser(AssemblyNameInfo asmName) {
			if (asmName == null)
				throw new ArgumentNullException("asmName");

			this.version = asmName.Version ?? new Version(0, 0, 0, 0);
			this.publicKeyOrToken = asmName.PublicKeyOrToken;
			this.name = UTF8String.IsNullOrEmpty(asmName.Name) ? UTF8String.Empty : asmName.Name;
			this.locale = asmName.Locale;
			this.flags = publicKeyOrToken is PublicKey ? AssemblyAttributes.PublicKey : AssemblyAttributes.None;
		}
コード例 #17
0
        public static bool IsProjectReferencingAssembly([CanBeNull] this IProjectElement projectElement, AssemblyNameInfo assemblyNameInfo)
        {
            AssemblyNameInfo referencedAssembly;

            return(ReferencedAssembliesService.IsProjectReferencingAssemblyByName(projectElement, assemblyNameInfo, out referencedAssembly));
        }
コード例 #18
0
 public IEnumerable <FileSystemPath> GetAnnotationsFiles(AssemblyNameInfo assemblyName,
                                                         FileSystemPath assemblyLocation)
 {
     return(extensionManager.IsInstalled() ? EmptyList <FileSystemPath> .InstanceList : myAnnotations[assemblyName.Name]);
 }
コード例 #19
0
 private void SetReferencedAssemblyNames(IMetadataAssembly assembly, AssemblyNameInfo[] referencedAssemblyNames)
 {
     assembly.SetField("myReferencedAssembliesNames", referencedAssemblyNames);
 }
コード例 #20
0
        public IDnSpyFile Resolve(IAssembly assembly, ModuleDef sourceModule = null)
        {
            if (assembly.IsContentTypeWindowsRuntime)
            {
                if (failedAssemblyResolveCache.IsFailed(assembly))
                {
                    return(null);
                }
                var file = ResolveWinMD(assembly, sourceModule);
                if (file == null)
                {
                    failedAssemblyResolveCache.MarkFailed(assembly);
                }
                return(file);
            }
            else
            {
                // WinMD files have a reference to mscorlib but its version is always 255.255.255.255
                // since mscorlib isn't really loaded. The resolver only loads exact versions, so
                // we must change the version or the resolve will fail.
                if (assembly.Name == "mscorlib" && assembly.Version == invalidMscorlibVersion)
                {
                    assembly = new AssemblyNameInfo(assembly)
                    {
                        Version = newMscorlibVersion
                    }
                }
                ;

                if (failedAssemblyResolveCache.IsFailed(assembly))
                {
                    return(null);
                }
                var file = ResolveNormal(assembly, sourceModule);
                if (file == null)
                {
                    failedAssemblyResolveCache.MarkFailed(assembly);
                }
                return(file);
            }
        }

        IDnSpyFile ResolveNormal(IAssembly assembly, ModuleDef sourceModule)
        {
            var existingFile = fileManager.FindAssembly(assembly);

            if (existingFile != null)
            {
                return(existingFile);
            }

            var file = LookupFromSearchPaths(assembly, sourceModule, true);

            if (file != null)
            {
                return(fileManager.GetOrAddCanDispose(file));
            }

            if (fileManager.Settings.UseGAC)
            {
                var gacFile = GacInfo.FindInGac(assembly);
                if (gacFile != null)
                {
                    return(fileManager.TryGetOrCreateInternal(DnSpyFileInfo.CreateFile(gacFile), true, true));
                }
                foreach (var path in GacInfo.OtherGacPaths)
                {
                    file = TryLoadFromDir(assembly, true, path);
                    if (file != null)
                    {
                        return(fileManager.GetOrAddCanDispose(file));
                    }
                }
            }

            file = LookupFromSearchPaths(assembly, sourceModule, false);
            if (file != null)
            {
                return(fileManager.GetOrAddCanDispose(file));
            }

            return(null);
        }

        IDnSpyFile LookupFromSearchPaths(IAssembly asmName, ModuleDef sourceModule, bool exactCheck)
        {
            IDnSpyFile file;
            string     sourceModuleDir = null;

            if (sourceModule != null && File.Exists(sourceModule.Location))
            {
                sourceModuleDir = Path.GetDirectoryName(sourceModule.Location);
                file            = TryLoadFromDir(asmName, exactCheck, sourceModuleDir);
                if (file != null)
                {
                    return(file);
                }
            }
            var ary = asmSearchPathsArray;

            foreach (var path in ary)
            {
                file = TryLoadFromDir(asmName, exactCheck, path);
                if (file != null)
                {
                    return(file);
                }
            }

            return(null);
        }

        IDnSpyFile TryLoadFromDir(IAssembly asmName, bool exactCheck, string dirPath)
        {
            string baseName;

            try {
                baseName = Path.Combine(dirPath, asmName.Name);
            }
            catch (ArgumentException) {             // eg. invalid chars in asmName.Name
                return(null);
            }
            return(TryLoadFromDir2(asmName, exactCheck, baseName + ".dll") ??
                   TryLoadFromDir2(asmName, exactCheck, baseName + ".exe"));
        }

        IDnSpyFile TryLoadFromDir2(IAssembly asmName, bool exactCheck, string filename)
        {
            if (!File.Exists(filename))
            {
                return(null);
            }

            IDnSpyFile file  = null;
            bool       error = true;

            try {
                file = fileManager.TryCreateDnSpyFile(DnSpyFileInfo.CreateFile(filename));
                if (file == null)
                {
                    return(null);
                }
                file.IsAutoLoaded = true;
                var asm = file.AssemblyDef;
                if (asm == null)
                {
                    return(null);
                }
                bool b = exactCheck ?
                         AssemblyNameComparer.CompareAll.Equals(asmName, asm) :
                         AssemblyNameComparer.NameAndPublicKeyTokenOnly.Equals(asmName, asm);
                if (!b)
                {
                    return(null);
                }

                error = false;
                return(file);
            }
            finally {
                if (error)
                {
                    if (file is IDisposable)
                    {
                        ((IDisposable)file).Dispose();
                    }
                }
            }
        }

        IDnSpyFile ResolveWinMD(IAssembly assembly, ModuleDef sourceModule)
        {
            var existingFile = fileManager.FindAssembly(assembly);

            if (existingFile != null)
            {
                return(existingFile);
            }

            foreach (var winmdPath in GacInfo.WinmdPaths)
            {
                string file;
                try {
                    file = Path.Combine(winmdPath, assembly.Name + ".winmd");
                }
                catch (ArgumentException) {
                    continue;
                }
                if (File.Exists(file))
                {
                    return(fileManager.TryGetOrCreateInternal(DnSpyFileInfo.CreateFile(file), true, true));
                }
            }
            return(null);
        }
    }
コード例 #21
0
ファイル: GacInfo.cs プロジェクト: azureidea/dnSpy-1
 static IEnumerable <GacFileInfo> GetAssemblies(GacDirInfo gacInfo)
 {
     foreach (var subDir in gacInfo.SubDirs)
     {
         var baseDir = Path.Combine(gacInfo.Path, subDir);
         foreach (var dir in GetDirectories(baseDir))
         {
             foreach (var dir2 in GetDirectories(dir))
             {
                 Version        version;
                 string         culture;
                 PublicKeyToken pkt;
                 if (gacInfo.Version == 2)
                 {
                     var m = gac2Regex.Match(Path.GetFileName(dir2));
                     if (!m.Success || m.Groups.Count != 4)
                     {
                         continue;
                     }
                     if (!Version.TryParse(m.Groups[1].Value, out version))
                     {
                         continue;
                     }
                     culture = m.Groups[2].Value;
                     pkt     = new PublicKeyToken(m.Groups[3].Value);
                     if (PublicKeyBase.IsNullOrEmpty2(pkt))
                     {
                         continue;
                     }
                 }
                 else if (gacInfo.Version == 4)
                 {
                     var m = gac4Regex.Match(Path.GetFileName(dir2));
                     if (!m.Success || m.Groups.Count != 4)
                     {
                         continue;
                     }
                     if (!Version.TryParse(m.Groups[1].Value, out version))
                     {
                         continue;
                     }
                     culture = m.Groups[2].Value;
                     pkt     = new PublicKeyToken(m.Groups[3].Value);
                     if (PublicKeyBase.IsNullOrEmpty2(pkt))
                     {
                         continue;
                     }
                 }
                 else
                 {
                     throw new InvalidOperationException();
                 }
                 var asmName = Path.GetFileName(dir);
                 var file    = Path.Combine(dir2, asmName) + ".dll";
                 if (!File.Exists(file))
                 {
                     file = Path.Combine(dir2, asmName) + ".exe";
                     if (!File.Exists(file))
                     {
                         continue;
                     }
                 }
                 var asmInfo = new AssemblyNameInfo {
                     Name             = asmName,
                     Version          = version,
                     Culture          = culture,
                     PublicKeyOrToken = pkt,
                 };
                 yield return(new GacFileInfo(asmInfo, file));
             }
         }
     }
 }
コード例 #22
0
            public AssemblyDef Resolve(AssemblyNameInfo assembly, ModuleDef sourceModule)
            {
                var node = parent.LookupReferencedAssembly(assembly);

                return(node != null ? node.AssemblyDefinition : null);
            }