{"id":478,"date":"2026-10-14T16:41:20","date_gmt":"2026-10-14T16:41:20","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2016\/07\/02\/extension-used-in-dotnet-and-msbuild-projects\/"},"modified":"2026-10-14T16:41:20","modified_gmt":"2026-10-14T16:41:20","slug":"extension-used-in-dotnet-and-msbuild-projects","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/extension-used-in-dotnet-and-msbuild-projects\/","title":{"rendered":"MSBuild File Extensions Explained: .proj, .targets, .props, .tasks, and *proj Types"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2016-07-02; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MSBuild separates build logic into different file types so teams can reuse settings, tasks, and targets across many projects. If you work with .NET builds, this guide clarifies the role of each extension, shows how imports are typically layered, and provides practical examples you can adapt. This revision is based on the <a href='https:\/\/www.devopsschool.com\/blog\/extension-used-in-dotnet-and-msbuild-projects\/'>original post<\/a>.<\/p>\n\n\n\n<figure class='wp-block-image'><img src='https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2016\/07\/extension-used-in-dotnet-an.png' alt='Extensions used in .NET and MSBuild projects' \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What each MSBuild-related extension is for<\/h2>\n\n\n\n<figure class='wp-block-table'><table class='has-fixed-layout'><thead><tr><th>Extension or pattern<\/th><th>Primary purpose<\/th><th>Typical usage<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td><code>.proj<\/code><\/td><td>Top-level or orchestrator build project<\/td><td>Calls targets, imports shared files, coordinates multi-project builds<\/td><td><code>build.proj<\/code>, <code>main.proj<\/code><\/td><\/tr><tr><td><code>.targets<\/code><\/td><td>Reusable target definitions<\/td><td>Imported into other projects; usually provides build steps, not full standalone builds<\/td><td><code>Microsoft.Common.targets<\/code><\/td><\/tr><tr><td><code>.props<\/code><\/td><td>Shared properties and defaults<\/td><td>Imported early to set common values used later in evaluation<\/td><td><code>Microsoft.Cpp.props<\/code><\/td><\/tr><tr><td><code>.tasks<\/code><\/td><td>Task registration includes<\/td><td>Contains <code>UsingTask<\/code> declarations for custom tasks<\/td><td><code>MSBuild.ExtensionPack.tasks<\/code><\/td><\/tr><tr><td><code>.settings.targets<\/code><\/td><td>Team naming convention for shared settings<\/td><td>Imported file for common build and deployment settings<\/td><td><code>EntityFramework.settings.targets<\/code><\/td><\/tr><tr><td><code>*proj<\/code><\/td><td>Language or project-type file<\/td><td>Main project definition consumed by MSBuild tooling<\/td><td><code>.csproj<\/code>, <code>.vbproj<\/code>, <code>.vcxproj<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Language-specific project extensions from the original reference<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original article also listed these project-type extensions. They identify the language or tooling ecosystem around a project file.<\/p>\n\n\n\n<figure class='wp-block-table'><table class='has-fixed-layout'><thead><tr><th>Extension<\/th><th>Project type<\/th><\/tr><\/thead><tbody><tr><td><code>.csproj<\/code><\/td><td>C#<\/td><\/tr><tr><td><code>.vbproj<\/code><\/td><td>VB.NET<\/td><\/tr><tr><td><code>.vcxproj<\/code><\/td><td>Visual C++<\/td><\/tr><tr><td><code>.dbproj<\/code><\/td><td>Database project<\/td><\/tr><tr><td><code>.fsproj<\/code><\/td><td>F#<\/td><\/tr><tr><td><code>.pyproj<\/code><\/td><td>IronPython<\/td><\/tr><tr><td><code>.rbproj<\/code><\/td><td>IronRuby<\/td><\/tr><tr><td><code>.wixproj<\/code><\/td><td>Windows Installer XML (WiX)<\/td><\/tr><tr><td><code>.vdproj<\/code><\/td><td>Visual Studio Deployment Project<\/td><\/tr><tr><td><code>.isproj<\/code><\/td><td>InstallShield<\/td><\/tr><tr><td><code>.pssproj<\/code><\/td><td>PowerShell<\/td><\/tr><tr><td><code>.modelproj<\/code><\/td><td>Modeling project<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How these files typically work together<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Import order and file responsibility are the core ideas: shared properties are usually loaded early, reusable targets and tasks are imported where needed, and the entry project triggers execution.<\/p>\n\n\n\n<pre class='mermaid'>\nflowchart LR\n    A[Start build command] --> B[Load entry project file]\n    B --> C[Import shared props]\n    C --> D[Evaluate properties and items]\n    D --> E[Import tasks and targets]\n    E --> F[Execute requested target]\n    F --> G[Compile package deploy]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Practical examples<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Example: orchestrator <code>.proj<\/code> file that imports shared configuration and runs a project build.<\/p>\n\n\n<pre class='wp-block-code' aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\" class='language-xml'><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Project<\/span> <span class=\"hljs-attr\">DefaultTargets<\/span>=<span class=\"hljs-string\">'Build'<\/span> <span class=\"hljs-attr\">xmlns<\/span>=<span class=\"hljs-string\">'http:\/\/schemas.microsoft.com\/developer\/msbuild\/2003'<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Import<\/span> <span class=\"hljs-attr\">Project<\/span>=<span class=\"hljs-string\">'build\/common.props'<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Import<\/span> <span class=\"hljs-attr\">Project<\/span>=<span class=\"hljs-string\">'build\/common.tasks'<\/span> \/&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Target<\/span> <span class=\"hljs-attr\">Name<\/span>=<span class=\"hljs-string\">'Build'<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">MSBuild<\/span> <span class=\"hljs-attr\">Projects<\/span>=<span class=\"hljs-string\">'src\/MyApp\/MyApp.csproj'<\/span>\n             <span class=\"hljs-attr\">Targets<\/span>=<span class=\"hljs-string\">'Build'<\/span>\n             <span class=\"hljs-attr\">Properties<\/span>=<span class=\"hljs-string\">'Configuration=Release'<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Target<\/span>&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Import<\/span> <span class=\"hljs-attr\">Project<\/span>=<span class=\"hljs-string\">'build\/common.targets'<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Project<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example: reusable <code>.targets<\/code> file.<\/p>\n\n\n<pre class='wp-block-code' aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\" class='language-xml'><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Project<\/span> <span class=\"hljs-attr\">xmlns<\/span>=<span class=\"hljs-string\">'http:\/\/schemas.microsoft.com\/developer\/msbuild\/2003'<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Target<\/span> <span class=\"hljs-attr\">Name<\/span>=<span class=\"hljs-string\">'PrintBuildInfo'<\/span> <span class=\"hljs-attr\">BeforeTargets<\/span>=<span class=\"hljs-string\">'Build'<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Message<\/span> <span class=\"hljs-attr\">Text<\/span>=<span class=\"hljs-string\">'Building $(MSBuildProjectName) in $(Configuration)'<\/span>\n             <span class=\"hljs-attr\">Importance<\/span>=<span class=\"hljs-string\">'high'<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Target<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Project<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example: <code>.tasks<\/code> include containing task registrations.<\/p>\n\n\n<pre class='wp-block-code' aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\" class='language-xml'><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Project<\/span> <span class=\"hljs-attr\">xmlns<\/span>=<span class=\"hljs-string\">'http:\/\/schemas.microsoft.com\/developer\/msbuild\/2003'<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">UsingTask<\/span> <span class=\"hljs-attr\">TaskName<\/span>=<span class=\"hljs-string\">'Company.Build.ZipDirectory'<\/span>\n             <span class=\"hljs-attr\">AssemblyFile<\/span>=<span class=\"hljs-string\">'tools\/Company.Build.Tasks.dll'<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Project<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Common commands:<\/p>\n\n\n<pre class='wp-block-code'><span><code class=\"hljs\" class='language-bash'>msbuild build.proj \/t:Build \/p:Configuration=Release\ndotnet build src\/MyApp\/MyApp.csproj -c Release<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">About the .settings.targets convention<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>.settings.targets<\/code> is a naming convention, not a special parser rule in MSBuild. In the original post, it is attributed to Sayed Ibrahim Hashimi (2009) as a way to centralize shared utility and deployment-related properties.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class='wp-block-list'><li>Keep <code>.proj<\/code> files focused on orchestration, not deep reusable logic.<\/li><li>Put reusable defaults in <code>.props<\/code> and reusable build actions in <code>.targets<\/code>.<\/li><li>Use <code>.tasks<\/code> (or equivalent imported files) to isolate custom task registration.<\/li><li>Standardize naming so teams can quickly identify purpose from filename alone.<\/li><li>Document import order explicitly, because MSBuild behavior is strongly order-dependent.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Understand what common MSBuild-related file extensions do and how they fit together in real .NET build pipelines. This revised guide includes a comparison table, import-flow diagram, and practical XML examples.<\/p>\n","protected":false},"author":1,"featured_media":3184,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[51],"tags":[1235,1240,1241,1239,1234,1237,1238,366,1242,1236],"class_list":["post-478","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-msbuild","tag-dotnet","tag-dotnet-and-msbuild-projects-extension","tag-dotnet-extension","tag-dotnet-msbuild","tag-extension","tag-extension-used-in-dotnet-projects","tag-extension-used-in-msbuild-projects","tag-msbuild","tag-msbuild-extension","tag-projects"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/478","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=478"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/478\/revisions"}],"predecessor-version":[{"id":79361,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/478\/revisions\/79361"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3184"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=478"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=478"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}