MSBuild逻辑中是否有办法确定我是否运行托管代码和非托管代码?不是C ++ vs C#,而是管理vs非托管?我想根据代码是管理还是不管理来设置一些属性(通常只是版本信息)。
答案 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文件中有哪些更改。它有几个不同的值可供选择。