{"id":4693,"date":"2008-12-16T12:03:00","date_gmt":"2008-12-16T12:03:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vcblog\/2008\/12\/16\/msbuild-task\/"},"modified":"2019-02-18T18:53:56","modified_gmt":"2019-02-18T18:53:56","slug":"msbuild-task","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/cppblog\/msbuild-task\/","title":{"rendered":"MSBuild Task"},"content":{"rendered":"<p><span><span><font face=\"Calibri\"><\/font><\/span><\/p>\n<p><p class=\"MsoNormal\"><span><font face=\"Calibri\">Hello again! My name is Li Shao. I am a Software Design Engineer in Test in the Visual C++ group. <\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">As one of my colleagues, Marian Luparu, has <\/font><a href=\"http:\/\/blogs.msdn.com\/vcblog\/archive\/2008\/11\/20\/printf-hello-msbuild-n.aspx\"><font face=\"Calibri\" color=\"#0072bc\">blogged<\/font><\/a><font face=\"Calibri\"> in detail about, and Soma has mentioned in his recent <\/font><a href=\"http:\/\/blogs.msdn.com\/somasegar\/archive\/2008\/11\/21\/c-enhancements-in-vs-2010.aspx\"><font face=\"Calibri\" color=\"#0072bc\">blog<\/font><\/a><font face=\"Calibri\"> as well, one of the important features we have in VS2010 is to enable C++ customers to build C++ applications using MSBuild. <span>MSBuild (Microsoft Build Engine) is an extensible, XML-based build engine first shipped with Visual Studio 2005 and the .NET Framework 2.0. <\/span>It is a core part of .NET Framework 2.0\/3.0\/3.5. It gives developers full control of their build process and provides a new XML based project file format. <span>.NET languages such as Visual Basic (VB) and Visual C# (VC#) have migrated to MSBuild as their project and build systems in Visual Studio 2005.<\/span> <\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">Currently, C++ uses its own build system: VCBuild. VCBuild and MSBuild have many differences. Here are a couple of key differences:<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpFirst\"><span><span><font face=\"Calibri\">1.<\/font><span>&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">The Build logic in MSBuild is expressed in MSBuild target files which are accessible by the end uses. The build logic for VCBuild is encapsulated inside the binaries.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpLast\"><span><span><font face=\"Calibri\">2.<\/font><span>&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">VCBuild is made specific for building C++ application. MSBuild on the other hand, is more flexible and extensible. It can be extended to accomplish many different tasks without changes to MSBuild engine.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">Over the last year, I&rsquo;ve spent most of my time working in a team tasked to migrate the C++ build system from VCBuild to MSBuild. A large chuck of the work we need to do for this migration is to create &ldquo;tasks&rdquo; for all the native tools we support in VCBuild. Tasks are reusable units of executable code used by MSBuild projects to perform build operations. There&rsquo;s a library of common tasks provided with MSBuild. You can take a look at this <\/font><a href=\"http:\/\/msdn2.microsoft.com\/en-us\/7z253716.aspx\"><font face=\"Calibri\" color=\"#0072bc\">link<\/font><\/a><font face=\"Calibri\"> to know what the available tasks are. You can also create your own task by authoring a managed type that implements the ITask Interface. Here is an MSDN <\/font><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/microsoft.build.framework.itask.aspx\"><font face=\"Calibri\" color=\"#0072bc\">example<\/font><\/a><font face=\"Calibri\"> on how to create your own tasks.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">In VCBuild, we support these set of native tools:<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">cl.exe<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">link.exe<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">lib.exe: <\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">rc.exe <\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">midl.exe<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">mt.exe<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">xsd.exe<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">xdcmake.exe<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">bscmake.exe<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font face=\"Calibri\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">To have MSBuild support for building native applications, new tasks need to be made for each of the tools. These tasks map the commonly used switches or the switches currently exposed through project system property page to the properties on the tasks. <\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">There are situations that you know what switches you would like to pass to the tools but you need to figure out what MSBuild properties to use. To find the complete mapping of the properties and their representative switches, you can take a look of the XAML files under %programfiles%MSBuildMicrosoft.Cppv4.0. These XAML files express the mapping between properties and switches and their usage. Each of the XAML files represents one tool.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpFirst\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">CL.XML<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpMiddle\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">Link.XML<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpMiddle\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">Lib.XML<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpMiddle\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">RC.XML<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpMiddle\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">MIDL.XML<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpMiddle\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">MT.XML<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpMiddle\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">XSD.XML<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpMiddle\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">XDCMake.xml<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpLast\"><span><span>o<span>&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">BSCmake.xml<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">This is a snippet in CL.XML:<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span class=\"m1\"><span><font color=\"#0000ff\">&lt;<\/font><\/span><\/span><span class=\"t1\"><span><font color=\"#990000\">StringListProperty Name<\/font><\/span><\/span><span class=\"m1\"><span><font color=\"#0000ff\">=&#8221;<\/font><\/span><\/span><b><span>AdditionalIncludeDirectories<\/span><\/b><span class=\"m1\"><span><font color=\"#0000ff\">&#8220;<\/font><\/span><\/span><span class=\"t1\"><span><font color=\"#990000\"> Category<\/font><\/span><\/span><span class=\"m1\"><span><font color=\"#0000ff\">=&#8221;<\/font><\/span><\/span><b><span>General<\/span><\/b><span class=\"m1\"><span><font color=\"#0000ff\">&#8220;<\/font><\/span><\/span><span class=\"t1\"><span><font color=\"#990000\"> Switch<\/font><\/span><\/span><span class=\"m1\"><span><font color=\"#0000ff\">=&#8221;<\/font><\/span><\/span><b><span>I<\/span><\/b><font color=\"#0000ff\"><span class=\"m1\"><span>&#8220;&gt;<\/span><\/span><span><\/p>\n<p><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><span>&#8211;<\/span><span><span class=\"m1\"><font color=\"#0000ff\"> &lt;<\/font><\/span><span class=\"t1\"><font color=\"#990000\">StringListProperty.DisplayName<\/font><\/span><font color=\"#0000ff\"><span class=\"m1\">&gt;<\/span><\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span class=\"b1\"><span><strong><font face=\"Courier New\" color=\"#ff0000\">&nbsp;<\/font><\/strong><\/span><\/span><span> <span class=\"m1\"><font color=\"#0000ff\">&lt;<\/font><\/span><span class=\"t1\"><font color=\"#990000\">sys:String<\/font><\/span><span class=\"m1\"><font color=\"#0000ff\">&gt;<\/font><\/span><span class=\"tx1\"><strong>Additional Include Directories<\/strong><\/span><span class=\"m1\"><font color=\"#0000ff\">&lt;\/<\/font><\/span><span class=\"t1\"><font color=\"#990000\">sys:String<\/font><\/span><span class=\"m1\"><font color=\"#0000ff\">&gt;<\/font><\/span> <\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span class=\"m1\"><span><font color=\"#0000ff\">&lt;\/<\/font><\/span><\/span><span class=\"t1\"><span><font color=\"#990000\">StringListProperty.DisplayName<\/font><\/span><\/span><font color=\"#0000ff\"><span class=\"m1\"><span>&gt;<\/span><\/span><span><\/p>\n<p><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><span>&#8211;<\/span><span><span class=\"m1\"><font color=\"#0000ff\"> &lt;<\/font><\/span><span class=\"t1\"><font color=\"#990000\">StringListProperty.Description<\/font><\/span><font color=\"#0000ff\"><span class=\"m1\">&gt;<\/span><\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span class=\"b1\"><span><strong><font face=\"Courier New\" color=\"#ff0000\">&nbsp;<\/font><\/strong><\/span><\/span><span> <span class=\"m1\"><font color=\"#0000ff\">&lt;<\/font><\/span><span class=\"t1\"><font color=\"#990000\">sys:String<\/font><\/span><span class=\"m1\"><font color=\"#0000ff\">&gt;<\/font><\/span><span class=\"tx1\"><strong>Specifies one or more directories to add to the include path; separate with semi-colons if more than one. (\/I[path])<\/strong><\/span><span class=\"m1\"><font color=\"#0000ff\">&lt;\/<\/font><\/span><span class=\"t1\"><font color=\"#990000\">sys:String<\/font><\/span><span class=\"m1\"><font color=\"#0000ff\">&gt;<\/font><\/span> <\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span class=\"m1\"><span><font color=\"#0000ff\">&lt;\/<\/font><\/span><\/span><span class=\"t1\"><span><font color=\"#990000\">StringListProperty.Description<\/font><\/span><\/span><font color=\"#0000ff\"><span class=\"m1\"><span>&gt;<\/span><\/span><span><\/p>\n<p><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><span class=\"m1\"><span><font color=\"#0000ff\">&lt;\/<\/font><\/span><\/span><span class=\"t1\"><span><font color=\"#990000\">StringListProperty<\/font><\/span><\/span><font color=\"#0000ff\"><span class=\"m1\"><span>&gt;<\/span><\/span><span><\/p>\n<p><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">From here, you can see that &ldquo;AdditionalDirectories&rdquo; maps to switch &ldquo;I&rdquo;. In the project file (.vcxproj is the new MSBuild based C++ project file), you can specify:<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>&lt;<\/span><span>ClCompile<\/span><span>&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp; <\/span>&lt;<\/span><span>AdditionalIncludeDirectories<\/span><span>&gt;<\/span><b><span>include1;include2;include3<\/span><\/b><span>&lt;\/<\/span><span>AdditionalIncludeDirectories<\/span><span>&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&lt;\/<\/span><span>ClCompile<\/span><span>&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">It will be translated to this command line for CL:<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>\/I:&rdquo;include1&rdquo; \/I:&rdquo;include2&rdquo; \/I:&rdquo;include3&rdquo;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">We have also exposed some new switches, for example \/MP. This is the XAML definition of the \/MP switch<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>&#8211;<\/span><span class=\"m1\"><span><font color=\"#0000ff\"> &lt;<\/font><\/span><\/span><span class=\"t1\"><span><font color=\"#990000\">BoolProperty Name<\/font><\/span><\/span><span class=\"m1\"><span><font color=\"#0000ff\">=&#8221;<\/font><\/span><\/span><b><span>MultiProcessorCompilation<\/span><\/b><span class=\"m1\"><span><font color=\"#0000ff\">&#8220;<\/font><\/span><\/span><span class=\"t1\"><span><font color=\"#990000\"> Category<\/font><\/span><\/span><span class=\"m1\"><span><font color=\"#0000ff\">=&#8221;<\/font><\/span><\/span><b><span>General<\/span><\/b><span class=\"m1\"><span><font color=\"#0000ff\">&#8220;<\/font><\/span><\/span><span class=\"t1\"><span><font color=\"#990000\"> Switch<\/font><\/span><\/span><span class=\"m1\"><span><font color=\"#0000ff\">=&#8221;<\/font><\/span><\/span><b><span>MP<\/span><\/b><font color=\"#0000ff\"><span class=\"m1\"><span>&#8220;&gt;<\/span><\/span><span><\/p>\n<p><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><span>&#8211;<\/span><span><span class=\"m1\"><font color=\"#0000ff\"> &lt;<\/font><\/span><span class=\"t1\"><font color=\"#990000\">BoolProperty.DisplayName<\/font><\/span><font color=\"#0000ff\"><span class=\"m1\">&gt;<\/span><\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span class=\"b1\"><span><strong><font color=\"#ff0000\">&nbsp;<\/font><\/strong><\/span><\/span><span> <span class=\"m1\"><font color=\"#0000ff\">&lt;<\/font><\/span><span class=\"t1\"><font color=\"#990000\">sys:String<\/font><\/span><span class=\"m1\"><font color=\"#0000ff\">&gt;<\/font><\/span><span class=\"tx1\"><strong>Multi-processor Compilation<\/strong><\/span><span class=\"m1\"><font color=\"#0000ff\">&lt;\/<\/font><\/span><span class=\"t1\"><font color=\"#990000\">sys:String<\/font><\/span><span class=\"m1\"><font color=\"#0000ff\">&gt;<\/font><\/span> <\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span class=\"b1\"><span><strong><font color=\"#ff0000\">&nbsp;<\/font><\/strong><\/span><\/span><span> <span class=\"m1\"><font color=\"#0000ff\">&lt;\/<\/font><\/span><span class=\"t1\"><font color=\"#990000\">BoolProperty.DisplayName<\/font><\/span><font color=\"#0000ff\"><span class=\"m1\">&gt;<\/span><\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>&#8211;<\/span><span><span class=\"m1\"><font color=\"#0000ff\"> &lt;<\/font><\/span><span class=\"t1\"><font color=\"#990000\">BoolProperty.Description<\/font><\/span><font color=\"#0000ff\"><span class=\"m1\">&gt;<\/span><\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span class=\"b1\"><span><strong><font color=\"#ff0000\">&nbsp;<\/font><\/strong><\/span><\/span><span> <span class=\"m1\"><font color=\"#0000ff\">&lt;<\/font><\/span><span class=\"t1\"><font color=\"#990000\">sys:String<\/font><\/span><span class=\"m1\"><font color=\"#0000ff\">&gt;<\/font><\/span><span class=\"tx1\"><strong>Multi-processor Compilation<\/strong><\/span><span class=\"m1\"><font color=\"#0000ff\">&lt;\/<\/font><\/span><span class=\"t1\"><font color=\"#990000\">sys:String<\/font><\/span><span class=\"m1\"><font color=\"#0000ff\">&gt;<\/font><\/span> <\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span class=\"b1\"><span><strong><font color=\"#ff0000\">&nbsp;<\/font><\/strong><\/span><\/span><span> <span class=\"m1\"><font color=\"#0000ff\">&lt;\/<\/font><\/span><span class=\"t1\"><font color=\"#990000\">BoolProperty.Description<\/font><\/span><font color=\"#0000ff\"><span class=\"m1\">&gt;<\/span><\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span class=\"b1\"><span><strong><font color=\"#ff0000\">&nbsp;<\/font><\/strong><\/span><\/span><span> <span class=\"m1\"><font color=\"#0000ff\">&lt;<\/font><\/span><span class=\"t1\"><font color=\"#990000\">Argument<\/font><\/span> <span class=\"t1\"><font color=\"#990000\">Property<\/font><\/span><span class=\"m1\"><font color=\"#0000ff\">=&#8221;<\/font><\/span><b>ProcessorNumber<\/b><span class=\"m1\"><font color=\"#0000ff\">&#8220;<\/font><\/span><span class=\"t1\"><font color=\"#990000\"> IsRequired<\/font><\/span><span class=\"m1\"><font color=\"#0000ff\">=&#8221;<\/font><\/span><b>false<\/b><span class=\"m1\"><font color=\"#0000ff\">&#8221; \/&gt;<\/font><\/span> <\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span class=\"b1\"><span><strong><font color=\"#ff0000\">&nbsp;<\/font><\/strong><\/span><\/span><span> <span class=\"m1\"><font color=\"#0000ff\">&lt;\/<\/font><\/span><span class=\"t1\"><font color=\"#990000\">BoolProperty<\/font><\/span><font color=\"#0000ff\"><span class=\"m1\">&gt;<\/span><\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>&#8211;<\/span><span><span class=\"m1\"><font color=\"#0000ff\"> &lt;<\/font><\/span><span class=\"t1\"><font color=\"#990000\">IntProperty Name<\/font><\/span><span class=\"m1\"><font color=\"#0000ff\">=&#8221;<\/font><\/span><b>ProcessorNumber<\/b><span class=\"m1\"><font color=\"#0000ff\">&#8220;<\/font><\/span><span class=\"t1\"><font color=\"#990000\"> Category<\/font><\/span><span class=\"m1\"><font color=\"#0000ff\">=&#8221;<\/font><\/span><b>General<\/b><font color=\"#0000ff\"><span class=\"m1\">&#8220;&gt;<\/span><\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span>&#8211;<\/span><span><span class=\"m1\"><font color=\"#0000ff\"> &lt;<\/font><\/span><span class=\"t1\"><font color=\"#990000\">Int<\/font><\/span><\/span><\/p>\n<\/p>\n<p><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello again! My name is Li Shao. I am a Software Design Engineer in Test in the Visual C++ group. As one of my colleagues, Marian Luparu, has blogged in detail about, and Soma has mentioned in his recent blog as well, one of the important features we have in VS2010 is to enable C++ [&hellip;]<\/p>\n","protected":false},"author":289,"featured_media":35994,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4693","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cplusplus"],"acf":[],"blog_post_summary":"<p>Hello again! My name is Li Shao. I am a Software Design Engineer in Test in the Visual C++ group. As one of my colleagues, Marian Luparu, has blogged in detail about, and Soma has mentioned in his recent blog as well, one of the important features we have in VS2010 is to enable C++ [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/4693","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/users\/289"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/comments?post=4693"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/4693\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media\/35994"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media?parent=4693"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/categories?post=4693"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/tags?post=4693"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}