.Net core

.NET Core to develop console or Web applications. .NET Core is a set of runtime, library and compiler components that allow you to create apps that run on Windows, macOS and Linux.

In browser tutorial

Sample hello world

.
├── appSolution.sln
├── Dockerfile
├── myApp
│   ├── myApp.csproj
│   └── Program.cs
├── myLib
│   ├── Class1.cs
│   └── myLib.csproj
├── myLibTests
│   ├── myLibTests.csproj
│   └── UniTest1.cs

Dockerfile

FROM microsoft/dotnet:2.0-sdk
WORKDIR /app
RUN apt-get update
RUN apt-get install net-tools procps vim nano -y
RUN mkdir -p /app/myApp
RUN mkdir -p /app/myLib
RUN mkdir -p /app/myLibTests
ADD myApp/* /app/myApp/
ADD myLib/* /app/myLib/
ADD myLibTests/* /app/myLibTests/
ADD appSolution.sln /app/
RUN cd /app && dotnet clean && dotnet build
RUN cd /app/myLibTests && dotnet clean && dotnet test
CMD cd /app/myApp/ && dotnet bin/Debug/netcoreapp2.0/myApp.dll && tail -f /var/log/lastlog
#CMD  tail -f /var/log/lastlog

appSolution.sln

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26124.0
MinimumVisualStudioVersion = 15.0.26124.0
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "myApp", "myApp\myApp.csproj", "{5E009AC4-9BF5-4E1B-9C22-377AC9ECC4EB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "myLib", "myLib\myLib.csproj", "{00D6703F-2D64-4D9A-95AA-430DC38E4EC3}"
EndProject
Global
        GlobalSection(SolutionConfigurationPlatforms) = preSolution
                Debug|Any CPU = Debug|Any CPU
                Debug|x64 = Debug|x64
                Debug|x86 = Debug|x86
                Release|Any CPU = Release|Any CPU
                Release|x64 = Release|x64
                Release|x86 = Release|x86
        EndGlobalSection
        GlobalSection(SolutionProperties) = preSolution
                HideSolutionNode = FALSE
        EndGlobalSection
        GlobalSection(ProjectConfigurationPlatforms) = postSolution
                {5E009AC4-9BF5-4E1B-9C22-377AC9ECC4EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
                {5E009AC4-9BF5-4E1B-9C22-377AC9ECC4EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
                {5E009AC4-9BF5-4E1B-9C22-377AC9ECC4EB}.Debug|x64.ActiveCfg = Debug|x64
                {5E009AC4-9BF5-4E1B-9C22-377AC9ECC4EB}.Debug|x64.Build.0 = Debug|x64
                {5E009AC4-9BF5-4E1B-9C22-377AC9ECC4EB}.Debug|x86.ActiveCfg = Debug|x86
                {5E009AC4-9BF5-4E1B-9C22-377AC9ECC4EB}.Debug|x86.Build.0 = Debug|x86
                {5E009AC4-9BF5-4E1B-9C22-377AC9ECC4EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
                {5E009AC4-9BF5-4E1B-9C22-377AC9ECC4EB}.Release|Any CPU.Build.0 = Release|Any CPU
                {5E009AC4-9BF5-4E1B-9C22-377AC9ECC4EB}.Release|x64.ActiveCfg = Release|x64
                {5E009AC4-9BF5-4E1B-9C22-377AC9ECC4EB}.Release|x64.Build.0 = Release|x64
                {5E009AC4-9BF5-4E1B-9C22-377AC9ECC4EB}.Release|x86.ActiveCfg = Release|x86
                {5E009AC4-9BF5-4E1B-9C22-377AC9ECC4EB}.Release|x86.Build.0 = Release|x86
                {00D6703F-2D64-4D9A-95AA-430DC38E4EC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
                {00D6703F-2D64-4D9A-95AA-430DC38E4EC3}.Debug|Any CPU.Build.0 = Debug|Any CPU
                {00D6703F-2D64-4D9A-95AA-430DC38E4EC3}.Debug|x64.ActiveCfg = Debug|x64
                {00D6703F-2D64-4D9A-95AA-430DC38E4EC3}.Debug|x64.Build.0 = Debug|x64
                {00D6703F-2D64-4D9A-95AA-430DC38E4EC3}.Debug|x86.ActiveCfg = Debug|x86
                {00D6703F-2D64-4D9A-95AA-430DC38E4EC3}.Debug|x86.Build.0 = Debug|x86
                {00D6703F-2D64-4D9A-95AA-430DC38E4EC3}.Release|Any CPU.ActiveCfg = Release|Any CPU
                {00D6703F-2D64-4D9A-95AA-430DC38E4EC3}.Release|Any CPU.Build.0 = Release|Any CPU
                {00D6703F-2D64-4D9A-95AA-430DC38E4EC3}.Release|x64.ActiveCfg = Release|x64
                {00D6703F-2D64-4D9A-95AA-430DC38E4EC3}.Release|x64.Build.0 = Release|x64
                {00D6703F-2D64-4D9A-95AA-430DC38E4EC3}.Release|x86.ActiveCfg = Release|x86
                {00D6703F-2D64-4D9A-95AA-430DC38E4EC3}.Release|x86.Build.0 = Release|x86
        EndGlobalSection
EndGlobal

myApp/Program.cs

   1 using System;
   2 using myLib;
   3 
   4 namespace myApp
   5 {
   6     class Program
   7     {
   8         static void Main(string[] args)
   9         {
  10             Console.WriteLine( Class1.getHelloWorld() );
  11         }
  12     }
  13 }

myApp/myApp.csproj

   1 <Project Sdk="Microsoft.NET.Sdk">
   2 
   3   <ItemGroup>
   4     <ProjectReference Include="..\myLib\myLib.csproj" />
   5   </ItemGroup>
   6 
   7   <PropertyGroup>
   8     <OutputType>Exe</OutputType>
   9     <TargetFramework>netcoreapp2.0</TargetFramework>
  10   </PropertyGroup>
  11 
  12 </Project>

myLib/Class1.cs

   1 using System;
   2 
   3 namespace myLib
   4 {
   5     public class Class1
   6     {
   7         public static String getHelloWorld()
   8         {
   9             return "Hello world from library.";
  10         }
  11     }
  12 }

myLib/myLib.csproj

   1 <Project Sdk="Microsoft.NET.Sdk">
   2 
   3   <PropertyGroup>
   4     <TargetFramework>netstandard2.0</TargetFramework>
   5   </PropertyGroup>
   6 
   7 </Project>

myLibTests/UniTest1.cs

   1 using System;
   2 using Xunit;
   3 using myLib;
   4 
   5 namespace myLibTests
   6 {
   7     public class UnitTest1
   8     {
   9         [Fact]
  10         public void Test1()
  11         {
  12             Assert.Equal("Hello world from library." , Class1.getHelloWorld() );
  13         }
  14     }
  15 }

myLibTests/myLibTests.csproj

   1 <Project Sdk="Microsoft.NET.Sdk">
   2 
   3   <PropertyGroup>
   4     <TargetFramework>netcoreapp2.0</TargetFramework>
   5 
   6     <IsPackable>false</IsPackable>
   7   </PropertyGroup>
   8 
   9   <ItemGroup>
  10     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.6.0" />
  11     <PackageReference Include="xunit" Version="2.3.1" />
  12     <PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
  13     <DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
  14   </ItemGroup>
  15 
  16   <ItemGroup>
  17     <ProjectReference Include="..\myLib\myLib.csproj" />
  18   </ItemGroup>
  19 
  20 </Project>

Docker commands

   1 #build image
   2 docker build -t dotnetcorehello .
   3 # execute bash in running container
   4 docker exec -it $1 bash
   5 # delete all containers
   6 docker ps -a | awk '//{print $1}' | grep  -v "CONTAINER" | xargs -i sh -c 'docker stop {};docker rm {}'
   7 # execute container using inage dotnetcorehello
   8 docker run -d  dotnetcorehello
   9 # list all containers
  10 docker ps -a

dotnet core commands

   1 # build solution
   2 cd /app 
   3 dotnet clean 
   4 dotnet build
   5 # run tests for library myLibTests
   6 cd /app/myLibTests 
   7 dotnet clean 
   8 dotnet test
   9 # execute app
  10 cd /app/myApp/ 
  11 dotnet bin/Debug/netcoreapp2.0/myApp.dll

test Task

   1 // buiild and run with mono
   2 // mcs testTask.cs 
   3 // mono testTask.exe 
   4 
   5 using System;
   6 using System.Threading.Tasks;
   7 using System.Threading;
   8 // string interpolation with $ might not be supported in mono
   9 
  10 namespace testTask
  11 {
  12     class Program
  13     {
  14         static void Main()
  15         {
  16             var x=1;
  17             // String interpolation $"{varxyz}"
  18             //Console.WriteLine($"ThreadId {Thread.CurrentThread.ManagedThreadId}");
  19             Console.WriteLine("ThreadId {0}",Thread.CurrentThread.ManagedThreadId);
  20             Task t = Task.Run( () => {
  21                 x++;
  22                 Console.WriteLine("Stuff");
  23                 //Console.WriteLine($"ThreadId {Thread.CurrentThread.ManagedThreadId}");
  24                 Console.WriteLine("ThreadId {0}",Thread.CurrentThread.ManagedThreadId);
  25             } );
  26             t.ContinueWith((Task task)=>{
  27                 x++;
  28                 Console.WriteLine("This the end !");
  29                 //Console.WriteLine($"ThreadId {Thread.CurrentThread.ManagedThreadId}");
  30                 Console.WriteLine("ThreadId {0}",Thread.CurrentThread.ManagedThreadId);
  31                 task.ContinueWith((Task t2)=>{
  32                     x++;
  33                     Console.WriteLine("t2 {0}",x);
  34                     Console.WriteLine("ThreadId {0}",Thread.CurrentThread.ManagedThreadId);
  35                 });
  36             });
  37             //t.Wait();  
  38             var tx = Task<long>.Run( ()=>{ return 11L; } );
  39 
  40             tx.ContinueWith((Task<long> txy)=>{
  41                 //Console.WriteLine($"Res: {txy.Result}");
  42                 Console.WriteLine("Res: {0}",txy.Result);
  43             });         
  44         }
  45     }
  46 }

test foreach

   1 //build and run using mono
   2 //mcs testForeach.cs 
   3 //mono testForeach.exe
   4 using System;
   5 using System.Collections.Generic;
   6 
   7 namespace loopNrs
   8 {
   9     class Program
  10     {
  11         static void Main()
  12         {
  13             var numbers = new List<long> { 1,2,3,4 };
  14             foreach (var nr in numbers)
  15             {
  16                 //string interpolation is not supported in mono !?
  17                 // Console.WriteLine($"Hello {nr}!");
  18                 Console.WriteLine("Hello {0}!",nr);
  19             }
  20         }
  21     }
  22 }

Sample DI

Commands:

testDI.csproj

   1 <Project Sdk="Microsoft.NET.Sdk">
   2 
   3   <PropertyGroup>
   4     <OutputType>Exe</OutputType>
   5     <TargetFramework>netcoreapp2.0</TargetFramework>
   6   </PropertyGroup>
   7 
   8   <ItemGroup>
   9     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" />
  10   </ItemGroup>
  11 
  12 </Project>

Program.cs

   1 using System;
   2 using Microsoft.Extensions.DependencyInjection;
   3 
   4 namespace testDI
   5 {
   6     interface IDummy : IDisposable
   7     {
   8         string GetPong();
   9     }
  10 
  11     interface ISnafu : IDisposable
  12     {
  13         string GetSnafu();
  14     }
  15     
  16     interface ITransx : IDisposable
  17     {
  18         string GetTransx();
  19     }
  20     
  21     class Transx : ITransx
  22     {
  23         private string guid;
  24         
  25         public Transx()
  26         {
  27             guid = Guid.NewGuid().ToString();
  28             Console.WriteLine($"Constructed transx {guid} !");
  29         }
  30         
  31         public string GetTransx()
  32         {
  33             return $"Transx {guid} !";
  34         }
  35         
  36         public void Dispose()
  37         {
  38             Console.WriteLine($"Disposing transx {guid} !");
  39         }        
  40     }
  41     
  42     class Dummy : IDummy
  43     {
  44         private string guid;
  45         
  46         public Dummy()
  47         {
  48             guid = Guid.NewGuid().ToString();
  49             Console.WriteLine($"Constructed dummy {guid} !");
  50         }
  51         
  52         public string GetPong()
  53         {
  54             return $"Pong {guid} !";
  55         }
  56         
  57         public void Dispose()
  58         {
  59             Console.WriteLine($"Disposing dummy {guid} !");
  60         }
  61     }
  62     
  63     class Snafu:ISnafu
  64     {
  65         private IDummy dummy;
  66         private string guid;
  67         
  68         public Snafu(IDummy dummy)
  69         {
  70             this.dummy = dummy;
  71             guid = Guid.NewGuid().ToString();
  72             Console.WriteLine($"Constructed snafu {guid} !");
  73         }
  74         
  75         public string GetSnafu()
  76         {
  77             return $"Snafu {guid} related with {dummy.GetPong() }!";
  78         }
  79         
  80         public void Dispose()
  81         {
  82             Console.WriteLine($"Disposing snafu {guid} !");
  83         }        
  84     }
  85     
  86     class Program
  87     {
  88         private static IServiceProvider ioc; //Default implementation ServiceProvider
  89         
  90         private static void PrepareContainer()
  91         {
  92             var serviceCollection = new ServiceCollection();
  93             serviceCollection.AddSingleton<IDummy, Dummy>();
  94             serviceCollection.AddSingleton<ISnafu, Snafu>();
  95             serviceCollection.AddTransient<ITransx, Transx>();
  96             ioc = serviceCollection.BuildServiceProvider();            
  97         }
  98         
  99         static void Main(string[] args)
 100         {
 101             Console.WriteLine("Hello World DI!");
 102             TestOne();
 103             TestTwo();
 104         }
 105         
 106         private static void TestOne()
 107         {
 108             Console.WriteLine("\nTestOne");
 109             PrepareContainer();
 110             var d1 = ioc.GetService<IDummy>();
 111             Console.WriteLine( $"{d1.GetPong()}" );
 112             var d2 = ioc.GetService<IDummy>();
 113             Console.WriteLine( $"{d2.GetPong()}" );
 114             var s1 = ioc.GetService<ISnafu>();
 115             Console.WriteLine($"{s1.GetSnafu()}" );
 116             var s2 = ioc.GetService<ISnafu>();
 117             Console.WriteLine($"{s2.GetSnafu()}" );            
 118             var t1 = ioc.GetService<ITransx>();
 119             Console.WriteLine($"{t1.GetTransx()}" );
 120             var t2 = ioc.GetService<ITransx>();
 121             Console.WriteLine($"{t2.GetTransx()}" );
 122             var t3 = ioc.GetService<ITransx>();
 123             Console.WriteLine($"{t3.GetTransx()}" );            
 124             ReleaseContainer();            
 125         }
 126         
 127         private static void TestTwo()
 128         {
 129             Console.WriteLine("\nTestTwo");
 130             PrepareContainer();            
 131             var sx1 = ioc.GetService<ISnafu>();
 132             Console.WriteLine($"{sx1.GetSnafu()}" );
 133             var dx1 = ioc.GetService<IDummy>();
 134             Console.WriteLine( $"{dx1.GetPong()}" );
 135             var dx2 = ioc.GetService<IDummy>();
 136             Console.WriteLine( $"{dx2.GetPong()}" );
 137             ReleaseContainer();            
 138         }
 139         
 140         private static void ReleaseContainer()
 141         {
 142             // dispose container and services in it
 143             if(ioc is IDisposable)
 144             {
 145                 Console.WriteLine("Can dispose stuff !");
 146                 ( (IDisposable)ioc).Dispose();
 147             }            
 148         }
 149     }
 150 }

Example output

Hello World DI!

TestOne
Constructed dummy 37a7cced-15c3-4b33-9eec-55f0fb58ce8c !
Pong 37a7cced-15c3-4b33-9eec-55f0fb58ce8c !
Pong 37a7cced-15c3-4b33-9eec-55f0fb58ce8c !
Constructed snafu 619160b5-6e67-4396-8555-f453bd1ad06f !
Snafu 619160b5-6e67-4396-8555-f453bd1ad06f related with Pong 37a7cced-15c3-4b33-9eec-55f0fb58ce8c !!
Snafu 619160b5-6e67-4396-8555-f453bd1ad06f related with Pong 37a7cced-15c3-4b33-9eec-55f0fb58ce8c !!
Constructed transx 6cf6600a-e622-46fd-8d10-3b6015601911 !
Transx 6cf6600a-e622-46fd-8d10-3b6015601911 !
Constructed transx c666091c-efe9-407f-8659-6c1bdc7e2b7f !
Transx c666091c-efe9-407f-8659-6c1bdc7e2b7f !
Constructed transx 421a63ca-0e93-4656-ba5c-c8909774827c !
Transx 421a63ca-0e93-4656-ba5c-c8909774827c !
Can dispose stuff !
Disposing transx 421a63ca-0e93-4656-ba5c-c8909774827c !
Disposing transx c666091c-efe9-407f-8659-6c1bdc7e2b7f !
Disposing transx 6cf6600a-e622-46fd-8d10-3b6015601911 !
Disposing snafu 619160b5-6e67-4396-8555-f453bd1ad06f !
Disposing dummy 37a7cced-15c3-4b33-9eec-55f0fb58ce8c !

TestTwo
Constructed dummy 7233afd9-9f2e-43a4-ae1a-bc0abba6abc7 !
Constructed snafu 10298883-4f16-4383-b5b7-ce9e5ad90715 !
Snafu 10298883-4f16-4383-b5b7-ce9e5ad90715 related with Pong 7233afd9-9f2e-43a4-ae1a-bc0abba6abc7 !!
Pong 7233afd9-9f2e-43a4-ae1a-bc0abba6abc7 !
Pong 7233afd9-9f2e-43a4-ae1a-bc0abba6abc7 !
Can dispose stuff !
Disposing snafu 10298883-4f16-4383-b5b7-ce9e5ad90715 !
Disposing dummy 7233afd9-9f2e-43a4-ae1a-bc0abba6abc7 !

Eager service bean instantiation

To instantiate a service/bean before being used else where add it as an argument in the Configure method that belongs to the Startup class.

CSharp/dotnetcore (last edited 2018-04-27 10:39:58 by localhost)