{"id":191,"date":"2026-10-12T17:21:20","date_gmt":"2026-10-12T17:21:20","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/03\/09\/running-msbuild-40-and-msbuild-35-on-continuous-integration\/"},"modified":"2026-10-12T17:21:21","modified_gmt":"2026-10-12T17:21:21","slug":"running-msbuild-40-and-msbuild-35-on-continuous-integration","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/running-msbuild-40-and-msbuild-35-on-continuous-integration\/","title":{"rendered":"Running MSBuild 4.0 and 3.5 Side by Side on Legacy CruiseControl.NET CI"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">This guide explains how to keep a <strong>legacy CruiseControl.NET<\/strong> environment building both older .NET projects and Visual Studio 2010-era projects. You will learn why builds fail after an upgrade, how to point CI to MSBuild 4.0, and how to retain MSBuild 3.5 jobs when both are still needed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-03-09; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Source context: <a href=\"https:\/\/www.devopsschool.com\/blog\/running-msbuild-40-and-msbuild-35-on-continuous-integration\/\">Running MSBuild 4.0 and MSBuild 3.5 on Continuous Integration<\/a>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/03\/msbuild-40-and-msbuild-35-o.png\" alt=\"MSBuild 4.0 and MSBuild 3.5 on CI\"\/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Why builds fail after moving to Visual Studio 2010 projects<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the original scenario, teams upgraded code to Visual Studio 2010 RC. The CI server (CruiseControl.NET) still executed MSBuild 3.5 paths, so upgraded solutions failed. The practical fix is to make sure the CI machine has .NET Framework 4.0 and the Visual Studio 2010 MSBuild target files expected by those projects.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">MSBuild 3.5 vs MSBuild 4.0 in this migration<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Item<\/th><th>MSBuild 3.5<\/th><th>MSBuild 4.0<\/th><th>CI impact<\/th><\/tr><\/thead><tbody><tr><td>Typical executable path<\/td><td>C:\\Windows\\Microsoft.NET\\Framework\\v3.5\\MSBuild.exe<\/td><td>C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\MSBuild.exe<\/td><td>Wrong path in ccnet.config causes immediate build failure<\/td><\/tr><tr><td>Framework dependency<\/td><td>.NET Framework 3.5<\/td><td>.NET Framework 4.0<\/td><td>CI agent must have required runtime installed<\/td><\/tr><tr><td>Targets used by VS2010-era projects<\/td><td>Older target set<\/td><td>Visual Studio v10.0 target set<\/td><td>Missing targets produce import\/target-not-found errors<\/td><\/tr><tr><td>Best use in mixed legacy estate<\/td><td>Keep for older solutions<\/td><td>Use for upgraded solutions<\/td><td>Run separate CI project definitions when needed<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Legacy remediation workflow<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Commit includes VS2010 project files] --> B[CI checks out source]\n    B --> C{DotNet 4 installed on CI server?}\n    C -- No --> D[Install DotNet 4 and reboot]\n    C -- Yes --> E[Copy v10.0 MSBuild targets]\n    D --> E\n    E --> F[Update ccnet msbuild executable path]\n    F --> G[Run build with MSBuild 4]\n    G --> H{Build succeeds?}\n    H -- No --> I[Review paths and missing targets]\n    H -- Yes --> J[Continue CI pipeline]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step-by-step fix on CruiseControl.NET<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1) Install .NET Framework 4.0 on the CI server<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The original guidance requires installing .NET Framework 4.0 on the CI machine, preferably the full framework profile. After installation, restart the server (or at minimum restart build services) so the runtime and paths are fully available.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2) Copy Visual Studio v10.0 MSBuild targets<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">From a machine where Visual Studio 2010 RC is installed, copy the <code>v10.0<\/code> folder under <code>%ProgramFiles%\\MSBuild\\Microsoft\\VisualStudio<\/code> to the same location on the CI server.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-powershell\">Copy-Item -Path <span class=\"hljs-string\">'C:\\Program Files\\MSBuild\\Microsoft\\VisualStudio\\v10.0'<\/span> -Destination <span class=\"hljs-string\">'C:\\Program Files\\MSBuild\\Microsoft\\VisualStudio\\' -Recurse<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">3) Update ccnet.config to invoke MSBuild 4.0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In the CruiseControl.NET project configuration, change the MSBuild executable from the 3.5 path to the 4.0 path.<\/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 language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">msbuild<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">executable<\/span>&gt;<\/span>C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\MSBuild.exe<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">executable<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">workingDirectory<\/span>&gt;<\/span>C:\\Build\\MyApp<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">workingDirectory<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">projectFile<\/span>&gt;<\/span>MyApp.sln<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">projectFile<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">msbuild<\/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<h3 class=\"wp-block-heading\">4) Keep 3.5 and 4.0 builds side by side<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you still build older solutions, define separate CI projects (or tasks) so each one points at the correct MSBuild executable.<\/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 language-xml\"><span class=\"hljs-comment\">&lt;!-- Legacy solution --&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">msbuild<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">executable<\/span>&gt;<\/span>C:\\Windows\\Microsoft.NET\\Framework\\v3.5\\MSBuild.exe<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">executable<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">projectFile<\/span>&gt;<\/span>Legacy.sln<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">projectFile<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">msbuild<\/span>&gt;<\/span>\n\n<span class=\"hljs-comment\">&lt;!-- VS2010 solution --&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">msbuild<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">executable<\/span>&gt;<\/span>C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\MSBuild.exe<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">executable<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">projectFile<\/span>&gt;<\/span>Upgraded.sln<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">projectFile<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">msbuild<\/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<h3 class=\"wp-block-heading\">5) Verify executable resolution<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">C:\\Windows\\Microsoft.NET\\Framework\\v3.5\\MSBuild.exe \/version\nC:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\MSBuild.exe \/version<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls on legacy CI servers<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Updating project files but forgetting to change the MSBuild executable path in <code>ccnet.config<\/code>.<\/li><li>Installing only partial framework components and missing build-time dependencies.<\/li><li>Copying target files to a different directory than the path expected by MSBuild imports.<\/li><li>Using one global build definition for mixed legacy and upgraded solutions instead of separate tasks.<\/li><li>Skipping service\/server restart after framework installation, leaving agents in stale state.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>If your CI server started failing after projects were upgraded to Visual Studio 2010, the usual cause is that jobs still invoke MSBuild 3.5. This guide shows a legacy-compatible fix: install .NET 4.0, copy required MSBuild targets, and update ccnet.config while keeping 3.5 builds available.<\/p>\n","protected":false},"author":1,"featured_media":4127,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[77,51],"tags":[3416,995,101,3417,3418,3419,1122,2974,3113,588,366,3414,3413,1668,213,3415],"class_list":["post-191","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-continuous-integration","category-msbuild","tag-ci-server","tag-continuous","tag-continuous-integration","tag-continuous-integration-server","tag-continuous-integration-using-msbuild","tag-continuous-integration-with-msbuild","tag-guide","tag-help","tag-how-to","tag-integration","tag-msbuild","tag-msbuild-3-5","tag-msbuild-4-0","tag-run","tag-tutorial","tag-visual-studio-2010"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/191","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=191"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/191\/revisions"}],"predecessor-version":[{"id":79021,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/191\/revisions\/79021"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4127"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=191"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=191"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}