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?