.NET Core – The Beginning
作者:互联网
随着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
|
自然,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 Windows、Running on Linux、Debug 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
<?xml version="1.0" encoding="utf-8" ?>
完成准备后,就可以在Visual Studio 2015的Command Window中下达以操作进入Debug模式。
Debug.MIDebugLaunch /Executable:dotnet /OptionsFile:d:temp1lanuchdebug.xml
顺利的话可以停在设立的中断点。
下次有机会我们再来聊聊.NET Core Hosting,这也很有趣。
原文:大专栏 .NET Core – The Beginning
标签:Core,1.1,Framework,json,version,NET,Beginning 来源: https://www.cnblogs.com/chinatrump/p/11516246.html