2009-11-05 4 views
4

Comment vérifier si un projet est à jour?VB.NET EnvDTE Mise à jour avant la construction du projet

J'essaye fondamentalement de construire par programme chaque projet dans une liste mais seulement s'ils ont changé. Est-ce que quelqu'un connaît un moyen (en utilisant EnvDTE peut-être) de vérifier si un projet a changé et doit donc être compilé?

Merci d'avance pour toute l'aide.

+1

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. –

+0

@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. –

+0

Ne vous concentrez que sur des projets C#? –

Répondre

0

Utilisez l'interface EnvDTE.Document:

Document d = //get document 
bool saved = d.Saved; 

La propriété enregistrée sera fausse si le document est sale.

+0

Ok .. Donc, je dois itérer à travers la liste complète des fichiers de code source dans le projet et vérifier pour d.Saved puis à droite? Cela semble être une bonne suggestion, mais savez-vous le faire au niveau du projet sans parcourir la liste? Merci, – Kingamoon

+0

Non, il vous suffit d'itérer à travers les fenêtres ouvertes ... si vous fermez une fenêtre après l'édition, vous êtes invité à enregistrer ou à ignorer les modifications afin qu'une fenêtre fermée ne puisse pas être sale. EnvDTE.Windows vous donnera une collection de toutes les fenêtres ouvertes. –

+2

Je viens de penser à un scénario où s'appuyer sur la méthode d.Saved pour déterminer si un projet est obsolète ou non va échouer. Si j'ai une classe x.vb et que je fais des changements. Ensuite, appuyez sur Enregistrer mais ne construisez pas le projet juste là, alors cette méthode échouera car d.Saved retournera True (mais le projet est en mode dirty).Je suis fondamentalement à la recherche de la méthode exacte utilisée par l'IDE de Visual Studio pour déterminer s'il faut compiler le projet ou simplement retourner la vérification à jour. Merci – Kingamoon

0

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.

+0

Cela semble très bien, mais existe-t-il une solution qui fonctionne aussi pour les projets C#? –

+0

Pourquoi cela ne fonctionnerait-il pas pour les projets C#? – fun4jimmy

+0

Ah désolé, je ne m'en suis pas rendu compte. Je regarde à travers les documents MSDN que je suppose que vous avez également fait, ne semble pas voir quoi que ce soit. Je vais continuer à chercher mais il ne semble pas qu'il y ait un moyen. – fun4jimmy

Questions connexes