Vous pouvez le faire en utilisant la propriété UpToDate de VCConfiguration.
En supposant que vous pouvez obtenir une instance de EnvDTE.DTE vous pouvez obtenir le nécessaire VCProjectEngineVCConfiguration pour le projet actif comme celui-ci:
public Project GetSolutionStartupProject(DTE dte)
{
string startupProjectName = String.Empty;
SolutionBuild solutionBuild = dte.Solution.SolutionBuild as SolutionBuild;
foreach (string item in solutionBuild.StartupProjects as Array)
{
startupProjectName += item;
}
return dte.Solution.Item(startupProjectName);
}
public void BuildStartupProject(DTE dte)
{
Project project = GetSolutionStartupProject(dte);
Configuration activeConfiguration = project.ConfigurationManager.ActiveConfiguration;
// annoyingly can't just do activeConfiguration.Object as VCConfiguration
//
VCProject vcProject = project.Object as VCProject;
VCConfiguration vcActiveConfiguration = null;
foreach (VCConfiguration vcConfiguration in vcProject.Configurations)
{
if (vcConfiguration.ConfigurationName == activeConfiguration.ConfigurationName &&
vcConfiguration.Platform.Name == activeConfiguration.PlatformName)
{
vcActiveConfiguration= vcConfiguration;
break;
}
}
if (!vcActiveConfiguration.UpToDate)
{
vcActiveConfiguration.Build();
}
}
Si vous vouliez faire tous les projets du solution alors il serait plus facile que vous n'avez pas besoin de trouver le projet de démarrage. une fois que vous avez fait cela devrait être facile L'important est de convertir une instance de DTE Projet à un VCProjectEngineVCProject, en boucle les VCConfigurations.
Notez également que VCConfiguration.Build() construira uniquement cette configuration et échouera si les dépendances n'ont pas été générées. Vous pouvez utiliser SolutionBuild.BuildProject() pour générer le projet et ses dépendances.
En théorie, un projet qui prend en charge les commandes Build et Reconstruire est supposé ne pas être construit si une construction n'est pas nécessaire, donc vous ne devriez pas avoir à vérifier quoi que ce soit, et juste construire. Et si le projet ne supporte pas cela, il y a de bonnes chances que vous ne puissiez pas connaître son statut de construction de toute façon. –
@SimonMourier Si vous construisez un projet C# qui n'a pas été modifié, en effet Visual Studio ne recompilera pas le code, mais il exécutera toujours ses événements post-construction, etc. D'une manière ou d'une autre, quand vous frappez F5 Visual Studio évite cela complètement. J'aimerais faire la même chose moi-même. –
Ne vous concentrez que sur des projets C#? –