Visual studio 如何使用msbuild获取项目文件的属性值
使用MSBuild I包含一个解决方案>Visual studio 如何使用msbuild获取项目文件的属性值,visual-studio,properties,msbuild,project,Visual Studio,Properties,Msbuild,Project,使用MSBuild I包含一个解决方案> <ItemGroup> <ProjectToBuild Include="$(SVNLocalPath)\$(SolutionName)"> </ProjectToBuild> </ItemGroup> 我需要包含解决方案中的所有*.csproj文件,并且项目文件的条件包含或定义属性;例如,如果x.csproj包含定义的属性“TestProjectType”,则希望将该项目包括到我的项目组中
<ItemGroup>
<ProjectToBuild Include="$(SVNLocalPath)\$(SolutionName)"> </ProjectToBuild>
</ItemGroup>
我需要包含解决方案中的所有*.csproj文件,并且项目文件的条件包含或定义属性;例如,如果x.csproj包含定义的属性“TestProjectType”,则希望将该项目包括到我的项目组中
像这样的
<Target Name = "TestProperties">
<Message Text="TestProperties"/>
<ItemGroup>
<AllProj Include="$(SVNLocalPath)\*.csproj"/>
<AllTestProj Include="%(AllProj.Identity)" Condition="%(AllProj.ProjectTypeGuids)=={3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"/>
</ItemGroup>
<Message Text="@(AllTestProj )"/>
</Target>
谢谢您可以通过自定义任务来实现这一点 检查所有项目中的属性(测试)的简单示例排除当前解决方案的当前项目:
<UsingTask TaskName="GetPropertyTask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll">
<ParameterGroup>
<ProjectFile ParameterType="System.String" Required="true" />
<BuildOutput ParameterType="System.String[]" Output="true" />
</ParameterGroup>
<Task>
<Reference Include="System.Xml"/>
<Reference Include="Microsoft.Build"/>
<Using Namespace="Microsoft.Build" />
<Using Namespace="Microsoft.Build.Evaluation" />
<Using Namespace="Microsoft.Build.Utilities" />
<Code Type="Fragment" Language="cs">
<![CDATA[
var properties = new Dictionary<string, string>
{
{ "Configuration", "$(Configuration)" },
{ "Platform", "$(Platform)" }
};
//Log.LogMessage(MessageImportance.High, "customLog");
// Log.LogMessage(MessageImportance.High, ProjectFile);
var collection = new ProjectCollection(properties);
var project = collection.LoadProject(ProjectFile);
ProjectProperty pp = project.Properties.Where(p => p.Name == "MyCustomProperty").FirstOrDefault();
string customValue = pp==null?"empty":pp.EvaluatedValue;
BuildOutput = new String[] { customValue };
]]></Code>
</Task>
</UsingTask>
<Target Name="AfterBuild">
<GetPropertyTask ProjectFile="%(ProjectToScan.FullPath)">
<Output ItemName="ProjectToScanOutput" TaskParameter="BuildOutput"/>
</GetPropertyTask>
<Message Text="ClassLibrary1" Importance="high" Condition="'%(ProjectToScanOutput.Identity)' == 'test'" />
</Target>
{
{“配置”,“$(配置)”},
{“平台”、“$(平台)”}
};
//LogMessage(MessageImportance.High,“customLog”);
//LogMessage(MessageImportance.High,ProjectFile);
var集合=新项目集合(属性);
var project=collection.LoadProject(ProjectFile);
ProjectProperty pp=project.Properties.Where(p=>p.Name==“MyCustomProperty”).FirstOrDefault();
字符串customValue=pp==null?“空”:pp.EvaluatedValue;
BuildOutput=新字符串[]{customValue};
]]>
更多信息,请参阅文章。因此,如果我理解正确,您实际上有两个问题a)如何从解决方案中获取所有项目,b)在某些属性上过滤这些项目?您是否考虑过“手动”将这些guid的文件变灰?