{"id":2093,"date":"2010-05-14T13:02:00","date_gmt":"2010-05-14T13:02:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/visualstudio\/2010\/05\/14\/a-guide-to-vcxproj-and-props-file-structure\/"},"modified":"2022-10-13T14:39:33","modified_gmt":"2022-10-13T21:39:33","slug":"a-guide-to-vcxproj-and-props-file-structure","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/visualstudio\/a-guide-to-vcxproj-and-props-file-structure\/","title":{"rendered":"A guide to .vcxproj and .props file structure"},"content":{"rendered":"<p class=\"MsoNormal\">\n<p class=\"MsoNormal\"><span style=\"font-family: Calibri; font-size: small;\">If you inspect the contents of a .vcxproj file (the new VC++ project file format in VS2010) in notepad or in VS editor (by first unloading the project and then choosing &#8220;Edit Foo.vcxproj&#8221; from the context menu in Solution Explorer), you will see that the various top-level MSBuild elements are laid out in a particular order. Go ahead and open a .vcxproj file right now. Notice, e.g., that most of the property groups and item definition groups occur after the import for <\/span>Microsoft.Cpp.Default.props<span style=\"font-family: Calibri; font-size: small;\">. Also, all targets are imported at the end of the project file. Then there are multiple property groups &#8211; distinguished by <\/span>Label<span style=\"font-size: small;\"><span style=\"font-family: Calibri;\">s on them \u2013 and they occur in a particular order.<\/span><\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-family: 'Calibri','sans-serif';\"><span style=\"font-size: small;\">What is the purpose of this ordered layout? Why are there multiple property groups (import groups, etc.) instead of only one? Well, read on.<\/span><\/span><\/p>\n<p><span style=\"font-size: small;\">\u00a0<\/span><\/p>\n<p><span style=\"font-family: 'Calibri','sans-serif';\"><span style=\"font-size: small;\">The concept of an ordered layout is a natural outcome of MSBuild\u2019s sequential evaluation model. \u00a0If your project file consists of two definitions of a property, such as below, the last definition overrides the preceding ones. So, the value \u201cxyz\u201d will be used during build time. <\/span><\/span><\/p>\n<p class=\"MsoNormal\">\n<p class=\"MsoNormal\">&lt;MyProperty&gt;abc&lt;\/MyProperty&gt;<\/p>\n<p class=\"MsoNormal\">&lt;MyProperty&gt;xyz&lt;\/MyProperty&gt;<\/p>\n<p class=\"MsoNormal\">\n<p><span style=\"font-family: 'Calibri','sans-serif';\"><span style=\"font-size: small;\">The first property definition need not necessarily be in the project file itself. You could have included it via some import that is imported before the second definition of the property. What I say about properties here is also true about item definition metadata (in general, this holds true for the entire article).<\/span><\/span><\/p>\n<p>&nbsp;<\/p>\n<p class=\"MsoNormal\"><span style=\"font-size: small;\"><span style=\"font-family: Calibri;\">Having said that, let me now show you the layout. The following skeletal (but legal) MSBuild file captures the layout succinctly. Any .vcxproj file generated by VS will contain these top-level MSBuild elements and in this particular order (although they may contain multiple copies of each such top-level element). Note that Labels are arbitrary tags only read and written by Visual Studio and used as signposts for editing; they have no other function.<\/span><\/span><\/p>\n<p class=\"MsoNormal\">&lt;Project DefaultTargets=&#8221;Build&#8221; ToolsVersion=&#8221;4.0&#8243; xmlns=&#8217;http:\/\/schemas.microsoft.com\/developer\/msbuild\/2003&#8242; &gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ItemGroup Label=&#8221;ProjectConfigurations&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;PropertyGroup Label=&#8221;Globals&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;Import Project=&#8221;$(VCTargetsPath)Microsoft.Cpp.default.props&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;PropertyGroup Label=&#8221;Configuration&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;Import Project=&#8221;$(VCTargetsPath)Microsoft.Cpp.props&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ImportGroup Label=&#8221;ExtensionSettings&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ImportGroup Label=&#8221;PropertySheets&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;PropertyGroup Label=&#8221;UserMacros&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;PropertyGroup \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ItemDefinitionGroup \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ItemGroup \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;Import Project=&#8221;$(VCTargetsPath)Microsoft.Cpp.targets&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ImportGroup Label=&#8221;ExtensionTargets&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">&lt;\/Project&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Let me explain what each of these elements are and why they are ordered this way.<\/p>\n<p>&nbsp;<\/p>\n<p class=\"MsoNormal\">&lt;!&#8211; This is the root node. It specifies the MSBuild version to use<\/p>\n<p class=\"MsoNormal\">and also the default target to be executed when this file is passed<\/p>\n<p class=\"MsoNormal\">to MSBuild.exe &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">&lt;Project DefaultTargets=&#8221;Build&#8221; ToolsVersion=&#8221;4.0&#8243; xmlns=&#8217;http:\/\/schemas.microsoft.com\/developer\/msbuild\/2003&#8242; &gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;!&#8211; This contains the project configurations known to the project<\/p>\n<p class=\"MsoNormal\">\u00a0 (such as Debug|Win32 and Release|Win32). &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ItemGroup Label=&#8221;ProjectConfigurations&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;!&#8211; This contains project level settings such as ProjectGuid,<\/p>\n<p class=\"MsoNormal\">\u00a0 RootNamespace, etc. These properties are not normally overridden<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0elsewhere in the project file. This group is not configuration<\/p>\n<p class=\"MsoNormal\">\u00a0 dependent and so only one Globals group generally exists in the<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0project file. &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;PropertyGroup Label=&#8221;Globals&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;!&#8211; This property sheet contains the default settings for a VC++<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0project. It contains\u00a0definitions of all the project settings such<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0as Platform, PlatformToolset, OutputPath, TargetName, UseOfAtl,<\/p>\n<p class=\"MsoNormal\">\u00a0 etc. and also all the item definition group defaults for each known<\/p>\n<p class=\"MsoNormal\">\u00a0 item group. In general, properties in this file are not tool-specific. &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;Import Project=&#8221;$(VCTargetsPath)Microsoft.Cpp.default.props&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;!&#8211; This property group has an attached configuration condition<\/p>\n<p class=\"MsoNormal\">\u00a0 (such as Condition=&#8221;&#8216;$(Configuration)|$(Platform)&#8217;==&#8217;Debug|Win32&#8242;&#8221;)<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0and comes in multiple\u00a0copies, one per configuration. This property<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0group hosts configuration-wide properties.\u00a0These properties control<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0the inclusion of system property sheets in Microsoft.Cpp.props.<\/p>\n<p class=\"MsoNormal\">\u00a0 E.g. if we define the property &lt;CharacterSet&gt;Unicode&lt;\/CharacterSet&gt;,<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0then the system\u00a0property sheet microsoft.Cpp.unicodesupport.props<\/p>\n<p class=\"MsoNormal\">\u00a0 will be included (as can be seen in the Property Manager). Indeed,<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0in one of the imports of Microsoft.Cpp.props, we can see the line:<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;Import Condition=&#8221;&#8216;$(CharacterSet)&#8217; == &#8216;Unicode'&#8221;\u00a0\u00a0 Project=&#8221;$(VCTargetsPath)microsoft.Cpp.unicodesupport.props&#8221;\/&gt; &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;PropertyGroup Label=&#8221;Configuration&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;!&#8211; This property sheet (directly or via imports) defines the<\/p>\n<p class=\"MsoNormal\">\u00a0 default values for many tool-specific properties such as the<\/p>\n<p class=\"MsoNormal\">\u00a0 compiler\u2019s Optimization, WarningLevel properties, Midl tool\u2019s<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0TypeLibraryName property, etc. In addition, it imports various<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0system property\u00a0sheets based on configuration properties defined<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0in the property group immediately above. &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;Import Project=&#8221;$(VCTargetsPath)Microsoft.Cpp.props&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;!&#8211; This group contains imports for the property sheets that<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0are part of Build Customizations (or Custom Build Rules as this<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0feature was called in earlier editions). A Build Customization<\/p>\n<p class=\"MsoNormal\">\u00a0 is defined by up to three files \u2013 a .targets file, a .props file<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0and .xml file. This import\u00a0group contains the imports for the<\/p>\n<p class=\"MsoNormal\">\u00a0.props file. &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ImportGroup Label=&#8221;ExtensionSettings&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;!&#8211; This group contains the imports for user property sheets.<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0These are the property sheets you add through the Property<\/p>\n<p class=\"MsoNormal\">\u00a0 Manager view in VS. The order in which these imports are listed<\/p>\n<p class=\"MsoNormal\">\u00a0 is relevant and is reflected in the Property Manager. The project<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0file normally contains multiple instances of this kind of import<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0group, one for each project configuration.\u00a0 &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ImportGroup Label=&#8221;PropertySheets&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;!&#8211; UserMacros are as variables used to customize your build<\/p>\n<p class=\"MsoNormal\">\u00a0 process. E.g. you can define\u00a0a user macro to define your custom<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0output path as $(CustomOutpuPath) and use it to define other<\/p>\n<p class=\"MsoNormal\">\u00a0 variables. This property group houses such properties. Note that<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0in VS2010, this group is not populated by the IDE since we do not<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0support user macros for configurations (we do for property sheets<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0though). &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;PropertyGroup Label=&#8221;UserMacros&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;!&#8211; This property group normally comes with a configuration<\/p>\n<p class=\"MsoNormal\">\u00a0 condition attached. You will also\u00a0see multiple instances of the<\/p>\n<p class=\"MsoNormal\">\u00a0 property group, one per configuration. It differs in its identity<\/p>\n<p class=\"MsoNormal\">\u00a0 from the other property groups above by the fact that it does<\/p>\n<p class=\"MsoNormal\">\u00a0 not have a label (to look at it in another way, it has a label<\/p>\n<p class=\"MsoNormal\">\u00a0 that is equal to the empty string). This group contains project<\/p>\n<p class=\"MsoNormal\">\u00a0 configuration level settings. These settings apply to all files<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0that are part of the specified item group. Build Customization<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0item definition metadata also gets initialized here. &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;PropertyGroup \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;!&#8211; Similar to the property group immediately above, but it<\/p>\n<p class=\"MsoNormal\">\u00a0 contains item definitions and item\u00a0definition metadata instead<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0of properties. &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ItemDefinitionGroup \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;!&#8211; Contains the items (source files, etc.) in the project.<\/p>\n<p class=\"MsoNormal\">\u00a0 You will generally have multiple item groups \u2013 one per item<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0type. &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ItemGroup \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;!&#8211; Defines (directly or via imports) VC++ targets such as<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0build, clean, etc. &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;Import Project=&#8221;$(VCTargetsPath)Microsoft.Cpp.targets&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;!&#8211; This group contains imports for the Build Customization<\/p>\n<p class=\"MsoNormal\">\u00a0\u00a0target files. &#8211;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ImportGroup Label=&#8221;ExtensionTargets&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">&lt;\/Project&gt;<\/p>\n<p class=\"MsoNormal\">\n<p class=\"MsoNormal\"><span style=\"font-family: Calibri; font-size: small;\">The above ordering ensures that editing the project file via that IDE gives expected results. E.g. when you define a property value in the property pages, the IDE will generally place the property definition in the property group with the empty label. This ensures that default values brought in the system property sheets are overridden by user defined values. Similarly, the target files are imported at the end since they consume the properties defined above and since they generally do not define properties themselves. Likewise, user property sheets are imported after the system property sheets (included via <\/span>Microsoft.Cpp.props<span style=\"font-size: small;\"><span style=\"font-family: Calibri;\">). This ensures that the user can override any defaults brought in by the system property sheets.<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-family: Calibri; font-size: small;\">\u00a0<\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-size: small;\"><span style=\"font-family: Calibri;\">If a .vcxproj file does not follow this layout, the build results may not be like you expected. E.g. properties defined by the user using property pages may not be used during the build since they could have been overridden by the system property sheets in this different layout.<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-family: Calibri; font-size: small;\">\u00a0<\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-family: Calibri; font-size: small;\">Even the IDE design time experience may suffer, although VS does its best to work with any .vcxproj file. If your .vcxproj file does not have, say, the <\/span>PropertySheets<span style=\"font-size: small;\"><span style=\"font-family: Calibri;\"> import group, then you will not see any user property sheets in the Property Manager view (you might still see the system property sheets though). However, when you add a property sheet from the Property Manager view, then VS will create one such labeled import group for you at the right place in the .vcxproj file and add the import for the new property sheet. If however, your .vcxproj has a layout very different from the one described above, VS may not know what the right place is so it may end up creating it at an arbitrary location. In general, the heuristic used by VS IDE should work well for minor to moderate inconsistencies in the .vcxproj file layout.<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-family: Calibri; font-size: small;\">\u00a0<\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-family: Calibri; font-size: small;\">You may want to know how VS magically knows where to write a particular property. E.g. when you set <\/span>UseOfAtl <span style=\"font-family: Calibri; font-size: small;\">property in the general property page, it gets written to <\/span>Configuration <span style=\"font-family: Calibri; font-size: small;\">property group whereas the <\/span>TargetName<span style=\"font-family: Calibri; font-size: small;\"> property in the same general property page gets written to the label-less property group.\u00a0 That is told to VS by the property itself. Well actually by the property schema in the <\/span><a href=\"https:\/\/learn.microsoft.com\/en-us\/archive\/blogs\/vsproject\/platform-extensibility-part-2\"><span style=\"font-family: Calibri; font-size: small;\">property page xml<\/span><\/a><span style=\"font-size: small;\"><span style=\"font-family: Calibri;\"> file. Recall that property page xml defines the static information about a Rule and all its properties. One such piece of information is the preferred position of a Rule property in the destination file (the file where its value will be written). The preferred position is defined by taking advantage of the existence of Labels. Labels are used to distinguish the various top-level elements of the same type (such as two property groups).\u00a0\u00a0 Thus, a property can declare in the property page xml file, which of the property groups it would like to be housed in when the time comes for it to be defined in the project file. <\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-family: Calibri; font-size: small;\">\u00a0<\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-size: small;\"><span style=\"font-family: Calibri;\">Finally, here is the skeletal MSBuild file that will illustrate the file layout of a property sheet (.props) file in VS2010. The functionality of the layout elements can be inferred based on the discussion above.<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-family: Calibri; font-size: small;\">\u00a0<\/span><\/p>\n<p class=\"MsoNormal\">&lt;Project ToolsVersion=&#8221;4.0&#8243; xmlns=&#8221;http:\/\/schemas.microsoft.com\/developer\/msbuild\/2003&#8243;&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ImportGroup Label=&#8221;PropertySheets&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;PropertyGroup Label=&#8221;UserMacros&#8221; \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;PropertyGroup \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ItemDefinitionGroup \/&gt;<\/p>\n<p class=\"MsoNormal\">\u00a0 &lt;ItemGroup \/&gt;<\/p>\n<p class=\"MsoNormal\">&lt;\/Project&gt;<\/p>\n<p class=\"MsoNormal\"><span style=\"font-family: Calibri; font-size: small;\">\u00a0<\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-size: small;\"><span style=\"font-family: Calibri;\">To summarize, the ordered layout of .vcxproj and .props files comports with MSBuild sequential evaluation model. The use of Labels helps the IDE in reading element definitions from and writing them to the right location in the file.<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-family: Calibri; font-size: small;\">\u00a0<\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-size: small;\"><span style=\"font-family: Calibri;\">[I would like to thanks Marian Luparu whose notes on the .vcxproj file layout I used in preparing this blog post.]<\/span><\/span><\/p>\n<p class=\"MsoNormal\">\n<p class=\"MsoNormal\"><a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/4\/2019\/06\/Pavan%20(2)_1.png\"><img decoding=\"async\" title=\"Pavan (2)\" src=\"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-content\/uploads\/sites\/4\/2010\/05\/Pavan202_thumb_1-1.png\" alt=\"Pavan (2)\" width=\"81\" height=\"83\" align=\"left\" border=\"0\" \/><\/a><strong>Short Bio:<\/strong> Pavan Adharapurapu is a developer on the Visual Studio Project and Build team. As part of VS 2010, he has worked on numerous features of the VC++ project system such as property sheets, filters, property pages, platform and tool extensibility, etc. His long term focus is on developing a &#8220;common project system&#8221; infrastructure which could be used to quickly build richly featured project systems. Prior to joining the Visual Studio team in 2008, he was working on Workflow technologies in Microsoft Dynamics Axapta. Pavan holds a Masters degree in Computer Science (CS) from the University of California, Los Angeles (UCLA) and a Bachelors degree in CS from the Indian Institute of Technology (IIT), Madras. He lives in Redmond, WA with his wife and loves to play soccer and watch movies in his spare time.<\/p>\n<p class=\"MsoNormal\"><span style=\"font-family: Calibri; font-size: small;\">\u00a0<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you inspect the contents of a .vcxproj file (the new VC++ project file format in VS2010) in notepad or in VS editor (by first unloading the project and then choosing &#8220;Edit Foo.vcxproj&#8221; from the context menu in Solution Explorer), you will see that the various top-level MSBuild elements are laid out in a particular [&hellip;]<\/p>\n","protected":false},"author":13,"featured_media":255385,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[155],"tags":[5,185,13],"class_list":["post-2093","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-visual-studio","tag-csharp","tag-node-js","tag-visual-studio-2010"],"acf":[],"blog_post_summary":"<p>If you inspect the contents of a .vcxproj file (the new VC++ project file format in VS2010) in notepad or in VS editor (by first unloading the project and then choosing &#8220;Edit Foo.vcxproj&#8221; from the context menu in Solution Explorer), you will see that the various top-level MSBuild elements are laid out in a particular [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/posts\/2093","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/comments?post=2093"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/posts\/2093\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/media\/255385"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/media?parent=2093"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/categories?post=2093"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/visualstudio\/wp-json\/wp\/v2\/tags?post=2093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}