在Visual Studio(2010及更高版本)中查看文件属性时,可以在“常规”部分中设置“项目类型”。例如,对于C ++,项类型是" C / C ++编译器"。
有一个"自定义构建工具"类型可用,但必须为属于该类别的每个文件完全配置。
我的问题是:
答案 0 :(得分:10)
我使用以下参考资料找到答案:
Integrating a compiler/assembler in VS ; Using NASM with Visual Studio 2010
by perilbrain on CodeProject:http://www.codeproject.com/Articles/410776/Integrating-a-compiler-assembler-in-VS-Using-NASM Platform Extensibility - Part 1
:http://blogs.msdn.com/b/vsproject/archive/2009/06/10/platform-extensibility-part-1.aspx Platform Extensibility - Part 2
:http://blogs.msdn.com/b/vsproject/archive/2009/06/18/platform-extensibility-part-2.aspx MSBuild API Reference
:https://msdn.microsoft.com/en-us/library/dn715758(v=vs.121).aspx`事实证明,完整的设置非常复杂,所以我将限制我的回答,用极简主义的步骤来回答我的两个初始问题:
在项目文件(vcxproj
)中,包含一个新的构建定义(可能有一种方法可以在系统范围内包含它,但我还没有考虑过它):
<ImportGroup Label="ExtensionTargets">
<Import Project="mybuild.targets" />
</ImportGroup>
这可以在结束</Project>
之前完成。
在与mybuild.targets
文件相同的文件夹中创建名为vcxproj
的文本文件。
在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>
此目标文件是指包含更多详细信息的xml文件($(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml
在此示例中引用mybuild.xml)。创建mybuild.xml
。
在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>
我们刚刚做了什么:项目文件现在包含一个新的目标定义(mybuild.targets
)。此文件通常包含有关如何执行实际构建的更多信息,但此处它仅包含mybuild.xml
文件的包含。此mybuild.xml
文件包含一个使用内部名称MYBUILD
和显示名称My Custom Build
调用的新项类型定义。在Visual Studio中重新打开项目时,“项类型”列表中将提供新的项类型。选择它会将此项目的类型设置为MYBUILD
,因为此时我们没有为该类项目定义规则,所以只会从构建中忽略它。
这分两步完成:
将文件扩展名与内容类型相关联。这是通过在mybuild.xml
中添加条目来完成的:
<FileExtension Name="*.myext" ContentType="MYBUILD" />
将内容类型与项类型相关联。这是通过在mybuild.xml
中添加条目来完成的:
<ContentType Name="MYBUILD" DisplayName="My Custom Build" ItemType="MYBUILD" />
此时,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”。
此时,我们有一个与自定义项类型相关联的文件扩展名。我们需要将该项类型与一组构建规则相关联。
将项类型与构建目标相关联。在mybuild.targets
中,在与PropertyPageSchema相同的ItemGroup中添加以下内容:
<AvailableItemName Include="MYBUILD">
<Targets>_MYBUILD</Targets>
</AvailableItemName>
现在它看起来像这样:
<ItemGroup>
<PropertyPageSchema
Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
<AvailableItemName Include="MYBUILD">
<Targets>_MYBUILD</Targets>
</AvailableItemName>
</ItemGroup>
定义自定义目标。您可以在此处映射应用于配置构建任务的所有属性和变量。在下一步中,我们将使用使用命令行模板的构建任务,因此在我们的目标中,我们将配置实际的命令行。这正好在上一步中定义的ItemGroup
之下:
<Target Name="_MYBUILD">
<MYBUILD CommandLineTemplate="explorer $(IntDir)"></MYBUILD>
</Target>
我们的命令行只会打开一个资源管理器窗口。
声明自定义构建任务。这是在上一步的Target
之后:
<UsingTask TaskName="MYBUILD" TaskFactory="XamlTaskFactory" AssemblyName="Microsoft.Build.Tasks.v4.0">
<Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task>
</UsingTask>
在这里,我们引用将在我们的mybuild.xml
文件中定义的任务。
在mybuild.xml
中,添加以下规则:
<Rule Name="MYBUILD" PageTemplate="tool" DisplayName="My Custom Build" Order="200"/>
我们刚刚做了什么:我们将自定义项类型映射到自定义目标,以及打开资源管理器窗口的自定义构建任务。当我们构建.myext
文件时,我们现在可以期望Visual Studio弹出一个资源管理器窗口。
有一些方法可以在属性窗口中添加配置字段,将它们映射到变量并使用它们来配置任务。这里没有涉及,但在顶部提供的链接中进行了讨论。