访问引用项目中的项

Accessing items in a referenced project

当一个 C# 项目引用另一个 C# 项目(例如一个 lib)时,Visual Studio 在项目文件中添加如下内容:

<ItemGroup>
  <ProjectReference Include="..\some\path\lib.csproj">
    <Project>{4beb6b28-90f5-77c3-af2a-f5fa3336dac9}</Project>
    <Name>Lib</Name>
  </ProjectReference>
</ItemGroup>

让我们假设,lib.csproj 包含一些这样的项目:

<SpecialFile Include="foo.dll" />
<SpecialFile Inclued="bar.txt" />

如何访问第一个项目文件中的这些 SpecialFile 项?我想做这样的事情:

<Target Name="SpecialFileCopyTarget" AfterTargets="AfterBuild">
  <Copy
      DestinationFolder="$(OutputPath)"
      SourceFiles="@(SpecialFile)"         <-- ?????
      SkipUnchangedFiles="true" />
</Target>

我想我不想 Import lib.csproj,只是想办法拿到这些东西。

XmlPeek 任务允许查询任何 XML 文件:

<XmlPeek Namespaces="&lt;Namespace Prefix='n' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
         XmlInputPath="%(ProjectReference.FullPath)"
         Query="/n:Project/n:ItemGroup/n:SpecialFile/@Include">
  <Output TaskParameter="Result" ItemName="SpecialFiles" />
</XmlPeek>

此代码将从所有引用的项目中收集 SpecialFile 项目。请为您的项目指定 ToolsVersion="4.0"。