MSBuild托管与非托管属性

时间:2014-09-17 17:38:56

标签: msbuild unmanaged managed

MSBuild逻辑中是否有办法确定我是否运行托管代码和非托管代码?不是C ++ vs C#,而是管理vs非托管?我想根据代码是管理还是不管理来设置一些属性(通常只是版本信息)。

2 个答案:

答案 0 :(得分:3)

在vcxproj文件中通常有两件事情会发生变化以进行托管编译(afaik,至少我们在用于所有cli项目的master c ++ / cli属性表中的方式是这样的:CLRSupport属性已设置为true,ClCompile ItemGroup将CompileAsManaged元数据设置为true。您可以检查这些中的任何一个或两者。这是打印值的目标:

<Target Name="CheckManaged">
  <ItemGroup>
    <ClCompile Include="dummy.cpp" />
  </ItemGroup>

  <PropertyGroup>
    <CompileAsManaged>@(ClCompile->AnyHaveMetadataValue('CompileAsManaged','true'))</CompileAsManaged>
  </PropertyGroup>

  <Message Text="CompileAsManaged is $(CompileAsManaged) and CLRSupport is $(CLRSupport)" />

  <ItemGroup>
    <ClCompile Remove="dummy.cpp" />
  </ItemGroup>
</Target>

正如您所看到的,获取CompileAsManaged元数据值需要一些处理:我正在向ClCompile组添加一个项目,因为如果该组为空,则您可以使用CompileAsManaged;通常你可以省略这个。

答案 1 :(得分:0)

在C ++中,ClCompile中的每个项目(源文件列表)都具有CompileAsManaged元数据值。设置属性很困难,因为它可能因每个源文件而异,但如果您只希望(并支持)键入整个项目设置,则更简单。在IDE中切换它,看看vcxproj文件中有哪些更改。它有几个不同的值可供选择。