我有一个 C# 项目,它是用几种不同的配置构建的。某些源文件应始终包含在内,而某些源文件仅在某些配置中包含。到目前为止,我一直#if ... #endif
在对整个文件进行此操作,但我希望创建一个小扩展来以更好的方式执行此操作。
我创建了一个扩展,将项目添加到文件的上下文菜单中,但我找不到任何方法来设置Condition
项目文件中项目节点的属性。
我查看Properties
了界面的集合EnvDTE.ProjectItem
,但在那里看不到任何有用的东西(除了 BuildAction ......我会回到那个)。
然后我尝试IVsBuildPropertyStorage
在该项目上获得一个并打电话给SetItemAttribute()
. 这确实将信息添加到项目文件中,但作为这样的子元素:
<ItemGroup>
<Compile Include="Program.cs">
<Condition>%27%24%28Configuration%29%27==%27Debug%27</Condition>
</Compile>
</ItemGroup>
当我试图实现的是:
<ItemGroup>
<Compile Include="Program.cs" Condition="'$(Configuration)'=='Debug'" />
</ItemGroup>
还有一个IVsBuildPropertyStorage.SetPropertyValue()
but 将类似的子元素添加到PropertyGroup
靠近顶部的部分,而不是添加到 item 节点。
我看过'Project Subtypes/Flavors',但看起来它只会让我得到另一个 IVsBuildPropertyStorage
,这似乎没有用。它们看起来确实能够处理很多复杂的事情,但有关该主题的文档似乎很少且含糊不清。
我看过一些描述如何使用 MSBuild 程序集直接加载和操作项目文件的帖子,但我不确定什么时候可以安全地这样做,而不会混淆 Visual Studio 并可能丢失更改,因为 VS 会在它提示重新加载时检测对项目文件的更改。
作为最后一个想法,我考虑过在和BuildAction
之间操作属性,但这听起来我的扩展需要做很多工作才能正确维护,例如每次用户在 IDE 中切换配置时都要保持同步。Compile
None
有没有人对这种事情有任何经验可以给我任何建议,还是我应该放弃希望并坚持在#if
任何地方手动添加指令?