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

时间:2015-08-02 21:11:41

标签: c++ visual-studio custom-build

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

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

我的问题是:

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

1 个答案:

答案 0 :(得分:10)

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

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

在MSVC中添加自定义构建工具

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

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

      将文件扩展名与自定义项目类型MSVC

      相关联

      这分两步完成:

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

        <FileExtension Name="*.myext" ContentType="MYBUILD" />
        
      2. 将内容类型与项类型相关联。这是通过在mybuild.xml中添加条目来完成的:

        <ContentType Name="MYBUILD" DisplayName="My Custom Build" ItemType="MYBUILD" />
        
      3. 此时,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>
        

        我们刚刚做了什么:Visual Studio现在知道扩展名.myext包含MYBUILD类型的数据。它还知道类型为MYBUILD的内容的文件是MYBUILD类型的项目。在Visual Studio中重新打开项目后,在添加扩展名为.myext的文件时,Visual Studio会自动将项目类型设置为“My Custom Build”。

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

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

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

          <AvailableItemName Include="MYBUILD">
            <Targets>_MYBUILD</Targets>
          </AvailableItemName>
          
        2. 现在它看起来像这样:

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

            <Target Name="_MYBUILD">
                <MYBUILD CommandLineTemplate="explorer $(IntDir)"></MYBUILD>
            </Target>
            
          2. 我们的命令行只会打开一个资源管理器窗口。

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

              <UsingTask TaskName="MYBUILD" TaskFactory="XamlTaskFactory" AssemblyName="Microsoft.Build.Tasks.v4.0">
                  <Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task>
              </UsingTask>
              
            2. 在这里,我们引用将在我们的mybuild.xml文件中定义的任务。

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

                <Rule Name="MYBUILD" PageTemplate="tool" DisplayName="My Custom Build" Order="200"/>
                
              2. 我们刚刚做了什么:我们将自定义项类型映射到自定义目标,以及打开资源管理器窗口的自定义构建任务。当我们构建.myext文件时,我们现在可以期望Visual Studio弹出一个资源管理器窗口。

                自定义构建

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