C# 体系结构

C#

C#(C Sharp)是一种由微软公司开发的通用、面向对象的编程语言,它被设计用来构建.NET平台上的各种应用程序。.NET是一个软件开发框架,它提供了一系列工具和库,使开发人员能够构建各种类型的应用程序,包括桌面应用程序、Web应用程序、移动应用程序和服务等。

C#是.NET框架中最常用的编程语言之一,但并不是唯一的选择。除了C#之外,开发人员还可以使用其他语言,如Visual Basic .NET、F#等,来开发.NET应用程序。不过,由于C#的易学性、强大的功能和广泛的支持,它已经成为了.NET平台上最受欢迎的编程语言之一。

因此,C#与.NET的关系可以理解为C#是.NET框架的主要编程语言之一,而.NET提供了一个框架和平台,让开发人员能够使用各种编程语言来构建应用程序。

.NET

.NET Framework:

  • .NET Framework是微软最早引入的框架,最初设计用于在Windows操作系统上构建和运行应用程序。
  • 它包含了一个CLR(Common Language Runtime)的运行时环境,以及BCL(Base Class Library)等库,提供了一系列用于开发应用程序的功能和工具。
  • .NET Framework主要用于传统的Windows桌面应用程序、ASP.NET Web应用程序和一些企业级应用。

.NET Core:

  • .NET Core是微软在.NET Framework之后推出的另一个框架。
  • 与.NET Framework不同,.NET Core是跨平台的,可以在Windows、Linux和macOS等操作系统上运行。
  • 它也包含了自己的CLR和BCL,并且设计更为轻量和模块化,以适应不同的应用场景。
  • .NET Core主要用于现代Web应用程序、云原生应用、微服务和跨平台开发。

整合到.NET 5及其后续版本:

  • 在.NET 5.0版本之后,微软将.NET Core和.NET Framework整合到了一个新的统一平台中,即.NET 5,目前最新版为.NET 8
  • 这一整合的目的是为了提供更一致的开发体验和更广泛的平台支持。

CLR

CLR(Common Language Runtime)是.NET Framework和.NET Core中的关键组件之一,它提供了一个运行时环境,使得.NET应用程序运行。

组件.NET Framework CLR 与.NET Core CLR略有不同

组件.NET Framework CLR.NET Core CLR
类加载器
即时编译器
代码管理器
垃圾回收器
安全引擎
调试引擎
类型检查器
异常管理器
线程支持
COM Marshaler 否(在.NET Core中没有直接等价的组件)
跨平台支持组件
  • 类加载器(Class Loader):负责将应用程序的汇编(包括MSIL代码和元数据)加载到内存中,为应用程序的执行做准备。
  • 即时编译器(Just-In-Time Compiler,JIT):将MSIL代码翻译成本机执行代码,以便在特定硬件平台上执行。
  • 代码管理器(Code Manager):管理应用程序代码的执行,包括控制流程和执行顺序等。
  • 垃圾回收器(Garbage Collector,GC):负责管理.NET运行时的内存分配和释放,通过自动回收不再使用的对象来防止内存泄漏。
  • 安全引擎(Security Engine):提供基于认证的安全机制,用于管理用户身份验证和授权。
  • 调试引擎(Debugger):用于开发人员调试和跟踪应用程序代码,帮助定位和修复错误。
  • 类型检查器(Type Checker):检查并禁止非安全的类型转换,以及对未初始化的变量进行访问等操作,提高代码的安全性和稳定性。
  • 异常管理器(Exception Manager):提供结构化的异常处理,与Windows结构化异常处理机制(SEH)集成,改进了错误报告和处理。
  • 线程支持(Thread Support):提供多线程编程的类和接口,用于管理和控制应用程序中的多个执行线程。
  • COM Marshaler(COM列集器):处理.NET和COM之间的互操作,包括数据类型转换和接口调用等。
  • .NET基础类库(Base Class Library,BCL):集成了大量用于开发.NET应用程序的类库和API,提供了丰富的功能和工具,简化了开发人员的工作。

CLR工作原理

编译和加载

  • 首先,源代码被编译成托管模块,这些模块是标准的 Windows 可移植执行体(PE32) 文件或 64 位 Windows 可移植执行体(PE32+) 文件(MSIL及元数据)。
  • 这些托管模块需要 CLR 才能执行。

元数据

  • 语言编译器生成元数据,描述代码中的类型、成员和引用。
  • 元数据与代码一起存储在 PE 文件中,每个 PE 文件都包含元数据。
  • 元数据用于查找和加载类、安排实例、解析方法调用、生成本机代码、强制安全性以及设置运行时上下文边界。

生存期管理和垃圾回收

  • CLR 自动处理对象布局和管理对象引用。
  • 托管数据是按照规则进行生存期管理的对象,垃圾回收器负责释放不再使用的对象,避免内存泄漏。

跨语言集成

  • 由于通用类型系统,不同语言编写的对象可以互相通信。
  • 可以定义一个类,然后使用不同的语言从原始类派生出另一个类或调用原始类的方法。

版本控制和部署支持

  • 元数据确保组件或应用程序具有所需的所有内容的指定版本,避免中断。
  • 注册信息和状态数据不再保存在注册表中,简化组件复制和删除任务。

IL

在C#中,IL(Intermediate Language,中间语言)是.NET平台的核心概念。编写的C#代码在编译时被转换为IL代码,也称为MSIL(Microsoft Intermediate Language)或CIL(Common Intermediate Language)。IL是一种与平台无关的中间语言,它在.NET应用程序的运行时被执行。

以下是对C#中间语言的关键概念和原理的简要介绍:

IL的生成和编译:

  • 编写的C#代码通过编译器编译为IL代码。
  • IL代码包含了C#代码的原始逻辑,但是与平台无关。

IL的优势:

  • 平台无关性:IL代码可以在任何支持.NET的平台上运行。
  • 安全性:IL代码在执行之前由托管代码执行引擎(CLR)验证,以确保类型安全和安全性。

IL指令:

  • IL代码由一系列指令组成,这些指令由CLR解释和执行。
  • 每个指令执行特定操作,如加载值到堆栈、执行算术操作、调用方法等。

IL的阅读:

  • 可以使用IL反汇编器(如ILSpy)查看编译后的IL代码。
  • 这有助于理解C#代码如何转换为IL代码,以及更深入地理解.NET运行时的工作原理。

JIT编译:

  • 当.NET应用程序启动时,CLR将IL代码编译为特定平台的本机代码。
  • 这称为即时(Just-In-Time)编译,将IL代码转换为适用于当前系统架构的本机机器代码。

反编译和保护:

  • IL代码可以被反编译为高级语言或其他语言。
  • 为了保护知识产权,可以使用代码混淆技术来混淆IL代码,增加反编译的难度。
posted @ 2024-03-06 15:12  咸鱼翻身?  阅读(103)  评论(0编辑  收藏  举报