我正在尝试创建一个VSIX扩展,将下拉菜单添加到Visual Studio工具栏,以控制自定义MSBuild属性的值。
该值确定在项目中包含哪个版本的COMReference,并且必须在不覆盖.csproj文件的情况下设置。下面是我的.csproj文件的一部分:
<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的实际值正确构建,但Intellisense无法识别COMReferences中的任何内容,因此Intellisense功能无法正常工作,所有内容都会被标记为红色。
第二:
将属性放置在单独的文件中,并将其包含在主csproj文件中。之后通过VSIX修改.props文件。
.csproj:
...
<Include Project="generated\MyProps.props"/>
<Coose> ... </Choose>
...
MyProps:
<Project ...>
<PropertyGroup>
<MyProperty Condition="'$(MyProperty )' == ''">MyValue1</MyProperty>
<DefineConstants>$(DefineConstants);$(MyProperty)</DefineConstants>
</PropertyGroup>
</Project>
这个解决方案工作得非常糟糕。当我更改MyValue1时,重新加载“Solution Explorer”并不足够。有时即使重新启动Visual Studio也不够,您需要删除.suo文件。
如何让Intellisense更新项目信息,或者也许有人知道此问题的另一个解决方案?
Object
对象将返回它。* - Pavel Stepanek