65.9K
CodeProject 正在变化。 阅读更多。
Home

.Net Framework

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.37/5 (22投票s)

2007年10月1日

11分钟阅读

viewsIcon

80563

downloadIcon

547

.Net 基础知识

.Net Framework:-

引言

.Net Framework 是进入 .Net 世界的第一步。框架可以定义为构建块。同样,.Net Framework 可以定义为任何 .Net 应用程序的构建块。.Net 框架包含一组程序集(在 .Net 中,我们将所有 DLL 称为程序集),以支持不同类型的 .Net 应用程序(可能是基于 Windows、基于 Web 和其他应用程序)。根据我们希望开发的应用程序类型,我们可以使用 .Net Framework 中提供的相应程序集。.Net Framework 还包含一些程序集来执行 .Net 应用程序。因此,.Net Framework 是程序集的集合,以支持 .Net 应用程序开发和 .Net 应用程序执行。

单词 .Net:-

我们知道 .Net Framework 是程序集的集合。现在让我们了解 .Net 这个词是什么意思?微软没有给出“.”Net”这个词的原因,但你可以在网上看到一些定义,说它是“所有技术的网络”、“下一代技术”等等。

为什么需要 .Net?

世界上有这么多技术。现在为什么我们还需要一项名为 .Net 的技术?为什么我应该选择 .Net?这个问题的答案可以是

1. 自动内存管理

2. Web 服务

3. 轻松部署

4. 互操作性

5. .Net 语言独立

让我们简要地看看每一个,

自动内存管理:-

当前 VC++ 程序员面临的最昂贵的问题将是“内存泄漏”。明确地说,我们在程序中使用的每个 new 操作符都应该与一个 delete 操作符匹配。即,如果我使用 new 关键字为对象分配内存,那么它应该使用 delete 操作符进行释放。如果我们忘记应用 delete 操作符,那么使用 new 操作符分配的内存就不能用于其他目的。这称为内存泄漏。在 .net 中,没有内存泄漏这个词的空间,因为我们不必对任何对象使用 delete 操作符。我们可以使用 new 关键字,然后忘记 delete。.Net 会在特定对象不再使用或引用时自动删除该对象。

Web 服务:-

Web 服务是在网络上两个实体/进程之间进行通信的标准化方式。它使用 XML(可扩展标记语言)、WSDL(Web 服务描述语言)、SOAP(简单对象访问协议)和 UDDI(通用描述、发现和集成)。我们可以将这些 Web 服务视为类似于 Windows 服务,但这些 Web 服务也可以从网络上的任何地方访问。.Net 对 Web 服务的支持比其他技术更全面。

轻松部署:-

对于 .Net 应用程序,部署只是复制和粘贴。因为所有 .Net 程序集都是“自描述”的。我们不需要依赖任何头文件或注册表(如 COM 组件)或其他。只需复制文件并将其粘贴到不同的机器上即可完成部署。(但是,任何共享程序集都应该安装到一个名为“assembly”的特殊文件夹中)。

互操作性:-

互操作性可以定义为硬件/软件在不同/相同机器上的两个应用程序之间共享数据的能力。假设我们有两个应用程序,一个是用 VC++ 开发的,另一个是用 VB 开发的。由于一种语言中使用的数据类型不能被另一个应用程序理解,因此不可能在应用程序之间共享数据(没有特殊的机制)。

如今运行的大多数应用程序都是使用 C、C++、COM 等开发的。转向 .Net 技术,不可能重新创建迄今为止用其他技术开发的所有应用程序。为此,.Net 为 .Net 应用程序提供了与其他应用程序交互的全面支持,反之亦然。任何 COM 组件或 Win32 应用程序都可以轻松地与 .Net 应用程序通信。

.Net 语言独立:-

假设您正在使用 VC++ 创建一个 DLL。现在,如果您想在 VB 应用程序中使用此 DLL 怎么办?我们不能在 VB 中使用该 DLL,即不支持跨语言互操作性。但在 .Net 语言中,您可以使用 C#.Net 创建一个 DLL,并在 VB.Net 应用程序中使用该 DLL。同样,您可以使用任何 .Net 语言进行交叉。请注意,只能交叉 .Net 语言。VC++.Net 和 VC++ 不同(我们稍后会看到区别)。

什么是 .Net?

那么 .Net 是什么?它不是一种语言。它不是一个操作系统。它是一个执行 .Net 应用程序的平台。

.Net 架构:-

我们看到 .Net 是执行 .Net 应用程序的平台。现在让我们看看 .Net 的架构。

Screenshot - Architect.jpg

上图总结了架构;让我们从底部查看每个项目,

处理器:不言而喻,所有应用程序都应该在处理器中运行。

操作系统:同样,所有应用程序只能通过操作系统获得处理器时间。

公共语言运行时:通常称为 CLR,它是 .Net 架构新增的一个层。这个新层将 .Net 应用程序与其他应用程序区分开来。普通的 Windows 应用程序直接在操作系统下运行,但任何 .Net 应用程序都不能直接在操作系统下运行,所有 .Net 应用程序都需要 CLR 才能执行。

.Net Framework 程序集:这些是我们的应用程序可以使用的程序集集合。.Net 提供了许多内置类和方法,我们的应用程序可以使用它们。这些类和方法打包在不同的程序集中。所有这些程序集统称为 .Net Framework 程序集。

ASP.Net、WinForms、WebServics、其他:这些是我们通常开发的应用程序类型。ASP.Net 指的是基于 Web 的应用程序,Winforms 指的是基于 Windows 的应用程序,WebServices 如前所述。我们还可以根据需求开发其他类型的应用程序。每种应用程序都使用相应的 .Net Framework 程序集。并非所有应用程序都使用所有程序集。每个应用程序都使用 .Net Framework 中相关或对应的程序集。

.Net 语言:这些是我们用来开发应用程序的编程语言。我们可以根据自己的舒适度选择任何语言。所有语言都可以完全访问 .Net 框架。(但是,某些 .Net 功能是专门为 C# 设计的)。

.Net 应用程序执行步骤:-

我们看到 .Net 架构包含一个名为 CLR 的新层,没有这个层,任何 .Net 应用程序都无法执行。现在让我们看看程序执行中涉及的步骤。

Screenshot - compilation.jpg

在开始 .Net 应用程序执行之前,让我们回顾一下普通 C 程序是如何工作的。

我们用纯 ASCII 码编写 C 代码,C 编译器将 ASCII 码转换为二进制码(.exe),这个二进制码将由操作系统执行。

但在 .Net 中,编译器不会从 ASCII 码生成二进制码,相反,编译器只会从 ASCII 码生成 MSIL(MicroSoft Intermediate Language)。然后,MSIL 将由 CLR 根据目标操作系统转换为二进制或本地代码。这就是为什么我们需要 CLR 来执行任何 .Net 应用程序,因为处理器无法理解 MSIL 代码,它们只理解二进制代码。

为什么?为什么我们想先将 ASCII 转换为 MSIL,然后再转换为 Native?我们有什么优势?

我们之所以选择 MSIL 步骤,是因为我们通过 MSIL 获得了 .Net 的大部分好处,例如资源管理、对象生命周期管理、反射、类型安全、一些调试支持等。为了获得这些好处,我们选择 MSIL 步骤。这些好处让开发人员的生活变得非常轻松。最后,我们这些开发人员通过 MSIL 获得了回报。

.Net 是否平台无关?

在回答这个问题之前,让我们回顾一下什么是平台独立性。它可以定义为“在一个平台上编译代码并在任何平台上运行”。明确地说,编译器不应该生成任何平台特定的代码作为编译器输出。

Java 如何实现平台独立?Java 编译器生成字节码作为编译器输出。这种字节码是平台独立的。Java 有适用于不同平台的 JVM,字节码可以在任何 JVM(即任何平台)上运行。因此,生成的字节码是平台独立的。

回到 .Net,正如我们所看到的,我们的 .Net 编译器生成 MSIL 代码,而此 MSIL 将在 CLR 上运行。此 MSIL 与平台无关,即如果该平台有 CLR,它可以在任何平台上运行。但 Microsoft 尚未提供除 Windows 平台以外的 CLR。因此,.Net 技术是平台独立的,但我们没有来自 Microsoft 的其他平台的 CLR。

识别 .Net 应用程序:-

我们看到运行任何 .Net 应用程序都需要 CLR。假设您有两个 EXE。一个是 .Net exe,另一个是普通的 Windows 应用程序 exe。两者都位于您的 C 盘中。当您双击一个 exe 时,操作系统 (Windows) 将处理单击事件并在处理器中运行 exe。但对于 .Net exe,必须加载 CLR 才能执行 .Net 应用程序。那么操作系统如何知道在 .Net 应用程序中加载 CLR 呢?为了回答这个问题,让我们了解 .Net 程序集/exe 的各个部分。

任何 .Net 程序集/exe 都具有以下四个部分。

Screenshot - HeaderInfo.jpg

PE Header 是操作系统使用的普通 COFF 头。当我们双击任何可执行文件时,此部分中的指令将由操作系统执行。在我们的例子中,对于 .Net 应用程序,此部分将把操作系统重定向到 CLR 头部分。

CLR Header,这是一个我们只在 .Net 程序集中才有的不同部分。此部分包含加载 CLR 的一些指令。当我们要执行 .Net 应用程序时,此头部分的这部分负责加载 CLR(如果尚未加载)。到目前为止,控制权在操作系统手中,CLR 加载后,CLR 将从操作系统接管应用程序的控制权,CLR 将执行 .Net 应用程序。现在 CLR 将从 MSIL 部分中可用的 Main 方法执行应用程序。

元数据,最初我们看到所有 .Net 程序集都是“自描述”的。此元数据部分负责自描述。此部分将包含有关程序集的所有信息,例如命名空间列表、它拥有的类以及每个类中的方法、参数等。

MSIL,程序集中所有方法、类等的实现都将以 MSIL 格式在此部分中。正如我们所看到的,这不是二进制格式。MSIL 就像另一种汇编语言。

语言重要吗?

我们有 VB.Net、C#、VC++.Net、J# 等语言。为应用程序选择一种语言是否会影响框架的性能或可用性?答案是否定的。所有编译器都生成 MSIL 代码。微软提供了这么多语言来支持不同的语法。如果您熟悉 VB 语法,那么您可以选择 VB.Net 语言;如果您熟悉 VC++ 语法,您可以选择 VC++ 语言。选择一种语言不会影响 .Net 框架的使用。所有框架库都适用于所有语言。而且由于所有编译器都生成 MSIL,因此它对运行时也没有任何影响。如果您不熟悉任何语法,最好使用 C#,因为它具有更多功能。

CLS/CTS:-

正如我们所看到的,我们有许多 .Net 语言,但所有语言都输出 MSIL。这个 MSIL 是通用的。因此,目标类型由所有语言共享。这些目标类型是在 MSIL 中定义的类型。所有语言都必须遵守一些生成 MSIL 的规则,如语法和类型。任何 .Net 语言都应遵循的规则称为 CLS 或公共语言规范。 MSIL 中还有一组类型,作为最低要求,任何语言都应支持。这组类型称为 CTS 或通用类型系统。CTS 之外还有一些类型,但这些类型是可选的,可能受某种语言支持。每种语言都有自己的边界,如下图所示。

Screenshot - CLS.jpg

在上面的图中,我们可以看到所有语言都至少支持 CTS 和一些额外的类型。该图还显示所有语言都遵守 CLS 中定义的规则。我们通过此 CTS 实现互操作性。由于所有 .Net 语言都应支持 CTS,因此可以保证此 CTS 中的类型是完全可互操作的。

话虽如此,关于 CTS/CLS,也可以编写自己的 .Net 语言,它将具有自己的语法。但在开发编译器时,您应该记住,您支持所有 CTS 类型并遵守 CLS 中指定的规则。

© . All rights reserved.