예제 #1
0
        internal SystemAssembly AddAssembly(string assemblyfile, AssemblyInfo ainfo, SystemPackage package)
        {
            if (!File.Exists(assemblyfile))
            {
                return(null);
            }

            try {
                SystemAssembly asm = SystemAssembly.FromFile(assemblyfile, ainfo);
                SystemAssembly prevAsm;
                if (assemblyFullNameToAsm.TryGetValue(asm.FullName, out prevAsm))
                {
                    asm.NextSameName     = prevAsm.NextSameName;
                    prevAsm.NextSameName = asm;
                }
                else
                {
                    assemblyFullNameToAsm [asm.FullName] = asm;
                }
                assemblyPathToPackage [assemblyfile] = package;
                return(asm);
            } catch {
                return(null);
            }
        }
예제 #2
0
        SystemPackage RegisterPackage(SystemPackageInfo pinfo, bool isInternal, PackageAssemblyInfo[] assemblyFiles)
        {
            //don't allow packages to duplicate framework packages
            SystemPackage oldPackage;

            if (packagesHash.TryGetValue(pinfo.Name, out oldPackage))
            {
                if (oldPackage.IsFrameworkPackage)
                {
                    return(oldPackage);
                }
                else if (pinfo.IsFrameworkPackage)
                {
                    ForceUnregisterPackage(oldPackage);
                }
            }

            SystemPackage         p    = new SystemPackage();
            List <SystemAssembly> asms = new List <SystemAssembly> ();

            foreach (PackageAssemblyInfo asm in assemblyFiles)
            {
                asms.Add(AddAssembly(asm.File, new AssemblyInfo(asm), p));
            }
            p.Initialize(pinfo, asms, isInternal);
            packages.Add(p);
            packagesHash [pinfo.Name] = p;

            NotifyChanged();

            return(p);
        }
예제 #3
0
		SystemPackage RegisterPackage (SystemPackageInfo pinfo, bool isInternal, PackageAssemblyInfo[] assemblyFiles)
		{
			//don't allow packages to duplicate framework packages
			SystemPackage oldPackage;
			if (packagesHash.TryGetValue (pinfo.Name, out oldPackage)) {
				if (oldPackage.IsFrameworkPackage)
					return oldPackage;
				else if (pinfo.IsFrameworkPackage)
					ForceUnregisterPackage (oldPackage);
			}
			
			SystemPackage p = new SystemPackage ();
			List<SystemAssembly> asms = new List<SystemAssembly> ();
			foreach (PackageAssemblyInfo asm in assemblyFiles) {
				if (pinfo.IsFrameworkPackage || !GetAssembliesFromFullNameInternal (asm.FullName, false).Any (a => a.Package != null && a.Package.IsFrameworkPackage))
					asms.Add (AddAssembly (asm.File, new AssemblyInfo (asm), p));
			}
			p.Initialize (pinfo, asms, isInternal);
			packages.Add (p);
			packagesHash [pinfo.Name] = p;
			
			NotifyChanged ();
			
			return p;
		}
예제 #4
0
        internal protected void UnregisterPackage(SystemPackage p)
        {
            if (!p.IsInternalPackage)
            {
                throw new InvalidOperationException("Only internal packages can be unregistered");
            }

            ForceUnregisterPackage(p);
        }
예제 #5
0
        void RegisterPcFile(string file)
        {
            LibraryPackageInfo pinfo = MonoTargetRuntime.PcFileCache.GetPackageInfo(file);

            if (pinfo.IsValidPackage)
            {
                SystemPackage sp = RegisterPackage(pinfo, true);
                packages.Add(sp);
            }
        }
예제 #6
0
        void ForceUnregisterPackage(SystemPackage p)
        {
            foreach (SystemAssembly asm in p.Assemblies)
            {
                RemoveAssembly(asm);
            }

            packages.Remove(p);
            packagesHash.Remove(p.Name);
            NotifyChanged();
        }
예제 #7
0
 public SystemPackage GetPackageFromPath(string assemblyPath)
 {
     foreach (TargetRuntime r in runtimes)
     {
         SystemPackage p = r.AssemblyContext.GetPackageFromPath(assemblyPath);
         if (p != null)
         {
             return(p);
         }
     }
     return(null);
 }
 public SystemPackage GetPackageFromPath(string path)
 {
     foreach (IAssemblyContext ctx in sources)
     {
         SystemPackage sp = ctx.GetPackageFromPath(path);
         if (sp != null)
         {
             return(sp);
         }
     }
     return(null);
 }
 public SystemPackage GetPackage(string name, string version)
 {
     foreach (IAssemblyContext ctx in sources)
     {
         SystemPackage sp = ctx.GetPackage(name, version);
         if (sp != null)
         {
             return(sp);
         }
     }
     return(null);
 }
예제 #10
0
        internal void InternalAddPackage(SystemPackage package)
        {
            SystemPackage oldPackage;

            if (package.IsFrameworkPackage && !string.IsNullOrEmpty(package.Name) &&
                packagesHash.TryGetValue(package.Name, out oldPackage) && !oldPackage.IsFrameworkPackage)
            {
                ForceUnregisterPackage(oldPackage);
            }
            packagesHash [package.Name] = package;
            packages.Add(package);
        }
예제 #11
0
        void RegisterAssembly(string file)
        {
            SystemPackageInfo spi = new SystemPackageInfo();

            spi.Name            = file;
            spi.Description     = Path.GetDirectoryName(file);
            spi.Version         = "";
            spi.IsGacPackage    = false;
            spi.TargetFramework = Runtime.SystemAssemblyService.GetTargetFrameworkForAssembly(Runtime.SystemAssemblyService.CurrentRuntime, file);

            SystemPackage sp = RegisterPackage(spi, true, file);

            packages.Add(sp);
        }
예제 #12
0
        void RegisterSystemAssemblies(TargetFramework fx)
        {
            Dictionary <string, List <SystemAssembly> > assemblies = new Dictionary <string, List <SystemAssembly> > ();
            Dictionary <string, SystemPackage>          packs      = new Dictionary <string, SystemPackage> ();

            IEnumerable <string> dirs = GetFrameworkFolders(fx);

            foreach (AssemblyInfo assembly in fx.Assemblies)
            {
                foreach (string dir in dirs)
                {
                    string file = Path.Combine(dir, assembly.Name) + ".dll";
                    if (File.Exists(file))
                    {
                        if (assembly.Version == null && IsRunning)
                        {
                            try {
                                System.Reflection.AssemblyName aname = SystemAssemblyService.GetAssemblyNameObj(file);
                                assembly.Update(aname);
                            } catch {
                                // If something goes wrong when getting the name, just ignore the assembly
                            }
                        }
                        string        pkg = assembly.Package ?? string.Empty;
                        SystemPackage package;
                        if (!packs.TryGetValue(pkg, out package))
                        {
                            packs [pkg]      = package = new SystemPackage();
                            assemblies [pkg] = new List <SystemAssembly> ();
                        }
                        List <SystemAssembly> list = assemblies [pkg];
                        list.Add(assemblyContext.AddAssembly(file, assembly, package));
                        break;
                    }
                }
            }

            foreach (string pkg in packs.Keys)
            {
                SystemPackage         package = packs [pkg];
                List <SystemAssembly> list    = assemblies [pkg];
                SystemPackageInfo     info    = GetFrameworkPackageInfo(fx, pkg);
                if (!info.IsCorePackage)
                {
                    corePackages.Add(info.Name);
                }
                package.Initialize(info, list.ToArray(), false);
                assemblyContext.InternalAddPackage(package);
            }
        }
예제 #13
0
        void RegisterSystemAssemblies(TargetFramework fx)
        {
            var assemblies = new List <SystemAssembly> ();
            var package    = new SystemPackage();

            foreach (AssemblyInfo assembly in fx.Assemblies)
            {
                var file = Path.Combine(fx.FrameworkAssembliesDirectory, assembly.Name + ".dll");
                assemblies.Add(assemblyContext.AddAssembly(file, assembly, package));
            }

            SystemPackageInfo info = GetFrameworkPackageInfo(fx, "");

            package.Initialize(info, assemblies, false);
            if (!info.IsCorePackage)
            {
                corePackages.Add(info.Name);
            }
            assemblyContext.InternalAddPackage(package);
        }
예제 #14
0
        SystemPackage RegisterPackage(SystemPackageInfo pinfo, bool isInternal, PackageAssemblyInfo[] assemblyFiles)
        {
            //don't allow packages to duplicate framework package names
            //but multiple framework packages (from different versions) may have the same name
            SystemPackage oldPackage;

            if (packagesHash.TryGetValue(pinfo.Name, out oldPackage))
            {
                if (pinfo.IsFrameworkPackage)
                {
                    if (!oldPackage.IsFrameworkPackage)
                    {
                        ForceUnregisterPackage(oldPackage);
                    }
                }
                else if (oldPackage.IsFrameworkPackage)
                {
                    return(oldPackage);
                }
            }

            SystemPackage         p    = new SystemPackage();
            List <SystemAssembly> asms = new List <SystemAssembly> ();

            foreach (PackageAssemblyInfo asm in assemblyFiles)
            {
                if (pinfo.IsFrameworkPackage || !GetAssembliesFromFullNameInternal(asm.FullName, false).Any(a => a.Package != null && a.Package.IsFrameworkPackage))
                {
                    asms.Add(AddAssembly(asm.File, new AssemblyInfo(asm), p));
                }
            }
            p.Initialize(pinfo, asms, isInternal);
            packages.Add(p);
            packagesHash [pinfo.Name] = p;

            NotifyChanged();

            return(p);
        }
예제 #15
0
        void OnPackagesChanged(object s, ExtensionNodeEventArgs args)
        {
            PackageExtensionNode node = (PackageExtensionNode)args.ExtensionNode;
            SystemPackageInfo    pi   = node.GetPackageInfo();

            if (args.Change == ExtensionChange.Add)
            {
                var existing = assemblyContext.GetPackageInternal(pi.Name);
                if (existing == null || (!existing.IsFrameworkPackage || pi.IsFrameworkPackage))
                {
                    RegisterPackage(pi, node.Assemblies);
                }
            }
            else
            {
                SystemPackage p = assemblyContext.GetPackage(pi.Name, pi.Version);
                if (p.IsInternalPackage)
                {
                    assemblyContext.UnregisterPackage(pi.Name, pi.Version);
                }
            }
        }
예제 #16
0
		/*
		void AddRequiredPackages (List<string> result, SystemPackage fromPackage)
		{
			if (fromPackage == null || string.IsNullOrEmpty (fromPackage.Requires))
				return;
			foreach (string requiredPackageName in fromPackage.Requires.Split (' ')) {
				SystemPackage package = AssemblyContext.GetPackage (requiredPackageName);
				if (package == null)
					continue;
				foreach (SystemAssembly assembly in package.Assemblies) {
					if (assembly == null)
						continue;
					string location = AssemblyContext.GetAssemblyLocation (assembly.FullName, ownerProject != null ? ownerProject.TargetFramework : null);
					result.Add (location);
				}
				AddRequiredPackages (result, package);
			}
		}*/
		
		void UpdatePackageReference ()
		{
			if (referenceType == ReferenceType.Package && ownerProject != null) {
				notFound = false;
				string cref = AssemblyContext.FindInstalledAssembly (reference, package, ownerProject.TargetFramework);
				if (cref == null)
					cref = reference;
				cref = AssemblyContext.GetAssemblyNameForVersion (cref, package, ownerProject.TargetFramework);
				notFound = (cref == null);
				if (cref != null && cref != reference) {
					SystemAssembly asm = AssemblyContext.GetAssemblyFromFullName (cref, package, ownerProject.TargetFramework);
					bool isFrameworkAssembly = asm != null && asm.Package.IsFrameworkPackage;
					if (loadedReference == null && !isFrameworkAssembly) {
						loadedReference = reference;
					}
					reference = cref;
				}
				cachedPackage = null;
				OnStatusChanged ();
			}
		}
예제 #17
0
		internal void InternalAddPackage (SystemPackage package)
		{
			SystemPackage oldPackage;
			if (package.IsFrameworkPackage && !string.IsNullOrEmpty (package.Name)
			    && packagesHash.TryGetValue (package.Name, out oldPackage) && !oldPackage.IsFrameworkPackage) {
				ForceUnregisterPackage (oldPackage);
			}
			packagesHash [package.Name] = package;
			packages.Add (package);
		}
예제 #18
0
		internal SystemAssembly AddAssembly (string assemblyfile, AssemblyInfo ainfo, SystemPackage package)
		{
			if (!File.Exists (assemblyfile))
				return null;

			try {
				SystemAssembly asm = SystemAssembly.FromFile (assemblyfile, ainfo);
				SystemAssembly prevAsm;
				if (assemblyFullNameToAsm.TryGetValue (asm.FullName, out prevAsm)) {
					asm.NextSameName = prevAsm.NextSameName;
					prevAsm.NextSameName = asm;
				} else
					assemblyFullNameToAsm [asm.FullName] = asm;
				assemblyPathToPackage [assemblyfile] = package;
				return asm;
			} catch {
				return null;
			}
		}
예제 #19
0
		void ForceUnregisterPackage (SystemPackage p)
		{
			foreach (SystemAssembly asm in p.Assemblies)
				RemoveAssembly (asm);
			
			packages.Remove (p);
			packagesHash.Remove (p.Name);
			NotifyChanged ();
		}
예제 #20
0
		internal protected void UnregisterPackage (SystemPackage p)
		{
			if (!p.IsInternalPackage)
				throw new InvalidOperationException ("Only internal packages can be unregistered");
			
			ForceUnregisterPackage (p);
		}
예제 #21
0
        internal protected void UnregisterPackage(string name, string version)
        {
            SystemPackage p = GetPackage(name, version);

            UnregisterPackage(p);
        }
		void RegisterSystemAssemblies (TargetFramework fx)
		{
			Dictionary<string,List<SystemAssembly>> assemblies = new Dictionary<string, List<SystemAssembly>> ();
			Dictionary<string,SystemPackage> packs = new Dictionary<string, SystemPackage> ();
			
			IEnumerable<string> dirs = GetFrameworkFolders (fx);

			foreach (AssemblyInfo assembly in fx.Assemblies) {
				foreach (string dir in dirs) {
					string file = Path.Combine (dir, assembly.Name) + ".dll";
					if (File.Exists (file)) {
						if (assembly.Version == null && IsRunning) {
							try {
								AssemblyName aname = SystemAssemblyService.GetAssemblyNameObj (file);
								assembly.Update (aname);
							} catch {
								// If something goes wrong when getting the name, just ignore the assembly
							}
						}
						string pkg = assembly.Package ?? string.Empty;
						SystemPackage package;
						if (!packs.TryGetValue (pkg, out package)) {
							packs [pkg] = package = new SystemPackage ();
							assemblies [pkg] = new List<SystemAssembly> ();
						}
						List<SystemAssembly> list = assemblies [pkg];
						list.Add (assemblyContext.AddAssembly (file, assembly, package));
						break;
					}
				}
			}
			
			foreach (string pkg in packs.Keys) {
				SystemPackage package = packs [pkg];
				List<SystemAssembly> list = assemblies [pkg];
				SystemPackageInfo info = GetFrameworkPackageInfo (fx, pkg);
				if (!info.IsCorePackage)
					corePackages.Add (info.Name);
				package.Initialize (info, list.ToArray (), false);
				assemblyContext.InternalAddPackage (package);
			}
		}
예제 #23
0
		internal void ResetReference ()
		{
			cachedPackage = null;
			if (loadedReference != null) {
				reference = loadedReference;
				loadedReference = null;
				UpdatePackageReference ();
			} else
				UpdatePackageReference ();
		}
		SystemPackage RegisterPackage (SystemPackageInfo pinfo, bool isInternal, PackageAssemblyInfo[] assemblyFiles)
		{
			//don't allow packages to duplicate framework package names
			//but multiple framework packages (from different versions) may have the same name
			SystemPackage oldPackage;
			if (packagesHash.TryGetValue (pinfo.Name, out oldPackage)) {
				if (pinfo.IsFrameworkPackage) {
					if (!oldPackage.IsFrameworkPackage)
						ForceUnregisterPackage (oldPackage);
				} else if (oldPackage.IsFrameworkPackage) {
					return oldPackage;
				}
			}
			
			SystemPackage p = new SystemPackage ();
			List<SystemAssembly> asms = new List<SystemAssembly> ();
			foreach (PackageAssemblyInfo asm in assemblyFiles) {
				if (pinfo.IsFrameworkPackage || !GetAssembliesFromFullNameInternal (asm.FullName, false).Any (a => a.Package != null && a.Package.IsFrameworkPackage))
					asms.Add (AddAssembly (asm.File, new AssemblyInfo (asm), p));
			}
			p.Initialize (pinfo, asms, isInternal);
			packages = packages.Add (p);
			packagesHash = packagesHash.SetItem (pinfo.Name, p);
			
			NotifyChanged ();
			
			return p;
		}