Réglage de la OutputPath propriété d'un projet via Visual Studio Automatisation

Je suis en train d'écrire un package VSIX pour permettre à l'utilisateur de modifier la masse de la OutputPath propriété de toutes les configurations de projets actuellement chargées de la solution (voir l'incroyablement ennuyeux étape #4 ici).

J'ai couru dans un problème très concret: lors de la définition de la propriété à une valeur contenant des macros (par exemple "$(SolutionDir)\bin\Debug" la valeur écrite dans le .csproj est échappé comme suit:

<OutputPath>%24%28SolutionDir%29\bin\Debug\</OutputPath>

Qui, plutôt que de laisser MSBuild élargir la macro, crée un véritable dossier physique nommé $(SolutionDir). J'aimerais quelque sorte court-circuiter ce processus d'échappement.

La documentation MSDN est sans surprise manque dans ce domaine.

Mon code est comme suit:

private void MenuItemCallback(object sender, EventArgs e)
{
    SolutionWideOutputDialogWindow dialog = new SolutionWideOutputDialogWindow();
    dialog.ShowModal();
    if (!dialog.DialogResult.HasValue || !dialog.DialogResult.Value)
    {
        return;
    }

    string requestedOutputPath = dialog.outputPathTextBox.Text;
    Solution2 solution = _dte2.Solution as Solution2;
    if (solution == null)
    {
        return;
    }

    Projects projects = solution.Projects;
    foreach (Project project in projects)
    {
        Property outputPath = project.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath");
        outputPath.Value = requestedOutputPath;
        project.Save();
    }
}

Apprécie beaucoup l'aide de personne.

  • La même chose arrive quand vous le faites avec l'IDE. Ni l'IDE de donner quelque indication que ce soit que les macros sont pris en charge. Donc, assez sûr de supposer que vous juste ne peut pas faire ce travail. Utilisez un chemin relatif au lieu de cela, comme ..\bin\debug.
  • Eh bien, MSBuild ne prennent en charge, mais qui me laisse avec la modification du projet sous-jacent des fichiers directement
  • Msbuild/VS façon de "faire x pour tous les projets" est à l'aide d'un fichier commun qui sont importés dans tous les projets. Vous pouvez le faire manuellement (ou script) par l'ajout de ce fichier dans chaque projet, ou vous pouvez utiliser un global (par exemple dans $(VCTargetsPath)\Platforms\Win32\ImportBefore). Ensemble OutputPath dans le mondial et vous avez terminé. Je recommande vraiment à l'aide d'un fichier commun pour la définition d'à peu près tout (compilateur/linker/options des outils et tous les chemins) de toute façon, c'est une question de SÉCHER après tout.
  • C'est effectivement ce que j'avais déjà fait, mais j'ai rencontré un problème lorsque j'ai voulu faire le chemin de la sortie mondiale sur une solution de base de configuration (c'est à dire $(SolutionDir)bin\$(SolutionConfigurationName)\$(SolutionPlatformName)). Les macros exportés par MSBuild sont sur une base par projet et donc ne serait pas de travail si vous aviez projet de plates-formes qui ne sont pas complètement nommés. J'ai finalement trouvé un Visual Studio plugin pour exporter ces pour moi depuis l'EDI. J'ai dû ruser un peu pour le rendre à l'exportation plus tôt et ne pas le casser VS fonctionnalité, mais je suis satisfait aujourd'hui.
InformationsquelleAutor DoomMuffins | 2013-11-29