net core blimey! windows platform user group, manchester

39
.NET Core Blimey. @citizenmatt

Upload: citizenmatt

Post on 14-Feb-2017

235 views

Category:

Software


1 download

TRANSCRIPT

.NET CoreBlimey.

@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 SourceCross 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 FrameworkCode merged back to TFS

• .NET Core is (currently) a strict subset of the .NET Framework

• Missing pieces in .NET CoreWindows: 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 Librariesnot scalable

Cross platform

Independent release cyclesRuntime, BCL, apps

Nano Server

Tidy up15 years of evolution

Why?

Why?

Multiple .NET stacks. Incompatibilities

Portable Class Librariesnot scalable

Cross platform

Independent release cyclesRuntime, BCL, apps

Nano Server

Tidy up15 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 commandse.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-compilednvm

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 dependenciesTree shaking

• Reflection? Via xml!

• Open Source (dotnet/corert)

• Previously Windows Store onlyNow includes Mac + Linux (!)

• ILtoCPP - IL → C++ → nativeLLILC - 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_ForegroundColorPlatformNotSupportedException

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 AssembliesThese 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 NuGetpackages in \ref folder

• Consuming a package will use thereference assembly at compile time, butimplementation 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 PlatformCan 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.2A .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. lib\net452 is same as lib\netstandard1.2 , as is

• Equivalent of the PCL profile, but less explicit

lib\net452 lib\netstandard1.2 lib\wpa81

.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!

lib\net46lib\netstandard1.3

netstandard

Huh?

Check out standard-platform.md in github.com/dotnet/corefx docs

How does this affect us?

Creating NuGet packages

Target netstandardif possible

Specify .NET Standard Library dependency?

Explicitly specify used dependencies?

Version of dependencies is irrelevantImplied by .NET Standard Platform?

Include PCL andreference 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 win8netcore451 win81

uap10.0

portable-*

What does this mean for Mono?

Lots. Or not much.

Mono == .NET FrameworkMono 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 CLIrunning 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