.NET Core Project Overview – Pt 3

So far in this series, we have taken a look at the .NET Core Tools 1.0.0-preview2 (Visual Studio 2015) and the .NET Core Tools 1.0.0-preview4 (Visual Studio 2017).  With both versions, we created a project with the command line tools and with Visual Studio.  From there we spend some time analyzing each of the files and compared and contrasted the project structure.

In this post, we will take a look at migrating from preview2 to preview4 and discuss any nuances that come with it.  This is the final post in a three part series.  If you missed any of the previous posts, please feel free to take a look.


There are two options to upgrade your project, with Visual Studio or via the Command Line. For consistency, we will upgrade our command line project with the command line and the Visual Studio project with Visual Studio. Lets start with the command line.

Command Line

If we run dotnet --help, we will see that there is a migrate command.

migrate Migrates a project.json based project to a msbuild based project

Lets run it as see what happens!

> dotnet migrate

Project JrTech.Core101.Cmd migration succeeded (C:\Users\Jason\Desktop\JrTech.Core101.Cmd)
Total Projects: 1
Succeeded Projects: 1
Failed Projects: 0

This leaves us with the following file structure.

├── backup
| └── project.json
| └── project.lock.json
├── bin
├── obj
├── JrTech.Core101.Cmd.csproj
├── Program.cs

The backup folder contains copys of the original project.json and project.lock.json files. This is nice in case we have to revert our changes but, of course we have everything in source control :). Lets take a look at the csproj file.

<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">

        <PackageTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">$(PackageTargetFallback);dnxcore50</PackageTargetFallback>

        <Compile Include="**\*.cs" />


    <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">
        <PackageReference Include="Microsoft.NETCore.App">

    <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">


Very similar as if we would have created the project from scratch. While there are a few additional elements added to the xml, there doesn’t appear to be anything of significance. Lets try running the project to make sure everything went through fine.

> dotnet run

Hello World!

Well that was pretty straight forward. Everything looks good. Lets try out the upgrade process with Visual Studio.

Visual Studio

With Visual Studio 2017 RC open, we browse to the solution we created with Visual Studio 2015. Upon doing so, we get the typical Visual Studio upgrade dialog.

Visual Studio 2017 Upgrade

After the upgrade is completed, we are presented with a Migration Report. If you’re familiar with Visual Studio, chances are you’ve see this report in the past.

Visual Studio 2017 Migration Report

Next lets run the solution and make sure everything will build without errors. Everything works fine and we get the same output.

Hello World!

Now lets have a look at the project structure.

├── backup
| └── JrTech.Core101.Vs.sln
| └── src
| | └── JrTech.Core101.Vs
| | | └── JrTech.Core101.Cmd.xproj
| | | └── project.json
├── src
| | └── JrTech.Core101.Vs
| | | └── bin
| | | └── obj
| | | └── Properties
| | | └── JrTech.Core101.csproj
| | | └── JrTech.Core101.xproj
| | | └── Program.cs
| | | └── project.json
| | | └── project.lock.json
├── global.json
├── JrTech.Core101.Cmd.sln
├── UpgradeLog.htm

Similar situation as before. All the old files are placed in a backup directory. Unfortunately, the old project files (xproj, project.json, etc) are left in the main project folder. Of course, less than desirable. I ran the upgrade several times and wound up with the same results.

In fairness, this is an RC version of the software but, rest assured, I will be reporting this with the team so they can fix it by the time Visual Studio if officially released.

Submitting issues is easy. Essentially just following the instructions provided in this link! If your interested, you can track the problem here.