internal void Initialize (SystemPackageInfo info, IEnumerable<SystemAssembly> assemblies, bool isInternal)
		{
			this.isInternal = isInternal;
			this.name = info.Name ?? string.Empty;
			this.version = info.Version ?? string.Empty;
			this.description = info.Description ?? string.Empty;
			this.targetFramework = info.TargetFramework;
			this.gacRoot = info.GacRoot;
			this.gacPackage = info.IsGacPackage;
			IsFrameworkPackage = info.IsFrameworkPackage;
			IsCorePackage = info.IsCorePackage;
			IsBaseCorePackage = info.IsBaseCorePackage;
			this.Requires = info.Requires;
			SystemAssembly last = null;
			foreach (SystemAssembly asm in assemblies) {
				if (asm == null)
					continue;
				asm.Package = this;
				if (this.assemblies == null)
					this.assemblies = asm;
				else
					last.NextSamePackage = asm;
				last = asm;
			}
		}
示例#2
0
        public virtual string GetAssemblyLocation(string assemblyName, string package, TargetFramework fx)
        {
            Initialize();

            assemblyName = NormalizeAsmName(assemblyName);

            SystemAssembly asm = GetAssemblyFromFullName(assemblyName, package, fx);

            if (asm != null)
            {
                return(asm.Location);
            }

            return(null);
        }
示例#3
0
        // Given the full name of an assembly, returns the corresponding full assembly name
        // in the specified target CLR version, or null if it doesn't exist in that version.
        public SystemAssembly GetAssemblyForVersion(string fullName, string packageName, TargetFramework fx)
        {
            Initialize();

            fullName = NormalizeAsmName(fullName);

            //get the SystemAssembly for the current fullname, NOT the new target fx
            //in order to be able to check whether it's a framework assembly
            SystemAssembly asm = GetAssemblyFromFullName(fullName, packageName, null);

            if (asm == null)
            {
                return(null);
            }

            var fxAsms = asm.AllSameName().Where(a => a.Package.IsFrameworkPackage).ToList();

            //if the asm is not a framework asm, we don't upgrade it automatically
            if (!fxAsms.Any())
            {
                // Return null if the package is not compatible with the requested version
                if (fx.CanReferenceAssembliesTargetingFramework(asm.Package.TargetFramework))
                {
                    return(asm);
                }
                else
                {
                    return(null);
                }
            }

            var bestFx = BestFrameworkAssembly(fxAsms, fx);

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

            // We have to find the assembly with the same name in the target fx
            string fname = Path.GetFileName(fxAsms.First().Location);

            var possible = packages.Where(p => p.IsFrameworkPackage && fx.IncludesFramework(p.TargetFramework))
                           .SelectMany(p => p.Assemblies)
                           .Where(a => Path.GetFileName(a.Location) == fname)
                           .ToList();

            return(BestFrameworkAssembly(possible));
        }
        IEnumerable <SystemAssembly> FindNewerAssembliesSameName(string fullname)
        {
            AssemblyName reqName = ParseAssemblyName(fullname);

            foreach (KeyValuePair <string, SystemAssembly> pair in assemblyFullNameToAsm)
            {
                AssemblyName foundName = ParseAssemblyName(pair.Key);
                if (reqName.Name == foundName.Name && (reqName.Version == null || reqName.Version.CompareTo(foundName.Version) < 0))
                {
                    SystemAssembly asm = pair.Value;
                    while (asm != null)
                    {
                        yield return(asm);

                        asm = asm.NextSameName;
                    }
                }
            }
        }
        void RemoveAssembly(SystemAssembly asm)
        {
            SystemAssembly ca;

            if (!assemblyFullNameToAsm.TryGetValue(asm.FullName, out ca))
            {
                return;
            }

            assemblyPathToPackage.Remove(asm.Location);

            SystemAssembly prev = null;

            do
            {
                if (ca == asm)
                {
                    if (prev != null)
                    {
                        prev.NextSameName = ca.NextSameName;
                    }
                    else if (ca.NextSameName != null)
                    {
                        assemblyFullNameToAsm [asm.FullName] = ca.NextSameName;
                    }
                    else
                    {
                        assemblyFullNameToAsm.Remove(asm.FullName);
                    }
                    break;
                }
                else
                {
                    prev = ca;
                    ca   = ca.NextSameName;
                }
            } while (ca != null);
        }
示例#6
0
        public SystemAssembly GetAssemblyFromFullName(string fullname, string package, TargetFramework fx)
        {
            if (package == null)
            {
                SystemAssembly found    = null;
                SystemAssembly gacFound = null;
                foreach (SystemAssembly asm in GetAssembliesFromFullNameInternal(fullname))
                {
                    if (asm.Package.IsFrameworkPackage && fx != null)
                    {
                        if (fx.IncludesFramework(asm.Package.TargetFramework))
                        {
                            return(asm);
                        }
                        else
                        {
                            continue;
                        }
                    }
                    found = asm;
                    if (asm.Package.IsGacPackage)
                    {
                        gacFound = asm;
                    }
                }
                return(gacFound ?? found);
            }

            foreach (SystemAssembly asm in GetAssembliesFromFullNameInternal(fullname))
            {
                if (package == asm.Package.Name)
                {
                    return(asm);
                }
            }
            return(null);
        }
		internal static bool CanBeReferenced (Project project, SystemAssembly systemAssembly)
		{
			var netProject = project as DotNetProject;
			if (netProject == null)
				return false;
			var result = netProject.TargetRuntime.AssemblyContext.GetAssemblyNameForVersion(systemAssembly.FullName, netProject.TargetFramework);
			return !string.IsNullOrEmpty (result);
		}
 /// <summary>
 ///   Determines whether the specified reference is a Monobjc one.
 /// </summary>
 /// <param name = "assembly">The assembly.</param>
 /// <returns>
 ///   <c>true</c> if the specified reference is a Monobjc one; otherwise, <c>false</c>.
 /// </returns>
 public static bool IsMonobjcReference(SystemAssembly assembly)
 {
     return assembly.Name.StartsWith ("Monobjc");
 }
示例#9
0
		void RemoveAssembly (SystemAssembly asm)
		{
			SystemAssembly ca;
			if (!assemblyFullNameToAsm.TryGetValue (asm.FullName, out ca))
				return;
			
			assemblyPathToPackage.Remove (asm.Location);
			
			SystemAssembly prev = null;
			do {
				if (ca == asm) {
					if (prev != null)
						prev.NextSameName = ca.NextSameName;
					else if (ca.NextSameName != null)
						assemblyFullNameToAsm [asm.FullName] = ca.NextSameName;
					else
						assemblyFullNameToAsm.Remove (asm.FullName);
					break;
				} else {
					prev = ca;
					ca = ca.NextSameName;
				}
			} while (ca != null);
		}
示例#10
0
		ProjectReference AddNewGacReference (DotNetProject project, SystemAssembly sa)
		{
			ProjectReference pref = new ProjectReference (sa);
			project.References.Add (pref);
			newGacRefs [sa.Location] = pref;

			return pref;
		}
示例#11
0
		public ProjectReference (SystemAssembly asm)
		{
			referenceType = ReferenceType.Package;
			reference = asm.FullName;
			if (asm.Package.IsFrameworkPackage)
				specificVersion = false;
			if (!asm.Package.IsGacPackage)
				package = asm.Package.Name;
			UpdatePackageReference ();
		}
		public ProjectReference (SystemAssembly asm)
		{
			referenceType = ReferenceType.Gac;
			reference = asm.FullName;
			if (!asm.Package.IsGacPackage)
				package = asm.Package.Name;
			UpdateGacReference ();
		}
示例#13
0
        // Returns the installed version of the given assembly name
        // (it returns the full name of the installed assembly).
        public string FindInstalledAssembly(string fullname, string package, TargetFramework fx)
        {
            Initialize();
            var assemblyName  = ParseAssemblyName(fullname);
            var version       = assemblyName.Version;
            var stringVersion = version?.ToString();

            fullname = assemblyName.Name;

            SystemAssembly fasm = GetAssemblyFromFullName(fullname, package, fx);

            if (fasm != null)
            {
                return(fullname);
            }

            // Try to find a newer version of the same assembly, preferring framework assemblies
            if (fx == null)
            {
                string best = null;
                foreach (SystemAssembly asm in FindNewerAssembliesSameName(fullname))
                {
                    if (package == null || asm.Package.Name == package)
                    {
                        if (asm.Package.IsFrameworkPackage)
                        {
                            return(asm.FullName);
                        }
                        else
                        {
                            best = asm.FullName;
                        }
                    }
                }
                return(best);
            }


            var asms = FindNewerAssembliesSameName(fullname).ToList();

            if (fx != null)
            {
                var fxAsm = BestFrameworkAssembly(asms, fx, version);
                if (fxAsm != null)
                {
                    return(fxAsm.FullName);
                }
            }

            string bestMatch = null;

            foreach (SystemAssembly asm in asms)
            {
                if (fx.CanReferenceAssembliesTargetingFramework(asm.Package.TargetFramework) &&
                    (stringVersion == null || stringVersion == asm.Version))
                {
                    if (package != null && asm.Package.Name == package)
                    {
                        return(asm.FullName);
                    }
                    bestMatch = asm.FullName;
                }
            }
            return(bestMatch);
        }
示例#14
0
		public static ProjectReference CreateAssemblyReference (SystemAssembly asm)
		{
			return new ProjectReference (asm);
		}
示例#15
0
		ProjectReference (SystemAssembly asm)
		{
			Init (ReferenceType.Package, asm.FullName, null);
			if (asm.Package.IsFrameworkPackage)
				specificVersion = false;
			if (!asm.Package.IsGacPackage)
				package = asm.Package.Name;
			UpdatePackageReference ();
		}
		public ImplicitFrameworkAssemblyReference (SystemAssembly assembly)
		{
			this.Assembly = assembly;
		}
示例#17
0
		ProjectReference AddNewPackageReference (DotNetProject project, SystemAssembly sa)
		{
			ProjectReference pref = ProjectReference.CreateAssemblyReference (sa);
			project.References.Add (pref);
			newPackageRefs [sa.Location] = pref;

			return pref;
		}