Visual Studio、.NET、.NET Framework、Visual Studio Code辨析

薛鹏飞
2023-12-01

Visual Studio、.NET、.NET Framework、Visual Studio Code辨析

微软推出的软件开发常见或易混淆的技术或工具,涉及的一些术语的简要辨析。

 

Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。1997年,微软发布了 Visual Studio 97。包含有面向 Windows 开发使用的Visual Basic 5.0、Visual C++ 5.0,面向Java开发的Visual J++和面向数据库开发的 Visual FoxPro。1998 年,微软发布了 Visual Studio 6.0,所有开发语言的开发环境版本均升至 6.0。之后,微软开始推广 .NET战略,2002 年,随着 .NET的大力推广,微软发布了 Visual Studio.NET,成为基于 NET Framework之上集成开发环境,从中剥离了 Visual FoxPro ,此同时,引入了建立在 .NET Framework上的托管代码机制以及一门新的语言C#(读作 C Sharp),Visual Basic、Visual C++ 都发生了变化,被扩展为支持托管代码机制的开发环境。至2019年4月2日,微软发布Visual Studio2019。Visual Studio是目前最流行的Windows平台应用程序的集成开发环境。

 

 .NET 是一个通用开发平台标准。 它具有几项关键功能,例如支持多种编程语言、异步和并发编程模型以及本机互操作性,可以支持跨多个平台的各种方案。 .NET 实现包括 .NET Framework、.NET Core 和 Mono。 .NET 的所有实现都遵守一个名为 .NET Standard 的通用 API 规范。

 

.NET Core 是开放源代码通用开发平台,跨平台,支持 Windows、macOS 和 Linux,并且可用于生成设备、云和 IoT 应用程序。

 

Mono是一个由Xamarin公司所主持的自由开放源代码项目。跨平台,不仅可以运行于Windows系统上,还可以运行于Linux、macOS上。

 

.NET Framework 是用于为 Web、Windows、Windows Server 和 Microsoft Azure 构建应用的开发平台,是为运行应用程序提供各种服务的托管(managed)执行环境。 它包含公共语言运行时 (CLR) 和 .NET Framework 类库,其中包括各种功能和对许多行业标准的支持。.NET Framework 提供许多服务,包括内存管理、类型和内存安全、安全性、网络和应用程序部署。 它提供易于使用的数据结构和 API,将较低级别的 Windows 操作系统抽象化。 可在 .NET Framework 中使用不同编程语言,如 C#、F# 和 Visual Basic。

 

IL/MSIL:( Microsoft Intermediate Language:微软中间语言)(IL是MSIL的缩写,中间语言)

CLR:(Common Language Runtime:公共语言运行时或通用语言运行库) ,CLR是.NET Framework的核心, CLR的核心是CTS和CLS。任何编程语言,如果想要在.NET CLR上执行,就必需提供一个编译器, 将此语言的程序编译成.NET CLR所认识的metadata以及IL,符合CTS的规定。
CIL:(Common Intermediate Language:公共中间语言或通用中间语言)
CTS:(Common Type System:通用类型系统)
CLS:(Common Language Specification:公共语言规范)
CLI:(Common Language Infrastructure: 公共语言基础架构)CLI是一个开放的技术规范。它是由微软联合惠普以及英特尔于2000年向ECMA倡议的。通用语言基础架构定义了构成.NET Framework基础结构的可执行码以及代码的运行时环境的规范,它定义了一个语言无关的跨体系结构的运行环境,这使得开发者可以用规范内定义的各种高级语言来开发软件,并且无需修正即可将软件运行在不同的计算机体系结构上。

BCL:(Base Class Library:基类库),BCL是FCL的核心,它是多种编程语言公共的基础编程框架。

FCL:(Framework Class Library:框架类库),FCL大部分实现都引用了BCL ,FCL是一个更大粒度的编程框架,它包含: ASP.NET, WinForms, XML栈, ADO.NET等

 

顺便一提,微软基础类库(Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的难度和工作量。MFC已经基本上不再更新了。

 

SDK(Software Development Kit,软件开发工具包)是为特定软件包、框架、硬件平台、操作系统等建立引用软件的开发工具的集合。SDK相当于很多API接口和其他支持文件的集合体。它是一个软件工具包,一些功能性的SDK已经被当作一个产品来运营。

API (Application Programming Interface、应用程序编程接口),是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。


Windows 的三大模块就是以DLL( Dynamic Link Librar、动态链接库)的形式提供的(Kernel32.dll,User32.dll,GDI32.dll),里面就含有了 API函数的执行代码。为了使用 DLL 中的 API 函数, 必须要有 API 函数的声明(.H)和其导入库(.LIB),导入库可以先这样理解:导入库是为了在 DLL 中找到 API 的入口点而使用的。 
人们常把仅使用 API 来编写应用程序的开发方式叫做“SDK编程”。为减少应用程序开发人员的难度和工作量,一种方法是API进行了封装处理,以编程框架和类库的形式出现,比如MFC 。 

 

Visual Studio Code是一个轻量级但功能强大的源代码编辑器,运行在桌面上,可用于Windows、MacOS和Linux。它带有对JavaScript、TypeScript和Node.js的内置支持,并为其他语言(如C++、Cype、Java、Python、PHP、GO)和运行时(如.NET和Unity)提供了丰富的扩展生态系统。

 

托管代码(managed code)和非托管代码(unmanaged code)

简单说,托管代码在公共语言运行库(CLR)中运行;非托管代码是运行在公共语言运行库环境(CLR)的外部,由操作系统直接执行的代码。

托管代码(managed code)就是Visual Basic .NET和C#编译器编译出来的代码。编译器把代码编译成中间语言(IL、Intermediate Language),而不是能直接在你的电脑上运行的机器码。中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据。你可以拷贝这个程序集到另一台服务器上部署它。通常来说,这个拷贝的动作就是部署流程中唯一的一个操作。
托管代码在公共语言运行库(CLR、Common Language Runtime)中运行。这个运行库给你的运行代码提供各种各样的服务,通常来说,他会加载和验证程序集,以此来保证中间语言的正确性。当某些方法被调用的时候,运行库把具体的方法编译成适合本地计算机运行的机器码,然后会把编译好的机器码缓存起来,以备下次调用(这就是即时编译)。随着程序集的运行,运行库会持续地提供各种服务,例如安全,内存管理,线程管理等等。这个程序被“托管”在运行库中。Visual Basic .NET和C#只能产生托管代码。如果你用这类语言写程序,那么所产生的代码就是托管代码。如果你愿意,Visual C++ .NET可以生成托管代码。当你创建一个项目的时候,选择名字是以.Managed开头的项目类型。例如.Managed C++ application。

非托管代码(unmanaged code)就是在Visual Studio .NET 2002发布之前所创建的代码,例如Visual Basic 6, Visual C++ 6。 最糟糕的是,连那些依然残存在你的硬盘中、陈旧C编译器所产生的代码都是非托管代码。非托管代码直接编译成目标计算机的机器码,这些代码只能运行在编译出它们的计算机上,或者是其它相同处理器或者几乎一样处理器的计算机上。非托管代码不能享受一些运行库所提供的服务,例如安全和内存管理等。如果非托管代码需要进行内存管理等服务,就必须显式地调用操作系统的接口,通常来说,它们会调用Windows SDK所提供的API来实现。就最近的情况来看,非托管程序会通过COM接口来获取操作系统服务。跟Visual Studio平台的其他编程语言不一样,Visual C++可以创建非托管程序。当你创建一个项目,并且选择名字以MFC,ATL或者Win32开头的项目类型,那么这个项目所产生的就是非托管程序。
总而言之,非托管代码是运行在公共语言运行库环境(CLR)的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。

对于Visual Basic和C#来说,因为你没有其它选择。当你在那些语言里面声明一个类,那么这个类的实例会在托管堆中被创建,垃圾收集器(GC)会帮我们管理这些对象的回收。但是在Visual C++中,你有另一个选择。即使你正创建一个托管程序,你可以决定哪些类是托管类型,哪些类是非托管类型的。
C++/CLI(Common Language Infrastructure、通用语言基础架构)是.net下的规范,编译器先编译为MSIL(Microsoft Intermediate Language 、微软中间语言),也就是所谓的托管代码了。C++/CLI可以被Visual C++2005和更高版本的编译器支持。

 

参考阅读:

https://www.cnblogs.com/lbzs/p/11140451.html

https://stackoverflow.com/questions/807880/bcl-base-class-library-vs-fcl-framework-class-library

 类似资料: