MSBuild逻辑中是否有方法可以确定我运行的是托管代码还是非托管代码?不是C++与C#,而是托管与非托管?我想根据代码是托管的还是非托管的,以不同的方式设置一些属性(通常只是版本信息)。
对于托管编译,vcxproj文件中通常有两件事会发生变化(afaik,至少在用于所有cli项目的主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;通常你可以省略这个。
在C++中,ClCompile(源文件列表)中的每个项都有一个CompileAsManaged
元数据值。设置属性很困难,因为每个源文件的属性都可能不同,但如果您只希望(并支持)关闭整个项目设置,则设置属性会更简单。在IDE中切换,看看vcxproj文件中有什么变化。它有几个不同的值可供选择。