c# - Programmatically force update Visual Studio Intellisense with evaluated MSBuild property value -
i'm trying create vsix extension adds drop-down menu visual studio toolbar control value of custom msbuild property. value determines version of comreference include in project , must set without overwriting .csproj file. part of .csproj file:
<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> i found 2 possible solutions:
first
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 builds correctly actual value, intellisense not recognize comreferences intellisense functions not work , underlined in red.
second:
bring property separate file , include in main csproj. after modify .props file via vsix.
.csproj:
... <include project="generated\myprops.props"/> <coose> ... </choose> ... myprops:
<project ...> <propertygroup> <myproperty condition="'$(myproperty )' == ''">myvalue1</myproperty> <defineconstants>$(defineconstants);$(myproperty)</defineconstants> </propertygroup> </project> this solution works terribly. when change myvalue1, not enough reload project in solution explorer. it's not enough restart visual studio, , need delete .suo file.
how can intellisense update information project or maybe knows solution problem?
i found solution. function updates project , intellisense:
vslangproj80.vsproject2.refresh(); full function (refresh projects in 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 ) ) dte2; var solution = dte.solution solution2; var dteprojects = getsolutionprojects( solution ) //get solution projects. foreach( var project in dteprojects ) { var vsproject = project.object vsproject2; vsproject.refresh(); } }
Comments
Post a Comment