References and Class Library Asp.Net vNext – Alpha 3

This blog post is about how to add references and creating Class Libraries for Asp.Net vNext applications. There are two ways of creating a Class Library, either by adding a new project and select Asp.Net vNext Class Library template or just creating a sub folder and add a project.json file to that folder. We can also reference to a NuGet package that already includes a Class Library. Adding a reference to a NuGet or Class Library is done by using the project’s project.json file.

Adding a reference to a NuGet package

An Asp.Net vNext project has a project.json file located in the root folder of the project. This project.json file contains configurations of the project, for example references to dependencies. The following is an example of the project.json file:

{
   "dependencies": {
   },
   "frameworks" : {
      "net451" : { },
      "k10" : { 
         "dependencies": {
            "System.Console": "4.0.0.0"
         }
      }
   }
}


There are two places where dependencies can be configured in the project.json file, the root “dependencies” property, or to a specific framework, for example “net451” (Normal .Net Framework) or the “k10” (A sub set of the .Net Framework and is referred to the cloud-optimized version).  If we want to use EntityFramework we can for example reference to it in the root “dependencies” property:

{
   "dependencies": {
      "EntityFramework": "7.0.0-alpha3"
   },
   "frameworks" : {
      "net451" : { },
      "k10" : { 
         "dependencies": {
            "System.Console": "4.0.0.0"
         }
      }
   }
}


When dependencies is configured and the project.json file is saved, all the dependencies will be downloaded from a NuGet source. The packaged will be downloaded and extracted to global folder, the “%userprofile%\.kpm” or “$HOME\.kpm” (on *nix) on your machine. This will make sure the “packages” folder will not be added to our solution, and there will be one global place where all the NuGet packages will be located. So now there is no more duplications of packages for each solutions.

By default an Asp.Net vNext project will be using the .Net Framework (not the cloud-optimized), and all references added to our project will be taken from the NuGet’s “net45” folder under its “lib” folder. If we change the project to target the cloud-optimized .Net Framework, the references will be taken from the “k10” folder instead. 


To change the target framework to use another framework, for example the cloud-optimized framework, we simply right click on our project in the solution explorer and select properties. Change the “Active Target Framework” to “.Net Core Framework 4.5”.

When the target framework is changed to the cloud-optimized framework, the references will be taken from the referenced NuGet packages “k10” folder. It will also change and replace all other references to use the cloud-optimized .Net Framework and the dependencies added to the project.json file under the “k10” property (in this case the System.Console).

{
   "dependencies": {
      "EntityFramework": "7.0.0-alpha3"
   },
   "frameworks" : {
      "net451" : { },
      "k10" : {
         "dependencies": {
            "System.Console": "4.0.0.0"
         }
      }
   }
}


The following is a project targeting the “.Net Framework 4.5.1”, take a look at the added references:

 


When the project’s targeting framework is changed to the “.Net Core Framework 4.5” the reference will be changed:



If a dependencies is added to the “k10”, for example EntityFramework:

{
   "dependencies": {
   },
   "frameworks" : {
   "net451" : { },
      "k10" : { 
         "dependencies": {
            "System.Console": "4.0.0.0",
            "EntityFramework": "7.0.0-alpha3"
         }
      }
   }
}


Only when the project’s targeting framework is set to the cloud-optimized EntityFramework will be added as a reference. 

Adding a Class Library by using the “Asp.Net vNext Class Library” template.

To add a Class Library to our project we do what we always have done, right click on our solution, select Add -> Add New Project and select the “Asp.Net vNext Class Library” template.

Note: We can’t use the normal “Class Library” template, it will not work because it doesn’t uses the new Asp.Net vNext project structure.

Adding a reference to the created Class Library is done by adding it to the “dependencies” property in our project’s project.json file.

{
   "dependencies": {
      "Classlibrary3": ""
   },
   "frameworks" : {
      "net451" : { },
      "k10" : { 
         "dependencies": {
            "System.Console": "4.0.0.0"
         }
      }
   }
}


The Class Library will be added as a reference to our project when the project.json file is saved.

If we want to change the version of our Class Library, we can add the “version” property to our Class Library’s project.json file.

{
   "version": "1.1.0.0",
   …
}


A NuGet package will be created when we build our Class Library. It contains two folders with assemblies for the “k10” and “net45” framework. This package can then be shared among others by adding it to a NuGet repository.


Creating a Class Library as a folder


We can also create a Class Library by adding a folder in the root folder of our solution, then add a project.json file to that folder.

 

 


To reference to the Class Library we simply just add the name of the folder to the "dependencies" property in the project’s project.json file. The folder and its content will be automatically loaded into our solution as a Class Library and will be ready for use.

 

Summary


There are two ways of creating a Class Library, either by adding a new project and select Asp.Net vNext Class Library template or just creating a folder under your project and add a project.json file. There is also a third way and that is using a NuGet package. Adding a reference to a NuGet or Class Library is done by using the project’s project.json file.

Feel free to follow me on twitter: @fredrikn

6 Comments

  • Very nice psot thankss

  • I need to add a .NET 4.5 assembly to my vNext project, and have followed the above instructions. The library appears in the References node, but I couldn't access the classes in the project. Any thoughts what is missing?

    This is how the dependency looks like in my current setup.

    "frameworks": {
    "aspnet50": {
    "dependencies": {
    "ClassLibrary2": "1.0.0-*"
    }
    }
    }

    Then, say I want to access one of the classes in the assembly in the controller, like this.

    public class HomeController : Controller
    {
    public IActionResult About()
    {
    ClassLibrary2.Class1 test = new ClassLibrary2.Class1(); // <= Won't compile. vNext complaint that Class1 cannot be found.
    }
    }

    This supposed to be simple and straightforward, but oddly vNext just doesn't seem to work that way.

    Thanks!

  • Does this solve the common nuget hell dependency problem? Lets say I have a solution (main application) A, and I have two other Project B, and C. B and C are published as nuget packages. B depends on the C (nuget reference), and A depends on both B, and C. Now if B is referencing older version of C, but A is referencing latest version of C, when A builds B's dependency references (C) will overwrite A references (C),....so now I have A bit containing older version of C. Can this be solved by project.json?

  • Thank you for helpfull post :)

  • I need to add a .NET 4.5 assembly to my vNext project, and have followed the above instructions. The library appears in the References node, but I couldn't access the classes in the project. Any thoughts what is missing?

    This is how the dependency looks like in my current setup.

    "frameworks": {
    "aspnet50": {
    "dependencies": {
    "ClassLibrary2": "1.0.0-*"
    }
    }
    }

    Then, say I want to access one of the classes in the assembly in the controller, like this.

    public class HomeController : Controller
    {
    public IActionResult About()
    {
    ClassLibrary2.Class1 test = new ClassLibrary2.Class1(); // <= Won't compile. vNext complaint that Class1 cannot be found.
    }
    }

    This supposed to be simple and straightforward, but oddly vNext just doesn't seem to work that way.

    Thanks!

  • I need to add a .NET 4.5 assembly to my vNext project, and have followed the above instructions. The library appears in the References node, but I couldn't access the classes in the project. Any thoughts what is missing?

    This is how the dependency looks like in my current setup.

    "frameworks": {
    "aspnet50": {
    "dependencies": {
    "ClassLibrary2": "1.0.0-*"
    }
    }
    }

    Then, say I want to access one of the classes in the assembly in the controller, like this.

    public class HomeController : Controller
    {
    public IActionResult About()
    {
    ClassLibrary2.Class1 test = new ClassLibrary2.Class1(); // <= Won't compile. vNext complaint that Class1 cannot be found.
    }
    }

    This supposed to be simple and straightforward, but oddly vNext just doesn't seem to work that way.

Add a Comment

As it will appear on the website

Not displayed

Your website