private void solutionEventsListener_AfterSolutionBackgroundLoadComplete() { InitializeCommandProxy(); var solution = (IVsSolution)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(IVsSolution)); var updatedProjects = new List <string>(); foreach (var dteProject in VsHelper.GetDteProjectsInSolution(solution)) { var buildProjects = ProjectCollection.GlobalProjectCollection.GetLoadedProjects(dteProject.FileName); foreach (var buildProject in buildProjects) { var packageVersion = buildProject.GetPropertyValue("SiliconStudioPackageParadoxVersion"); var currentPackageVersion = buildProject.GetPropertyValue("SiliconStudioPackageParadoxVersionLast"); if (!string.IsNullOrEmpty(packageVersion) && packageVersion != currentPackageVersion) { var buildPropertyStorage = VsHelper.ToHierarchy(dteProject) as IVsBuildPropertyStorage; if (buildPropertyStorage != null) { buildPropertyStorage.SetPropertyValue("SiliconStudioPackageParadoxVersionLast", string.Empty, (uint)_PersistStorageType.PST_USER_FILE, packageVersion); // Only "touch" file if there was a version before (we don't want to trigger this on newly created projects) if (!string.IsNullOrEmpty(currentPackageVersion)) { updatedProjects.Add(buildProject.FullPath); } } } } } if (updatedProjects.Count > 0) { var messageBoxResult = VsShellUtilities.ShowMessageBox(this, "Paradox needs to update IntelliSense cache for some projects.\nThis will resave the .csproj and Visual Studio will offer to reload them.\n\nProceed?", "Paradox IntelliSense cache", OLEMSGICON.OLEMSGICON_QUERY, OLEMSGBUTTON.OLEMSGBUTTON_YESNO, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST); if (messageBoxResult == 6) // Yes { // Touch files so that VS reload them foreach (var updatedProject in updatedProjects) { File.SetLastWriteTimeUtc(updatedProject, DateTime.UtcNow); } } } }
private void UpdateStartupProjectFromConfiguration() { var solution = (IVsSolution)GetGlobalService(typeof(IVsSolution)); var buildManager = (IVsSolutionBuildManager)GetGlobalService(typeof(IVsSolutionBuildManager)); var dte = (DTE)GetService(typeof(DTE)); foreach (SolutionContext context in dte.Solution.SolutionBuild.ActiveConfiguration.SolutionContexts) { if (!context.ShouldBuild) { continue; } foreach (var project in VsHelper.GetDteProjectsInSolution(solution)) { if (context.ProjectName != project.UniqueName || !IsProjectExecutable(project)) { continue; } var startupProjects = (object[])dte.Solution.SolutionBuild.StartupProjects; if (!startupProjects.Cast <string>().Contains(project.UniqueName)) { try { configurationLock = true; buildManager.set_StartupProject(VsHelper.ToHierarchy(project)); } finally { configurationLock = false; } } previousProjectPlatforms[project] = context.PlatformName; return; } } }
private static async Task CleanIntermediateAsset(DTE2 dte, Project project) { if (project.FileName == null || Path.GetExtension(project.FileName) != ".csproj") { return; } // Find current project active configuration var configManager = project.ConfigurationManager; var activeConfig = configManager.ActiveConfiguration; // Get global parameters for Configuration and Platform var globalProperties = new Dictionary <string, string>(); globalProperties["Configuration"] = activeConfig.ConfigurationName; globalProperties["Platform"] = activeConfig.PlatformName == "Any CPU" ? "AnyCPU" : activeConfig.PlatformName; // Check if project has a SiliconStudioCurrentPackagePath var projectInstance = new ProjectInstance(project.FileName, globalProperties, null); var packagePathProperty = projectInstance.Properties.FirstOrDefault(x => x.Name == "SiliconStudioCurrentPackagePath"); if (packagePathProperty == null) { return; } // Prepare build request var request = new BuildRequestData(project.FileName, globalProperties, null, new[] { "SiliconStudioCleanAsset" }, null); var pc = new Microsoft.Build.Evaluation.ProjectCollection(); var buildParameters = new BuildParameters(pc); var buildLogger = new IDEBuildLogger(GetOutputPane(), new TaskProvider(ServiceProvider), VsHelper.ToHierarchy(project)); buildParameters.Loggers = new[] { buildLogger }; // Trigger async build buildLogger.OutputWindowPane.OutputStringThreadSafe(string.Format("Cleaning assets for project {0}...\r\n", project.Name)); BuildManager.DefaultBuildManager.BeginBuild(buildParameters); var submission = BuildManager.DefaultBuildManager.PendBuildRequest(request); BuildResult buildResult = await submission.ExecuteAsync(); BuildManager.DefaultBuildManager.EndBuild(); buildLogger.OutputWindowPane.OutputStringThreadSafe("Done\r\n"); }