.NET Core
Blimey.
@citizenmatt
This is Matt Ellis
He works for Microsoft, and is a developer on
the .NET Core team.

This is not me.
This is Matt Ellis
He works for JetBrains, and is an interested
amateur in .NET Core.

This is me.
What is .NET Core?
New .NET stack - CLR + BCL
Open Source
Cross platform
Standalone -

per-application installs
Factored for modularity -
“cloud optimised”
Everything ships as
NuGet packages,
including the runtime
Not finished…

RTM Q1 2016 (ish)
.NET Core != .NET Framework
NOT a new version of the .NET Framework
• .NET Framework is going nowhere
• .NET Core is 5.0 1.0

.NET Framework is 4.6
• .NET Core is a fork of the .NET Framework

Code merged back to TFS
• .NET Core is (currently) a strict subset of
the .NET Framework
• Missing pieces in .NET Core

Windows: WinForms, WPF, COM, etc.

Platform: AppDomains, Remoting,
Reflection.Emit, etc.
• Different constraints:

Ship cycles, compatibility, system wide install
Why?
Multiple .NET stacks.
Incompatibilities
Portable Class Libraries

not scalable
Cross platform
Independent release cycles

Runtime, BCL, apps
Nano Server
Tidy up

15 years of evolution
Why?
Why?
Multiple .NET stacks.
Incompatibilities
Portable Class Libraries

not scalable
Cross platform
Independent release cycles

Runtime, BCL, apps
Nano Server
Tidy up

15 years of evolution
History
Started with .NET Framework 2.0
How do I get it?
NuGet
How do I get it?
.NET CLI tools (née DNX)
Official installer from dotnet.github.io
dotnet.exe, compilers (csc, vbc, fsc, ilc), NuGet,

own .NET Core instance (runtime + fx)
dotnet.exe is a driver for other commands

e.g. dotnet foo simply executes dotnet-foo
No more dnvm - runtime is genuine NuGet dependency now

(“runtime.osx….” packages)
Global package cache
dotnet compile dotnet-compile
dnvm
runtime.osx.…
dotnet.exe
How do I get it?
Build it from source!
Architecture
Boxes and bits.
CoreRT (née .NET Native)
Alternative runtime (optimisation)
• AOT compilation (RyuJIT → Native)
• Compiles all dependencies

Tree shaking
• Reflection? Via xml!
• Open Source (dotnet/corert)
• Previously Windows Store only

Now includes Mac + Linux (!)

• ILtoCPP - IL → C++ → native

LLILC - LLVM based JIT/AOT
CoreCLR The new runtime.
dotnet/coreclr
JIT compiler (RyuJIT), Garbage Collector, Platform Abstraction Layer - C++
mscorlib (tightly coupled to runtime) - C#
PAL - OS and platform differences. E.g. exception handling, threads, etc.

P/Invoke to OS, FEATURE #ifdefs
Book of the Runtime!
Mirror back to TFS
CoreFX The new BCL.
dotnet/corefx
Factored for modularity - each solution/assembly is a package
Some platform specific implementations, e.g. System.Console,
Process.Interop.Unix.cs, etc.
Might throw PlatformNotSupportedException

(e.g. Console.get_ForegroundColor )
Build is based on project.json, packages as references
Mirrored to TFS + .NET Framework
High compatibility bar for changes, transparent API review process
Console.get_ForegroundColor
PlatformNotSupportedException
AppModels
Or: How do you run a .exe on Unix?
How the application is hosted and run
Environmental services
What is an AppModel?
Bootstrap the CLR
Execute the
application
.NET Framework AppModels
.NET .exe
Originally a native stub that
loaded the CLR (x86 only!)
Special cased by OS loader
since Windows XP
Loads mscoree.dll, which
initialises CLR and executes
app
IIS/asp.net
Pre-IIS 7 - ISAPI filter
IIS 7 directly integrates CLR
Pipes requests/responses to
managed code
Lifetime management
Windows Phone /
Windows Store
Magic!
“Application host” loads CLR
Integrates with environment
events. E.g. suspend and
resume applications
Pre-compiled / .NET Native
corerun
.NET CLI
Windows 10 UWP
Applications
.NET Core AppModels
coreconsole /
osxcorebundlerun
.NET CLI (née DNX)
Dot NET Execution Environment
started with
ASP.NET Core
Targets .NET Core /

.NET Framework /
Mono
Self contained .NET Core
environment
Changes project system

Reference packages, not assemblies
More…
• Packages for runtime and BCL
• BCL factored into many packages
• NuGet at heart of project system
(project.json/.xproj)
• .NET Standard Platform
• NuGet is the new Portable Class
Library
NuGet
.NET Standard Platform
How does it work?
.NET Core app

.NET Core package
PCL package
.NET Framework package
.NET Framework app
 ?
PCL Refresher
1. A PCL is a class library that needs to run on multiple platforms and versions

(e.g. .NET Framework, Windows Phone, Xamarin)
2. It defines a common subset of APIs that are available on ALL of the required
versions of these platforms - a “Profile”
3. When targeting a Profile, the compiler references a set of Reference Assemblies

These describe the API with empty types, and forward types to correct assemblies
4. At runtime, the real assemblies on the target platform implement the APIs

Can also forward types to other assemblies
Portable Class Libraries
• PCL hides platform specific implementation details behind a common API
contract (reference assembly)
• Reference assemblies allow moving implementations to other assemblies
• Profiles do not scale. The more versions and platforms, the more Profiles…
• A published PCL lists all supported platforms (e.g. portable-win+net40+wp)

If a new platform is created, it isn’t supported
• Profiles need to be installed

How does this work in the app-local, NuGet-based .NET Core world?
Reference Assemblies in .NET Core
• Allows for different implementations on different platforms and operating
systems, but common API
• Allows for refactoring the BCL!
• Reference assemblies shipped in NuGet

packages in ref folder
• Consuming a package will use the

reference assembly at compile time, but

implementation assembly at runtime
ref
What is the .NET Standard Platform?
Abstraction for platforms
.NET Standard Platform
• A new, versioned, abstract platform that all other platforms can map to
• An app/lib can target a version of the .NET Standard Platform

Can consume any package from any platform that is compatible with that version of
the .NET Standard Platform
• E.g. .NET Framework 4.5.2 maps to .NET Standard Platform 1.2

A .NET Framework 4.5.2 app/lib can consume any package that targets any platform that
maps to .NET Standard Platform 1.2 or earlier
• NuGet knows the mapping

E.g. libnet452 is same as libnetstandard1.2 , as is
• Equivalent of the PCL profile, but less explicit
libnet452 libnetstandard1.2 libwpa81
.NET Standard Platform Versions
Platforms
• All platforms conform to a specific version of the .NET Standard Platform
• Packages can target a concrete platform (e.g. lib/net46 ) or a specific version of
the .NET Standard Platform (e.g. lib/netstandard1.3 ). Or both!
• NuGet understands mappings between real platforms and netstandard versions

(and PCLs)
• Can consume any compatible platform
• Replaces PCLs with a single versioned moniker. Creating a new platform is easy
• Only works with .NET Framework ≧ 4.5!
libnet46
libnetstandard1.3
netstandard
Huh?
Check out standard-platform.md in github.com/dotnet/corefx docs
How does this affect us?
Creating NuGet packages
Target netstandard

if possible

Specify .NET Standard
Library dependency?
Explicitly specify used
dependencies?
Version of dependencies is irrelevant

Implied by .NET Standard Platform?
Include PCL and

reference assembly

if required
New Target Framework Monikers
Brand new
• dotnet - - .NET Core contracts. Replaces portable- . Use this!

Supports .Net Framework 4.5 and later (inc. Xamarin)
• dnx451 , dnx46 - - Application running on .NET CLI
• uap10.0 - Windows 10 apps

(Confusingly AKA , following on from netcore45 / win8 and
netcore451 / win81)
netstandard1.X
netstandardapp1.X
netcore50 netcore45 win8
netcore451 win81
uap10.0
portable-*
What does this mean for Mono?
Lots. Or not much.
Mono == .NET Framework
Mono already
cross platform
Mono’s focus is
non-Windows
mobile (Xamarin)
.NET Core’s focus
is server and
Windows UWP
Mono can include
CoreCLR + CoreFX
code
Microsoft just
bought Xamarin…
Where does Roslyn fit in?
Portability.
Originally built for .NET
Framework (+ Mono)
Now ships with .NET CLI

running on .NET Core
C# compiler

written in C#
Cross platform C#/VB
compiler! (F# too)
.NET Core
Cross platform
Open Source
NuGet everywhere
Bleeding edge
(but getting there)
Icons: http://icons8.com/
The future of .NET
Links
CoreCLR - https://github.com/dotnet/coreclr
CoreFX - https://github.com/dotnet/corefx
CoreRT (.NET Native) - https://github.com/dotnet/corert
.NET CLI - https://github.com/dotnet/cli
NuGet - http://docs.nuget.org
@citizenmatt

.NET Core Blimey! Windows Platform User Group, Manchester

  • 1.
  • 2.
    This is MattEllis He works for Microsoft, and is a developer on the .NET Core team. This is not me.
  • 3.
    This is MattEllis He works for JetBrains, and is an interested amateur in .NET Core. This is me.
  • 4.
    What is .NETCore? New .NET stack - CLR + BCL Open Source Cross platform Standalone -
 per-application installs Factored for modularity - “cloud optimised” Everything ships as NuGet packages, including the runtime Not finished…
 RTM Q1 2016 (ish)
  • 5.
    .NET Core !=.NET Framework NOT a new version of the .NET Framework • .NET Framework is going nowhere • .NET Core is 5.0 1.0
 .NET Framework is 4.6 • .NET Core is a fork of the .NET Framework
 Code merged back to TFS • .NET Core is (currently) a strict subset of the .NET Framework • Missing pieces in .NET Core
 Windows: WinForms, WPF, COM, etc.
 Platform: AppDomains, Remoting, Reflection.Emit, etc. • Different constraints:
 Ship cycles, compatibility, system wide install
  • 6.
    Why? Multiple .NET stacks. Incompatibilities PortableClass Libraries
 not scalable Cross platform Independent release cycles
 Runtime, BCL, apps Nano Server Tidy up
 15 years of evolution
  • 7.
  • 8.
    Why? Multiple .NET stacks. Incompatibilities PortableClass Libraries
 not scalable Cross platform Independent release cycles
 Runtime, BCL, apps Nano Server Tidy up
 15 years of evolution
  • 9.
  • 10.
    How do Iget it? NuGet
  • 11.
    How do Iget it? .NET CLI tools (née DNX) Official installer from dotnet.github.io dotnet.exe, compilers (csc, vbc, fsc, ilc), NuGet,
 own .NET Core instance (runtime + fx) dotnet.exe is a driver for other commands e.g. dotnet foo simply executes dotnet-foo No more dnvm - runtime is genuine NuGet dependency now (“runtime.osx….” packages) Global package cache dotnet compile dotnet-compile dnvm runtime.osx.… dotnet.exe
  • 12.
    How do Iget it? Build it from source!
  • 13.
  • 14.
    CoreRT (née .NETNative) Alternative runtime (optimisation) • AOT compilation (RyuJIT → Native) • Compiles all dependencies
 Tree shaking • Reflection? Via xml! • Open Source (dotnet/corert) • Previously Windows Store only
 Now includes Mac + Linux (!)
 • ILtoCPP - IL → C++ → native
 LLILC - LLVM based JIT/AOT
  • 15.
  • 16.
    dotnet/coreclr JIT compiler (RyuJIT),Garbage Collector, Platform Abstraction Layer - C++ mscorlib (tightly coupled to runtime) - C# PAL - OS and platform differences. E.g. exception handling, threads, etc.
 P/Invoke to OS, FEATURE #ifdefs Book of the Runtime! Mirror back to TFS
  • 17.
  • 18.
    dotnet/corefx Factored for modularity- each solution/assembly is a package Some platform specific implementations, e.g. System.Console, Process.Interop.Unix.cs, etc. Might throw PlatformNotSupportedException
 (e.g. Console.get_ForegroundColor ) Build is based on project.json, packages as references Mirrored to TFS + .NET Framework High compatibility bar for changes, transparent API review process Console.get_ForegroundColor PlatformNotSupportedException
  • 19.
    AppModels Or: How doyou run a .exe on Unix?
  • 20.
    How the applicationis hosted and run Environmental services What is an AppModel? Bootstrap the CLR Execute the application
  • 21.
    .NET Framework AppModels .NET.exe Originally a native stub that loaded the CLR (x86 only!) Special cased by OS loader since Windows XP Loads mscoree.dll, which initialises CLR and executes app IIS/asp.net Pre-IIS 7 - ISAPI filter IIS 7 directly integrates CLR Pipes requests/responses to managed code Lifetime management Windows Phone / Windows Store Magic! “Application host” loads CLR Integrates with environment events. E.g. suspend and resume applications Pre-compiled / .NET Native
  • 22.
    corerun .NET CLI Windows 10UWP Applications .NET Core AppModels coreconsole / osxcorebundlerun
  • 23.
    .NET CLI (néeDNX) Dot NET Execution Environment started with ASP.NET Core Targets .NET Core /
 .NET Framework / Mono Self contained .NET Core environment Changes project system
 Reference packages, not assemblies More…
  • 24.
    • Packages forruntime and BCL • BCL factored into many packages • NuGet at heart of project system (project.json/.xproj) • .NET Standard Platform • NuGet is the new Portable Class Library NuGet .NET Standard Platform
  • 25.
    How does itwork? .NET Core app .NET Core package PCL package .NET Framework package .NET Framework app ?
  • 26.
    PCL Refresher 1. APCL is a class library that needs to run on multiple platforms and versions
 (e.g. .NET Framework, Windows Phone, Xamarin) 2. It defines a common subset of APIs that are available on ALL of the required versions of these platforms - a “Profile” 3. When targeting a Profile, the compiler references a set of Reference Assemblies
 These describe the API with empty types, and forward types to correct assemblies 4. At runtime, the real assemblies on the target platform implement the APIs
 Can also forward types to other assemblies
  • 27.
    Portable Class Libraries •PCL hides platform specific implementation details behind a common API contract (reference assembly) • Reference assemblies allow moving implementations to other assemblies • Profiles do not scale. The more versions and platforms, the more Profiles… • A published PCL lists all supported platforms (e.g. portable-win+net40+wp)
 If a new platform is created, it isn’t supported • Profiles need to be installed
 How does this work in the app-local, NuGet-based .NET Core world?
  • 28.
    Reference Assemblies in.NET Core • Allows for different implementations on different platforms and operating systems, but common API • Allows for refactoring the BCL! • Reference assemblies shipped in NuGet
 packages in ref folder • Consuming a package will use the
 reference assembly at compile time, but
 implementation assembly at runtime ref
  • 29.
    What is the.NET Standard Platform? Abstraction for platforms
  • 30.
    .NET Standard Platform •A new, versioned, abstract platform that all other platforms can map to • An app/lib can target a version of the .NET Standard Platform
 Can consume any package from any platform that is compatible with that version of the .NET Standard Platform • E.g. .NET Framework 4.5.2 maps to .NET Standard Platform 1.2
 A .NET Framework 4.5.2 app/lib can consume any package that targets any platform that maps to .NET Standard Platform 1.2 or earlier • NuGet knows the mapping
 E.g. libnet452 is same as libnetstandard1.2 , as is • Equivalent of the PCL profile, but less explicit libnet452 libnetstandard1.2 libwpa81
  • 31.
  • 32.
    Platforms • All platformsconform to a specific version of the .NET Standard Platform • Packages can target a concrete platform (e.g. lib/net46 ) or a specific version of the .NET Standard Platform (e.g. lib/netstandard1.3 ). Or both! • NuGet understands mappings between real platforms and netstandard versions
 (and PCLs) • Can consume any compatible platform • Replaces PCLs with a single versioned moniker. Creating a new platform is easy • Only works with .NET Framework ≧ 4.5! libnet46 libnetstandard1.3 netstandard
  • 33.
    Huh? Check out standard-platform.mdin github.com/dotnet/corefx docs
  • 34.
    How does thisaffect us? Creating NuGet packages Target netstandard
 if possible
 Specify .NET Standard Library dependency? Explicitly specify used dependencies? Version of dependencies is irrelevant
 Implied by .NET Standard Platform? Include PCL and
 reference assembly
 if required
  • 35.
    New Target FrameworkMonikers Brand new • dotnet - - .NET Core contracts. Replaces portable- . Use this!
 Supports .Net Framework 4.5 and later (inc. Xamarin) • dnx451 , dnx46 - - Application running on .NET CLI • uap10.0 - Windows 10 apps
 (Confusingly AKA , following on from netcore45 / win8 and netcore451 / win81) netstandard1.X netstandardapp1.X netcore50 netcore45 win8 netcore451 win81 uap10.0 portable-*
  • 36.
    What does thismean for Mono? Lots. Or not much. Mono == .NET Framework Mono already cross platform Mono’s focus is non-Windows mobile (Xamarin) .NET Core’s focus is server and Windows UWP Mono can include CoreCLR + CoreFX code Microsoft just bought Xamarin…
  • 37.
    Where does Roslynfit in? Portability. Originally built for .NET Framework (+ Mono) Now ships with .NET CLI
 running on .NET Core C# compiler
 written in C# Cross platform C#/VB compiler! (F# too)
  • 38.
    .NET Core Cross platform OpenSource NuGet everywhere Bleeding edge (but getting there) Icons: http://icons8.com/ The future of .NET
  • 39.
    Links CoreCLR - https://github.com/dotnet/coreclr CoreFX- https://github.com/dotnet/corefx CoreRT (.NET Native) - https://github.com/dotnet/corert .NET CLI - https://github.com/dotnet/cli NuGet - http://docs.nuget.org @citizenmatt