扩展Visual Studio(2010+)项类型处理程序

Gas*_*rdP 7 c++ custom-build visual-studio

在Visual Studio(2010及更高版本)中查看文件的属性时,可以在"常规"部分中设置"项类型".例如,对于C++,项类型是"C/C++编译器".

有一个"自定义构建工具"类型可用,但必须为属于该类别的每个文件完全配置.

我的问题是:

  1. 有没有办法配置"自定义构建工具"并使其在"项目类型"列表中可用;
  2. 是否可以将文件扩展名与此新的"项类型"构建器关联?

Gas*_*rdP 10

我使用以下参考资料找到答案:

事实证明,完整的设置非常复杂,所以我将限制我的回答,用极简主义的步骤来回答我的两个初始问题:

在MSVC中添加自定义生成工具

  1. 在项目文件(vcxproj)中,包含一个新的构建定义(可能有一种方法可以在系统范围内包含它,但我还没有考虑过它):

    <ImportGroup Label="ExtensionTargets">
    <Import Project="mybuild.targets" />
    </ImportGroup>
    
    Run Code Online (Sandbox Code Playgroud)

这可以在结束前进行</Project>.

  1. 创建一个mybuild.targets与文件位于同一文件夹中的vcxproj文本文件.

  2. 将以下内容插入mybuild.targets:

    <?xml version="1.0" encoding="utf-8"?>
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <ItemGroup>
        <PropertyPageSchema 
            Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
      </ItemGroup>
    </Project>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 此目标文件是指包含更多详细信息的xml文件($(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml在此示例中引用mybuild.xml).创造mybuild.xml.

  4. 将以下内容插入mybuild.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
          xmlns:sys="clr-namespace:System;assembly=mscorlib">
      <ItemType Name="MYBUILD" DisplayName="My Custom Build" />
    </ProjectSchemaDefinitions>
    
    Run Code Online (Sandbox Code Playgroud)

我们刚刚做了什么:项目文件现在包含一个新的目标定义(mybuild.targets).此文件通常包含有关如何执行实际构建的更多信息,但此处它仅包含mybuild.xml文件的包含.此mybuild.xml文件包含使用内部名称MYBUILD和显示名称调用的新项类型定义My Custom Build.在Visual Studio中重新打开项目时,"项目类型"列表中将提供新项类型.选择它会将此项目的类型设置为MYBUILD,因为此时我们没有为该类型项目定义规则,所以只会从构建中忽略它.

将文件扩展名与自定义项类型MSVC相关联

这分两步完成:

  1. 将文件扩展名与内容类型相关联.这是通过添加如下条目来完成的mybuild.xml:

    <FileExtension Name="*.myext" ContentType="MYBUILD" />
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将内容类型与项类型相关联.这是通过添加如下条目来完成的mybuild.xml:

    <ContentType Name="MYBUILD" DisplayName="My Custom Build" ItemType="MYBUILD" />
    
    Run Code Online (Sandbox Code Playgroud)

此时,mybuild.xml看起来像这样:

    <?xml version="1.0" encoding="utf-8"?>
    <ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
          xmlns:sys="clr-namespace:System;assembly=mscorlib">
      <ItemType Name="MYBUILD" DisplayName="My Custom Build" />
      <FileExtension Name="*.hh" ContentType="MYBUILD" />
      <ContentType Name="MYBUILD" DisplayName="My Custom Build" ItemType="MYBUILD" />
    </ProjectSchemaDefinitions>
Run Code Online (Sandbox Code Playgroud)

我们刚刚做了什么:Visual Studio现在知道扩展.myext包含类型的数据MYBUILD.它还知道具有类型内容的文件是类型MYBUILD的项目MYBUILD.在Visual Studio中重新打开项目后,在添加带扩展名的文件时.myext,Visual Studio会自动将项目类型设置为这些文件的"我的自定义构建".

在自定义项目MSVC上执行自定义工具

此时,我们有一个与自定义项类型相关联的文件扩展名.我们需要将该项类型与一组构建规则相关联.

  1. 将项类型与构建目标相关联.在mybuild.targets与PropertyPageSchema相同的ItemGroup中添加以下内容:

    <AvailableItemName Include="MYBUILD">
      <Targets>_MYBUILD</Targets>
    </AvailableItemName>
    
    Run Code Online (Sandbox Code Playgroud)

所以它现在看起来像这样:

    <ItemGroup>
      <PropertyPageSchema
            Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
      <AvailableItemName Include="MYBUILD">
        <Targets>_MYBUILD</Targets>
      </AvailableItemName>
    </ItemGroup>
Run Code Online (Sandbox Code Playgroud)
  1. 定义自定义目标.您可以在此处映射应用于配置构建任务的所有属性和变量.在下一步中,我们将使用使用命令行模板的构建任务,因此在我们的目标中,我们将配置实际的命令行.这正好ItemGroup在上一步中定义的下方:

    <Target Name="_MYBUILD">
        <MYBUILD CommandLineTemplate="explorer $(IntDir)"></MYBUILD>
    </Target>
    
    Run Code Online (Sandbox Code Playgroud)

我们的命令行将只打开一个资源管理器窗口.

  1. 声明自定义构建任务.这是Target在上一步之后:

    <UsingTask TaskName="MYBUILD" TaskFactory="XamlTaskFactory" AssemblyName="Microsoft.Build.Tasks.v4.0">
        <Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task>
    </UsingTask>
    
    Run Code Online (Sandbox Code Playgroud)

这里,我们引用将在我们的mybuild.xml文件中定义的任务.

  1. mybuild.xml,添加以下规则:

    <Rule Name="MYBUILD" PageTemplate="tool" DisplayName="My Custom Build" Order="200"/>
    
    Run Code Online (Sandbox Code Playgroud)

我们刚刚做了什么:我们将自定义项类型映射到自定义目标,以及打开资源管理器窗口的自定义构建任务.当我们构建.myext文件时,我们现在可以期望Visual Studio弹出一个资源管理器窗口.

自定义构建

有一些方法可以在属性窗口中添加配置字段,将它们映射到变量并使用它们来配置任务.这里没有涉及,但在顶部提供的链接中进行了讨论.