2

我刚刚将包含 VC++(本机和托管)项目以及 C# 项目的软件从 .NET 3.5 迁移到 4.0。我们使用 MsBuild 构建,现在享受 MsBuild 4.0 的好处,它现在以相同的方式处理 C# 和 C++ 项目。有一个问题,但是到目前为止我无法解决。

我正在使用 TargetOutputs ItemGroup 来进一步处理生成的二进制文件。这适用于 C# 和托管 C++(clr 支持),但即使项目已正确构建,本机 C++ 程序集(无公共语言运行时支持)也不会放置在此 ItemGroup 中。

这是正在使用的语句,之后 @(MyProjectsOutput) 不包含本机 C++ 程序集。

<MSBuild Projects="@(MyProjects)" Targets="Rebuild" Properties="Platform=x64;Configuration=Release">
  <Output TaskParameter="TargetOutputs" ItemName="MyProjectsOutput" />
</MSBuild>

知道可能是什么原因吗?我很困在这里......提前谢谢。

埃里克

4

2 回答 2

0

经过一番调查,我创建了一个空的 C++ 控制台应用程序和这个简单的 MsBuild 脚本:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Build" Outputs="" Condition="">
    <ItemGroup>
      <MyProjects Include="test\test.vcxproj">
      </MyProjects>
    </ItemGroup>
    <MSBuild Projects="@(MyProjects)">
      <Output TaskParameter="TargetOutputs" ItemName="MyProjectsOutput" />
    </MSBuild>
    <Message Importance="high" Text="MyProjects: @(MyProjects)"></Message>
    <Message Importance="high" Text="MyProjectsOutput: @(MyProjectsOutput)"></Message>
  </Target>
</Project>

test.exe 已成功构建,但 ItemGroup @(MyProjectOutput) 仍然不包含该文件。当我将 test.vcxproj 更改为“公共语言运行时支持 (/clr)”时,输出会正确显示。这似乎是 MsBuild 中的一个错误。

于 2012-06-26T06:20:03.170 回答
0

您可以使用GetNativeTargetPathMSBuild 任务上的目标名称来获取本机 C++ 项目的输出文件路径:

    <MSBuild Projects="my.vcxproj" Targets="GetNativeTargetPath">
        <Output ItemName="MyOutput" TaskParameter="TargetOutputs"/>
    </MSBuild>
于 2018-07-24T15:16:46.757 回答