/// <summary> /// Add or remove library directories and linker dependencies in VC-project. /// </summary> public static void ManageLinkerDefinitions(this Project project, PackageReference packageReference, IEnumerable<Project> projects, IEnumerable<LibraryReference> libraries) { var path = string.Format(@"{0}\lib\{1}\", Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), packageReference.CanonicalName.Architecture); foreach (var configuration in project.GetConfigurations()) { var value = project.GetDefinitionValue(configuration, "AdditionalLibraryDirectories"); var paths = new HashSet<string>(value.Split(';')); if (projects.Any(n => n.FullName == project.FullName)) { paths.Add(path); } else { paths.Remove(path); } project.SetDefinitionValue(configuration, "AdditionalLibraryDirectories", string.Join(";", paths)); var configLibraries = libraries.Where(lib => lib.ConfigurationName == configuration); value = project.GetDefinitionValue(configuration, "AdditionalDependencies"); var current = value.Split(';'); var removed = configLibraries.Where(n => !n.IsChecked) .Select(n => Path.GetFileNameWithoutExtension(n.Name) + "-" + packageReference.CanonicalName.Version + ".lib"); var added = configLibraries.Where(n => n.IsChecked) .Select(n => Path.GetFileNameWithoutExtension(n.Name) + "-" + packageReference.CanonicalName.Version + ".lib"); var result = current.Except(removed) .Union(added); project.SetDefinitionValue(configuration, "AdditionalDependencies", string.Join(";", result)); } }
/// <summary> /// Add or remove references in .NET-project. /// </summary> public static void ManageReferences(this Project project, PackageReference packageReference, IEnumerable<LibraryReference> libraries) { string path = string.Format(@"{0}\ReferenceAssemblies\{1}\{2}\{3}-{4}\", Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), packageReference.CanonicalName.Flavor, packageReference.CanonicalName.Architecture, packageReference.CanonicalName.Name, packageReference.CanonicalName.Version); var buildProject = project.AsMsBuildProject(); var vsProject = (VSProject)project.Object; if (buildProject != null && vsProject != null) { foreach (var lib in libraries) { var assemblyName = Path.GetFileNameWithoutExtension(lib.Name); var assemblyPath = path + lib.Name; Reference reference = null; // Remove old references do { try { reference = vsProject.References.Find(assemblyName); } catch { } if (reference != null) { reference.Remove(); } } while (reference != null); // Add new reference if (lib.IsChecked) { vsProject.References.Add(assemblyPath); var references = buildProject.GetAssemblyReferences(); var referenceItem = references.First(n => n.Item2.Name == assemblyName).Item1; referenceItem.SetMetadataValue("HintPath", assemblyPath); } } } }
/// <summary> /// Add or remove include directories in VC-project. /// </summary> public static void ManageIncludeDirectories(this Project project, PackageReference packageReference, IEnumerable<Project> projects) { var path = string.Format(@"{0}\include\{1}-{2}\", Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), packageReference.CanonicalName.Name.Split('-')[0], packageReference.CanonicalName.Version); foreach (var configuration in project.GetConfigurations()) { var value = project.GetDefinitionValue(configuration, "AdditionalIncludeDirectories"); var paths = new HashSet<string>(value.Split(';')); if (projects.Any(n => n.FullName == project.FullName)) { paths.Add(path); } else { paths.Remove(path); } project.SetDefinitionValue(configuration, "AdditionalIncludeDirectories", string.Join(";", paths)); } }