2. This is Matt Ellis
He works for Microsoft, and is a developer on
the .NET Core team.
This is not me.
3. This is Matt Ellis
He works for JetBrains, and is an interested
amateur in .NET Core.
This is me.
4. 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)
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
11. 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
14. 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
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
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
20. How the application is 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
23. .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…
24. • 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
25. How does it work?
.NET Core app
.NET Core package
PCL package
.NET Framework package
.NET Framework app
?
26. 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
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
32. 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
34. 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
35. 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-*
36. 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
37. Where does Roslyn fit in?
Orthogonal.
Runs on .NET
Framework + Mono
Ships with .NET CLI
running on .NET Core
Compiling CoreCLR + CoreFX
currently requires Windows/Mono
C# compiler
written in C#
38. .NET Core
Cross platform
Open Source
NuGet everywhere
Bleeding edge
(but getting there)
Icons: http://icons8.com/
The future of .NET