2017-08-15 1 views
1

Je suis en train de créer une extension VSIX qui ajoute un menu déroulant à la barre d'outils Visual Studio pour contrôler la valeur de la propriété MSBuild personnalisée. La valeur détermine la version de COMReference à inclure dans le projet et doit être définie sans écraser le fichier .csproj. Une partie de mon dossier .csproj:Forcez par programme la mise à jour Visual Studio Intellisense avec la valeur de propriété MSBuild évaluée

<Project ... > 
<Choose> 
    <When Condition="'$(MyProperty)'=='MyValue1'"> 
     <ItemGroup> 
     <COMReference Include="ComLib"> 
      Version_1 
     </COMReference> 
     </ItemGroup> 
    </When> 
    <When Condition="'$(MyProperty)'=='MyValue2'"> 
     <ItemGroup> 
     <COMReference Include="ComLib"> 
      Version_2 
     </COMReference> 
     </ItemGroup> 
    </When> 
    </Choose> 
</Project> 

J'ai trouvé 2 solutions possibles:

Première

public static void SetGlobalBuildProperty(string property, string value) 
{ 
    var projects = Microsoft.Build.Evaluation.ProjectCollection 
       .GlobalProjectCollection 
       .LoadedProjects; 

    foreach (Microsoft.Build.Evaluation.Project project in projects) 
    { 
     project.SetGlobalProperty(property, value); 
     project.MarkDirty(); 
     project.ReevaluateIfNecessary();  
    } 
} 

Broject correctement construit avec la valeur réelle, mais IntelliSense ne reconnaît rien de COMReferences donc la Les fonctions Intellisense ne fonctionnent pas et tout est souligné en rouge.

Deuxième:

Apportez la propriété dans un fichier séparé et l'inclure dans la csproj principale. Après avoir modifié le fichier .props via VSIX.

.csproj:

... 
<Include Project="generated\MyProps.props"/> 
<Coose> ... </Choose> 
... 

MyProps:

<Project ...> 
    <PropertyGroup> 
    <MyProperty Condition="'$(MyProperty)' == ''">MyValue1</MyProperty> 
    <DefineConstants>$(DefineConstants);$(MyProperty)</DefineConstants> 
    </PropertyGroup> 
</Project> 

Cette solution fonctionne terriblement. Lorsque je change MyValue1, il ne suffit pas de recharger le projet dans l'Explorateur de solutions. Parfois, ce n'est même pas suffisant pour redémarrer Visual Studio et vous devez supprimer le fichier .suo.

Comment puis-je demander à Intellisense de mettre à jour les informations sur le projet ou peut-être que quelqu'un connaît une autre solution à ce problème?

Répondre

1

J'ai trouvé une solution. Ce projet met à jour la fonction et IntelliSense:

VSLangProj80.VSProject2.Refresh(); 

fonction complète (rafraîchir tous les projets en solution):

public static void SetGlobalBuildProperty(IServiceProvider package, string property, string value) 
    { 
     var projects = Microsoft.Build.Evaluation.ProjectCollection 
      .GlobalProjectCollection 
      .LoadedProjects; 

     foreach (var project in projects) 
     { 
      project.SetGlobalProperty(property, value); 
      project.MarkDirty(); 
      project.ReevaluateIfNecessary();      
     } 
     var dte = package.GetService(typeof(DTE)) as DTE2; 
     var solution = dte.Solution as Solution2; 
     var dteProjects = GetSolutionProjects(solution) //Get all solution projects. 
     foreach(var project in dteProjects) 
     { 
      var vsProject = project.Object as VSProject2; 
      vsproject.Refresh(); 
     }   
    }