使用MSBuild 4.0,从MSBuild任务中传递要在c#项目文件中展开的属性名,如何?

使用MSBuild 4.0,从MSBuild任务中传递要在c#项目文件中展开的属性名,如何?,c#,msbuild,C#,Msbuild,我为CI进程创建了MSBuild脚本,在此脚本中,我使用MSBuild任务编译解决方案: <PropertyGroup> <MyOutPath>Output</MyOutPath> </PropertyGroup> <MSBuild Projects="MySolution.sln" Targets="Clean;Rebuild" Properties="OutputPath=$(MyOutPath)\%24

我为CI进程创建了MSBuild脚本,在此脚本中,我使用MSBuild任务编译解决方案:

<PropertyGroup>
    <MyOutPath>Output</MyOutPath>
</PropertyGroup>

<MSBuild
    Projects="MySolution.sln"
    Targets="Clean;Rebuild"
    Properties="OutputPath=$(MyOutPath)\%24(AssemblyName)">
</MSBuild>

输出
我希望c#项目文件使用如下输出路径

  • 项目MyAssemblyName1的输出\MyAssemblyName1
  • 项目MyAssemblyName2的输出\MyAssemblyName2
AssemblyName属性来自C#项目文件,我希望在构建项目时在OutputPath属性中展开它

现在,%24(AssemblyName)只是在文件系统上生成输出\$(AssemblyName),这不是我想要的

毫不奇怪,在“父”MSBuild文件中使用$(AssemblyName)扩展为零

有没有办法推迟目标项目文件中AssemblyName属性的解析


另外,我不想修改.csproj文件,因为我希望CI系统的影响最小。

您可以使用将
.csproj
项目文件直接导入MSBuild脚本。这样,您可以直接引用
AssemblyName
属性:

<Import Project="MyProject.csproj" />
<Message Text="The assembly name is $(AssemblyName)" />

好的,我有一个引用多个项目文件的解决方案,所有的项目文件都不是事先知道的。是否导入支持项?此外,我有一些解决方案不一定包含所有项目,因此我必须分析sln文件以获取要处理的正确项目文件。如果您使用的是MSBuild 4.0,则元素实际上支持通配符,因此,您可以说
来导入特定目录中的所有项目文件。仍然可以根据解决方案文件的内容排除一些项目。
<SetEnv Name="MSBuildEmitSolution" Value="1" />
<MSBuild Projects="MySolution.sln" Targets="Build" />
<Import Project="MySolution.sln.proj" />