.NET Core – The Beginning

五迷三道 提交于 2019-11-29 11:20:26

随着Microsoft拥抱开源的口号,.NET Framework也正式登上了其他平台,其中包含了Linux与OSX,与以往的3rd Party Mono不同,新的.NET Core具备官方的支持及完整的Roadmap。

为了登上其他舞台,.NET Core可以说从根源开始重新打造,在早期版本中Linux、OSX上仍是使用Mono Runtime,随着时间的推移,现在的1.1 RTM中Mono的身影已经完全消失了,取而代之的是Native Platform Runtime,这代表着.NET平台新时代的来临,也意味着Microsoft正走在一个Java曾走过的道路,Cross Platform、Write once,Run Anywhere。


第一个程序

  在开始写程序前,你得先安装.NET Core,这不难,照着网页上写的步骤做就可以了。

https://www.microsoft.com/net/core#windowsvs2015

本文使用Visual Studio 2015做为开发工具,当然,你也可以使用跨平台、更简便的Visual Studio Code,同样可以达到目的。

  准备好开发工具后,就可以透过Visual Studio 2015来建立第一个.NET Core应用程序,这里使用Console Application,因为命令行式的应用程序可以让我们以最快速、最简单的步骤直达核心。

按下OK后就会看到熟悉的C#程序,编译后能够立刻执行。

如图所示,你会发现这与传统的.NET Console Application有两个地方不同,第一个是.NET Core透过dotnet.exe来执行程序,如下图所示。

第二个是编译后的是一个DLL文件,而不是传统的EXE档。

这其实有个目的,叫做Binary Sharing,也就是说你可以把这个DLL放到各种平台上执行而不需重新编译,跟以往Java宣称的Write Once、Run Anywhere是同样道理。

在.NET Core中,除了编译后的DLL档之外,还有几个很重要的JSON文件:,.runtimeconfig.json这个文件中描述了这个DLL是使用哪一种Runtime Framework,.NET Core可以使用不同的Runtime Framework,例如.NET 4.5.2、4.6、.NET Core 1.0、.NET Core 1.1等等,deps.json则描述了这个应用程序需要的Librarys,例如EntityFramework等等,这个文件通常用于当只分发主程序而没有分发其他Librarys,例如只复制DLL跟runtime.json到目的地,然后使用dotnet restore来下载其他相依的Librarys,这两个json文件的源头是project.json。

  {    "version": "1.0.0-*",    "buildOptions": {      "emitEntryPoint": true    },      "dependencies": {      "Microsoft.NETCore.App": {        "type": "platform",        "version": "1.1.0"      }    },      "frameworks": {      "netcoreapp1.0": {        "imports": "dnxcore50"      }    }  }

注意,runtime.json文件必须存在,否则这个应用程序无法执行。

Binary Sharing?

  谈到跨平台,Binary Sharing就是一个很重要的议题,通常我们希望编译后的结果可以拿到不同的平台上执行,而不是需要在不同平台上在编译过后才能执行,.NET Core的应用程序具备了Binary Sharing特点,这里我们用Cent OS为例(你必须事先在上面安装好.NET Core)。

https://www.microsoft.com/net/core#linuxcentos

透过SSH或是FTP将编译好的DLL及json文件复制到Cent OS机器上,如你所见,同样的命令,同一个DLL,不须重新编译就可以执行,这就是Binary Sharing。

目前Visual Studio 2015的Template会指定.NET Core 1.0.1版本,所以如果Linux上的是最新的1.1.0版本,你会看到以下的消息。

解法很简单,就是在project.json中指定1.1.0即可。

project.json

  {    "version": "1.0.0-*",    "buildOptions": {      "emitEntryPoint": true    },      "dependencies": {      "Microsoft.NETCore.App": {        "type": "platform",        "version": "1.1.0"      }    },      "frameworks": {      "netcoreapp1.0": {        "imports": "dnxcore50"      }    }  }

自然,Binary Sharing同样适用于Class Library。

Multi Framework Support

  .NET Core可以支持多个Framework,这意思是你可以用.NET Core方式来撰写应用程序,然后在Windows上用.Net Framework 4.5作为Runtime来执行,而不需安装.NET Core,这可以透过修改project.json来完成。

  {    "version": "1.0.0-*",    "buildOptions": {      "emitEntryPoint": true    },    "dependencies": {},      "frameworks": {      "netcoreapp1.0": {        "imports": "dnxcore50",        "dependencies": {          "Microsoft.NETCore.App": {            "type": "platform",            "version": "1.1.0"          }        }      },      "net452": {}    }  }

修改完后重新编译,会发现输出多了一组net452目录。

在里面可以看到熟悉的EXE档。

这时内建的条件式编译可以协助你针对不同Runtime调整行为,例如在完整的.NET Framework中使用Registry来保存设定,在.NET Core使用本地的json档之类的。

  using System;  using System.Collections.Generic;  using System.Linq;  using System.Threading.Tasks;    namespace SimpleConsoleApp1  {      public class Program      {          public static void Main(string[] args)          {  #if NET452              Console.WriteLine("Hello .NET Framework");  #else              Console.WriteLine("Hello .NET Core");  #endif              Console.ReadLine();          }      }  }

以下是使用.NET Framework的情况。

接着是.Net Core的情况。

很有趣是吧?

Self-Contained

  除了使用Binary Sharing技术来分发应用程序之外,你也可以透过dotnet publish命令来打包Self-Contained应用程序,这意思是应用程序将内含.NET Core及相依的Librarys,目的平台不需要事先安装.NET Core,简单的说在Linux上,使用者看到的是可执行文件而不是DLL,要完成这个,必须修改project.json文件。

  {    "version": "1.0.0-*",    "buildOptions": {      "emitEntryPoint": true    },    "dependencies": {},      "frameworks": {      "net452": {},      "netcoreapp1.0": {        "imports": "dnxcore50",        "dependencies": {          "Microsoft.NETCore.App": {            "version": "1.1.0"          }        }      }    },    "runtimes": {      "win7-x64": {},      "centos.7-x64": {}    }  }

要特别注意的是我们移除了netcoreapp1.0中的platform区段,否则无法编译出self-contained的文件,最后下达以下命令即可产生CentOS上的版本。

dotnet publish -c release -r centos.7-x64

最后把整个publish目录的内容复制到CentOS上就可以执行(注意,你必须透过chmod来调整SimpleConsoleApp文件为可可执行文件案)。

Writing on WindowsRunning on LinuxDebug on Windows

  当应用程序需要执行在Windows以外的平台时,使用Docker来调试是最简单的的方式,但有时真实环境并非是Docker,而你又需要针对真实环境调试时,这时就需要费点功夫了。首先必须要修改project.json,让编译器产生portable的pdb资讯。

  {    "version": "1.0.0-*",    "buildOptions": {      "emitEntryPoint": true,      "debugType": "portable"    },    "dependencies": {},      "frameworks": {      "netcoreapp1.0": {        "imports": "dnxcore50",        "dependencies": {          "Microsoft.NETCore.App": {            "version": "1.1.0"          }        }      }    },    "runtimes": {      "win7-x64": {},      "centos.7-x64": {}    }  }

接着设定项目的输出目录为共用。

通常设定存取等级为everyone是最简便的方式,然后到目标机器上安装clsdbg套件。

curl -sSL https://raw.githubusercontent.com/Microsoft/MIEngine/getclrdbg-release/scripts/GetClrDbg.sh | bash /dev/stdin vs2015u2 ~/clrdbg

完成后home的目录结构会变成类似下面这样。

接着要在目标机器上mount shared folder。

最后需要一个.xml文件,用来描述Windows如何透过SSH连结到目标LINUX机器。

Lanuchdebug.xml

      

完成准备后,就可以在Visual Studio 2015的Command Window中下达以操作进入Debug模式。

Debug.MIDebugLaunch /Executable:dotnet /OptionsFile:d:temp1lanuchdebug.xml

顺利的话可以停在设立的中断点。

下次有机会我们再来聊聊.NET Core Hosting,这也很有趣。

原文:大专栏  .NET Core – The Beginning


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!