【Professional C# 7 and .NET Core 2.0】 第1章 .NET应用程序和工具

1.1  选择技术

1.2 回顾.NET历史

.NET Framework的版本、对应的公共语言运行库(Common Language Runtime,CLR)的版本、C#的版本以及Visual Studio的版本

.NET Framework

CLR

C#

Visual Studio

1.0

1.0

1.0

2002

1.1

1.1

1.2

2003

2.0

2.0

2.0

2005

3.0

2.0

2.0

2005+扩展版

3.5

2.0

3.0

2008

4.0

4.0

4.0

2010

4.5

4.0

5.0

2012

4.5.1

4.0

5.0

2013

4.6

4.0

6

2015

4.7

4.0

7

2017

1.2.1 C# 1.0 —— 一种新语言

C#的创建晚于Java和C++

Intermediate Language
.NET 编程语言的编译器生成中间语言(Intermediate Language,IL)代码。IL 代码看起来像面向对象的机器码,使用工具ildasm.exe 可以打开包含.NET代码的DLL或EXE文件来检查IL 代码。CLR包含一个即时(Just-In-Time,JIT)编译器,当程序开始运行时,JIT编译器会从IL代码中生成本地代码。
IL代码也称为托管代码。

CLR
CLR的其他部分是垃圾收集器(GC)、调试器扩展和线程实用工具。
垃圾收集器负责清理不再引用的托管内存,这个安全机制使用代码访问安全性来验证允许代码做什么。
调试器扩展允许在不同的编程语言之间启动调试会话 (例如,在Visual Basic中启动调试会话,在C#库内继续调试)。
线程实用工具负责在底层平台上创建线程。

1.2.2 带有泛型的C# 2和.NET 2

C# 2和.NET 2 是一个巨大的更新。
一个大的变化是泛型。C#编程语言中的这个改进也导致了Framework中多了许多新类型,例如System.Collections.Generic

1.2.3 .NET 3.0(WPF/WCF/WF)

发布.NET 3.0 时,不需要新版本的C#。3.0版本只提供了新的库,但它发布了大量新的类型和名称空间。Windows Presentation Foundation(WPF)可能是新框架最大的一部分
NET 3.0 推出之前,ASP.NET Web Services和.NET Remoting用于应用程序之间的通信。Message Queuing是用于通信的另一个选择。各种技术有不同的优点和缺点,它们都用不同的API进行编程。典型的企业应用程序必须使用一个以上的通信API,因此必须学习其中的几项技术。WCF(Windows Communication Foundation) 解决了这个问题。
.NET 3.0版本的第三大部分是Windows WF(Workflow Foundation)和名称空间System.Workflow。

1.2.4 C# 3和.NET 3.5——LINQ

.NET 3.5和新版本C# 3一起发布。主要改进是使用C#定义的查询语法,它允许使用相同的语法来过滤和排序对象列表、XML文件和数据库。

Entity Framework
在.NET 3.5 的第一个更新中,发布了Entity Framework的第一个版本。LINQ to SQL和Entity Framework都提供了从层次结构到数据库关系的映射和LINQ提供程序。

System.AddIn
另一种引入为.NET 3.5 一部分的技术是System.AddIn名称空间,它提供了插件模型。

1.2.5 C# 4和.NET 4.0—— dynamic和TPL

dynamic

C# 4的主题是动态集成脚本语言,使其更容易使用COM集成。C#语法扩展为使用dynamic关键字、命名参数和可选参数

TPL
任务并行库(Task Parallel Library,TPL)使用Task类和Parallel类抽象出线程

ASP.NET MVC 2.0
发布Visual Studio 2010时,附带了一项创建Web应用程序的新技术:ASP.NET MVC 2.0。

1.2.6 C# 5和异步编程

async、await

C# 5只有两个新的关键字:async和await,然而,它大大简化了异步方法的编程。在Windows 8中,触摸变得更加重要,不阻塞UI线程也变得更加重要。

Windows运行库
Windows 8还为Windows Store 应用程序(也称为Modern应用程序、Metro应用程序、通用Windows应用程序,最近称为Windows应用程序)引入了一个新的编程接口:Windows运行库。

MEF
System.AddIn框架过于复杂、缓慢,所以用.NET 4.5 创建了一个新的合成框架:Managed Extensibility Framework和名称空间System.Composition。

ASP.NET Web API
独立于平台的通信的新版本是由ASP.NET Web API提供的。WCF提供有状态和无状态的服务,以及许多不同的网络协议,而ASP.NET Web API则简单得多,它是基Representational State Transfer(REST)软件架构风格的。

1.2.7 C# 6和.NET Core 1.0

Silverlight
2007年,发布了Microsoft Silverlight 的第一个版本(代码名为WPF/E,即WPF Everywhere)。Silverlight是一个Web浏览器插
件,支持动态内容。Silverlight的第一个版本只支持通过JavaScript编程。
Silverlight总是在客户端运行
有了几个较小的.NET 版本(如Silverlight、用于Windows Phone的Silverlight),在.NET 的桌面版本和较小版本之间共享代码就很重要。在不同.NET 版本之间共享代码的一项技术是可移植库。随着时间的推移,有了许多不同的.NET Framework 和版本,可移植库的管理已成为一场噩梦。
.NET Core
为了解决所有这些问题,需要.NET 的新版本(是的,的确需要解决这些问题)。Framework的新版本命名为.NET Core。.NET Core较小,是开源的,带有模块化的NuGet包,以及分布给每个应用程序的运行库,不仅可用于Windows的桌面版,也可用于许多不同的Windows设备,以及Linux和OS X。
为了创建Web应用程序,完全重写了ASP.NET,得到了ASP.NET Core 1.0。
因为ASP.NET Web Forms不是专为最佳性能而设计的,它基于Windows Forms应用程序开发人员熟悉的模式来提高对开发人员的友好性。

1.2.8 C# 7和.NET Core 2.0

C# 7引入了许多新特性。这些特性中最重要的部分来自函数式编程:模式匹配和元组。
.NET Core 2.0的重点是更容易将使用.NET Framework 编写的现有应用程序引入.NET Core。
要检查应用程序是否可以轻松地移植到.NET Core 中,可以使用.NET Portability Analyzer (.NET可移植性分析器)。

1.3 .NET 术语


什么是当前的.NET 技术?图1-3给出了.NET Framework、.NET Core 和Mono相互关联的总体情况。
Xamarin提供了 Xamarin.IoS和Xamarin.Android库,它们可以为iPhone 和Android开发C#应用程序。
Xamarin目前仍然基于Mono框架,Mono框架是由Xamarin开发的.NET 变体。
RyuJIT(这是一个新的JIT编译器,可以将IL代码编译为本地代码)

1.3.1 .NET Framework

1.3.2 .NET Core

运行库是CoreCLR库
http://www.github.com/dotnet
.NET Framework要求必须在系统上安装应用程序需要的特定版本,而在.NET Core 1.0中,框架(包括运行库)是与应用程序一起交付的。
现在可以同时提交应用程序和运行库,而不依赖服务器上安装的版本。
.NET Core以模块化的方式设计。该框架分成数量很多的NuGet包。

1.3.3 .NET Standard

.NET Standard的平台支持表

https://docs.microsoft.com/en-us/dotnet/standard/net-standard

  • .NET Core 1.1支持.NET Standard 1.6,.NET Core 2.0支持.NET Standard 2.0
  • .NET Framework 4.6.1支持.NET Standard 2.0。
  • UWP构建了16299,后来支持.NET Standard 2.0;旧版本只支持.NET Standard 1.4。
  • 通过Xamarin使用.NET Standard 2.0,需要Xamarin.iOS 10.14 和Xamarin.Android 8.0。

1.3.4 NuGet包

在早期,程序集是应用程序的可重用单元。添加对程序集的一个引用,以使用自己代码中的公共类型和方法,此时,仍可以这样使用(一些程序集必须这样使用)。然而,使用库可能不仅意味着添加一个引用并使用它。使用库也意味着一些配置更改,或者可以通过脚本来利用一些特性。这是在NuGet包中打包程序集的一个原因。
NuGet包是一个zip文件,其中包含程序集(或多个程序集)、配置信息和PowerShell脚本。
NuGet包很容易在NuGet服务器http://www.nuget.org上获得。

1.3.5 名称空间

可用于.NET 的类组织在名称以System开头的名称空间中。

       

System.Collections

这是集合的根名称空间。子名称空间也包含集合,如System.Collections.Concurrent System.Collections. Generic

System.Data

这是访问数据库的名称空间。System.Data.SqlClient包含访问SQL Server 的类

System.Diagnostics

这是诊断信息的根名称空间,如事件记录和跟踪(System.Diagnostics.Tracing名称空间中)

System.Globalization

该名称空间包含的类用于全球化和本地化应用程序

System.IO

这是文件IO的名称空间,其中的类访问文件和目录,包括读取器、写入器和流

System.Net

这是核心网络的名称空间,比如访问DNS服务器,用System.Net.Sockets创建套接字

System.Threading

这是线程和任务的根名称空间。任务在System.Threading.Tasks中定义

1.3.6 CLR(Common Language Runtime,公共语言运行库)

  1. 将源代码编译为Microsoft中间语言(Intermediate Language,IL)。
  2.  CLR把IL编译为平台专用的本地代码。新的CLR和CoreCLR包括一个新的JIT编译器RyuJIT。新的JIT编译器不仅比以前的版本快,还在用Visual Studio调试时更好地支持Edit & Continue特性。
  3. 调试器, Edit & Continue特性允许在调试时编辑代码,可以继续调试会话,而不需要停止并重新启动过程。
  4. CLR还包括一个带有类型加载器的类型系统,类型加载器负责从程序集中加载类型。类型系统中的安全基础设施验证是否允许使用某些类型系统结构,如继承。
  5. 创建类型的实例后,实例还需要销毁,内存也需要回收。CLR的另一个功能是垃圾收集器。垃圾收集器从托管堆中清除不再引用的内存。
  6. CLR还负责线程的处理。在C#中创建托管的线程不一定来自底层操作系统。线程的虚拟化和管理由CLR负责。

1.3.7 Windows 运行库

从Windows 8开始,Windows操作系统提供了另一种框架:Windows 运行库(Windows Runtime)。这个运行库由WUP(Windows Universal Platform,Windows通用平台)使用
Windows运行库提供了一个对象层次结构,它在以Windows开头的名称空间中组织。

1.4 用.NET Core CLI编译

.NET Core 命令行接口(Command Line Interface,CLI)

1.4.1 设置环境

安装了Visual Studio 2017和最新的更新包后,就可以立即启动CLI工具。
可以在没有Visual Studio 2017的情况下, 下载环境的应用程序,只需要访问https://dot.net并单击Get Started按钮。从这里,可以下载Windows、Linux和macOS的.NET SDK。
安装.NET Core CLI 工具,要把dotnet工具作为入口点来启动所有这些工具。只需要启动:

> dotnet --help 

dotnet工具的所有不同选项都可用。许多选项都有简化符号。要获得帮助,可以输入:

> dotnet –h 

1.4.2 创建应用程序

dotnet工具提供了一种简单的方法创建“Hello World!”应用程序。输入如下命令:

> dotnet new console --output HelloWorld 

要查看应用程序使用的库的依赖项和版本列表,可以检查obj子目录中的文件project.assets. json。

using System; 
 
namespace HelloWorld 
{ 
  class Program 
  { 
    static void Main(string[] args) 
    { 
      Console.WriteLine("Hello World!"); 
    } 
  } 
}

对于项目文件,OutputType定义了输出的类型。对于控制台应用程序,该类型是Exe。TargetFramework指定了用于构建应用程序的框架和版本。

 <Project Sdk="Microsoft.NET.Sdk"> 
  <PropertyGroup> 
    <OutputType>Exe</OutputType> 
    <TargetFrameworks>netcoreapp2.0;net47</TargetFrameworks> 
  </PropertyGroup> 
</Project> 

Sdk属性指定项目使用的SDK。微软有两个主要的SDK:Microsoft.NET.Sdk 用于控制台应用程序,Microsoft.NET.Sdk.Web用于ASP.NET Core web 应用程序。
不需要向项目添加源文件。在编译时,会自动添加同一目录和子目录下扩展名为cs的文件。扩展名为resx的资源文件是自动添加的,用于嵌入资源。

1.4.3 构建应用程序

要构建应用程序,需要将当前目录更改为应用程序的目录,并启动dotnet build。(编译)
命令dotnet new和dotnet build现在包括恢复NuGet包。使用dotnet restore还可以显式地恢复NuGet包。
要构建发布代码,就需要指定选项--configuration Release (简写为-c Release):

> dotnet build --configuration Release 

要启用新版本的C#,需要在项目文件中指定这一点

<PropertyGroup> 
  <LangVersion>latest</LangVersion> 
</PropertyGroup> 

1.4.4 运行应用程序

要运行应用程序,可以使用dotnet run命令。

> dotnet run

如果项目文件面向多个框架,就需要通过--framework选项告诉dotnet run命令,使用哪个框架来运行应用程序。这个框架必须通过csproj文件来配置。

在生产系统中,不使用dotnet run运行应用程序,而可以使用dotnet和库的名称:

> dotnet bin/debug/netcoreapp2.0/HelloWorld.dll

1.4.5 创建Web应用程序 

启动dotnet new时,可以看到可用的模板列表


使用.NET Core CLI创建Web应用程序

> dotnet new mvc -o WebApp

1.4.6 发布应用程序

使用之前创建的控制台应用程序,只需要以下命令来创建发布所需的文件。

> dotnet publish -f netcoreapp2.0 -c Release

使用-f选择框架,使用-c选择版本配置。

发布所需的文件放在bin/Release/netcoreapp2.0/publish目录中。
在目标系统上使用这些文件进行发布,也需要运行库。
https://www.microsoft.com/net/download/上可以找到运行库的下载和安装说明。
自包含部署
应用程序不需要在目标系统上安装运行库,而是可以用它交付运行库。这就是所谓的自包含部署。
平台不同,运行库就不同。因此,对于自包含部署,需要通过在项目文件中指定RuntimeIdentifiers,来指定支持的平台

<Project Sdk="Microsoft.NET.Sdk"> 
  <PropertyGroup> 
    <OutputType>Exe</OutputType> 
    <TargetFramework>netcoreapp2.0</TargetFramework> 
  </PropertyGroup> 
  <PropertyGroup> 
    <RuntimeIdentifiers> 
      win10-x64;ubuntu-x64;osx.10.11-x64; 
    </RuntimeIdentifiers> 
  </PropertyGroup> 
</Project> 

.NET Core Runtime Identifier(RID)

不同平台和版本的所有运行库标识符 https://docs.microsoft.com/en-us/dotnet/core/rid-catalog
可以为所有不同的平台创建发布文件:

> dotnet publish -c Release -r win10-x64 
> dotnet publish -c Release -r osx.10.11-x64 
> dotnet publish -c Release -r ubuntu-x64

1.5 使用Visual Studio 2017

1. 安装Visual Studio 2017

Visual Studio 2017提供了一个新的安装程序,它可以更容易安装需要的产品。
使用安装程序,可以选择开发应用程序所需的工作负载

  • UWP开发
  • .NET Desktop开发
  • ASP.NET和Web开发
  • Azure开发
  • 移动开发与.NET
  • .NET Core跨平台开发

2. 创建一个项目
3. 使用Solution Explorer
4. 配置项目属性
5. 了解编辑器
Visual Studio编辑器非常强大。它提供了智能感知功能,该功能可以在按下Tab键时,调用方法和属性,并完成输入。
只要在编辑器中输入cw,再按Tab键,编辑器就会创建Console.WriteLine();。Visual Studio附带了许多代码片段,选择Tools | Code Snippets Manager
6. 构建项目
Output窗口(参见图1-14)比Error List 窗口更可靠。有时,Error List 窗口包含了较老的缓存信息,或者当列表较大时,查找错误并不容易。
7. 运行应用程序
8. 调试

1.6 应用程序类型和技术

1.6.1 数据访问

Database First 和 Model First已被删除,因为Code First是更好的选择。

1.6.2 Windows应用程序

对于创建Windows应用程序,选择的技术应该是UWP(通用Windows平台)。
通过UWP开发应用程序。与WPF相比,UWP提供了更现代的XAML来创建用户界面。

1.6.3 Xamarin

Xamarin提供了可以在Android上创建应用程序的API,以及使用熟悉的C#代码在iPhone上创建应用程序的库。

1.6.4 Web应用程序

ASP.NET Core MVC基于著名的MVC(模型-视图-控制器)模式,更容易进行单元测试。它还允许把编写用户界面代码与HTML、CSS、JavaScript清晰地分离,它只在后台使用C#。

1.6.5 Web API

过去,SOAP和WCF完成了任务,就不再需要它们了。现代应用程序利用REST (Representational State Transfer)和Web API。
客户端可以接收JSON或XML数据。JSON和XML也可以格式化来使用Open Data(OData)规范。
创建Web API是构建微服务的好方法。
为了描述服务,定义了一个新的标准:OpenAPI (https://www.openapis.org)。这个标准植根于Swagger (https://swagger.io/)。

1.6.6 WebHooks和SignalR

SignalR使用WebSocket技术推送信息。
WebHooks可以集成公共服务,这些服务可以调用公共ASP.NET Core 创建的Web API服务。

1.6.7 Microsoft Azure

Microsoft Azure提供了软件即服务(Software as a Service,SaaS)、基础设施即服务(Infrastructure as a Service,
IaaS)、平台即服务(Platform as a Service,PaaS) 和函数即服务(Functions as a Service,FaaS)。
1. SaaS
SaaS提供了完整的软件,不需要处理服务器的管理和更新等。
2. IaaS
这个服务产品提供了虚拟机。用户负责管理操作系统,维护更新。
3. PaaS
对于开发人员来说,Microsoft Azure最相关的部分是PaaS。可以为存储和读取数据而访问服务,使用应用程序服务的计算和联网功能,在应用程序中集成开发者服务。
应用程序服务可以用于驻留通过ASP.NET Core创建的Web应用程序和API应用程序。
4. FaaS
FaaS是云服务的一个新概念,也称为无服务器计算技术。当然,幕后总是有一个服务器。不需要为保留的CPU和内存付费,就像在Web应用程序中使用的应用程序服务一样。相反,支付的金额是基于消费的,即对活动所需要的内存的调用次数和时间付费,且有一些限制。

1.7 开发工具

1.7.1 Visual Studio Community
1.7.2 Visual Studio Professional
1.7.3 Visual Studio Enterprise
1.7.4 Visual Studio for Mac
1.7.5 Visual Studio Code
Visual Studio Code是一个代码编辑器,几乎不支持项目管理。然而,Visual Studio Code不仅在Windows上运行,也在Linux和OS X上运行。
可以从http://code.visualstudio.com下载Visual Studio Code。

posted @ 2020-02-02 21:36  FH1004322  阅读(365)  评论(0)    收藏  举报