Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

A common class library consumed by both .NET Core and .Net 4.5.2

I'm fairly new to .Net Core, but have made a working Asp.Net Core WebAPI site - now I want to share some code with another project...

  • I have Visual Studio 2015 with Update 3 installed.
  • I have DotNetCore.1.0.0-VS2015Tools.Preview2.exe installed from here.

I would like to create a shared library (PCL) that can be consumed by two other libraries - it only contains primitive classes/interfaces with no other dependencies. One of the consuming libraries is a new vanilla project targeting "netstandard1.6", the other is an old client library which targets .Net 4.5.2 (I can upgrade this to 4.6.x if I must).

I've been round in circles, and I can't make the netstandard1.6 library reference the PCL - I just get told the types are missing:

Error CS0246: The type or namespace name 'SomeTypeHere' could not be found (are you missing a using directive or an assembly reference?)

The PCL named "ClassLibrary1"'s project.json is auto-generated as:

{
  "supports": {},
  "dependencies": {
    "Microsoft.NETCore.Portable.Compatibility": "1.0.1",
    "NETStandard.Library": "1.6.0"
  },
  "frameworks": {
    "netstandard1.1": {}
  }
}

My consuming library project.json is:

{
  "version": "1.0.0-*",
  "dependencies": {
    "NETStandard.Library": "1.6.0",
    "Newtonsoft.Json": "9.0.1"
  },
  "frameworks": {
    "netstandard1.6": {
      "dependencies": {
        "ClassLibrary1": {
          "target": "project"
        }
      }
    }
  }
}  

How can I make this work?

EDIT 07/07/2016:

I have made the following solution available, which demonstrates my setup: https://github.com/JonnyWideFoot/netcore-prototype See ExperimentClient::GetLocationAsync for where I would like to use the Contracts Library within the .Net 4.5.2 / 4.6.x Client.

like image 248
Jon Rea Avatar asked Jul 06 '16 15:07

Jon Rea


1 Answers

Here's how I create shared libraries that can be consumed from both .NET Core projects and .NET 4.5 projects:

SharedLibrary\project.json

"dependencies": { },
"frameworks": {
  "net45": { },
  "netstandard1.1": {
    "dependencies": {
      "NETStandard.Library": "1.6.0"
    }
  }
},
"version": "1.0.0"

A consuming (.NET Core) library in the same solution references it like this:

"dependencies": {
  "SharedLibrary": {
    "target": "project",
    "version": "1.0.0"
  }
},
"frameworks": {
  "netstandard1.1": { }
  }
}

A consuming .NET 4.5 project using project.json would look the same with the exception of net45 in the frameworks section. Installing in a csproj-based .NET 4.5 project works too, if a NuGet package for SharedLibrary is produced.

According to the .NET Platform Standard docs, simply targeting netstandard1.1 should allow the shared library to be installed in .NET 4.5+ projects as well. I've run into strange issues with that, but it may have been the result of beta tooling.

like image 136
Nate Barbettini Avatar answered Oct 27 '22 01:10

Nate Barbettini