其他分享
首页 > 其他分享> > .NET Core – The Beginning

.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

{
  "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

<?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