C# 和 .NET 框架的关系

C#(读作“See Sharp”)是一种新式编程语言,不仅面向对象,还类型安全。 C# 源于 C 语言系列,C、C++、Java 和 JavaScript 程序员很快就可以上手使用。

一、在 .NET 之前

C# 编程语言是为了在微软公司的 .NET 框架(.NET Framework)上开发程序而设计的。本文将简要介绍 .NET 从何而来,以及它的基本架构。

20 世纪 90 年代末,使用微软平台的 Windows 编程分化成许多分支。大多数程序员使用 Visual Basic(VB)、C 或 C++。一些 C 和 C++ 程序员在使用纯 Win32 API,但大多数人在使用 MFC(Microsoft Foundation Class,微软基础类库)。其他人已经转向了COM(Component Object Model,组件对象模型)。

所有这些技术都有自己的问题。纯 Win32 API 不是面向对象的,而且使用它的工作量比使用 MFC 的更大。MFC 是面向对象的,但是它不一致,并逐渐变得陈旧。COM 虽然概念简单,但它的实际代码复杂,并且需要很多丑陋的、不优雅的底层基础代码。

所有这些编程技术还有一个缺点是它们主要针对桌面程序而不是互联网进行开发。那时 Web 编程还是以后的事情,而且看起来和桌面编程非常不同。

我们真正需要的是一个集成的、面向对象的开发框架,它可以把一致和优雅带回编程。为满足这个需求,微软打算开发一个代码执行环境和一个可以实现这些目标的代码开发环境。这些目标列在下表中:

  • 执行环境的目标
    • 安全
    • 多平台
    • 性能
  • 开发环境的目标
    • 面向对象的开发环境
    • 一致的编程体验
    • 使用行业标准进行通信
    • 简化部署
    • 语言独立
    • 互操作性

二、.NET 时代

2002 年,微软发布了 .NET 框架的第一个版本,声称其解决了原有问题并实现了下一代系统的目标。.NET 框架是一种比 MFC 和 COM 编程技术更一致并面向对象的环境。它的特点包
括以下几点:

  • 多平台 该系统可以在各种计算机上运行,从服务器、桌面机到 PDA,还能在移动电话上运行。
  • 行业标准 该系统使用行业标准的通信协议,比如 XML、HTTP、SOAP、JSON 和 WSDL。
  • 安全性 该系统能提供更加安全的执行环境,即使有来源可疑的代码存在。

2.1 .NET 框架的组成

.NET 框架由三部分组成,如下图所示。执行环境称为 CLR(Common Language Runtime,公共语言运行时)。CLR 在运行时管理程序的执行,包括以下内容:

  • 内存管理和垃圾回收。
  • 代码安全验证。
  • 代码执行、线程管理及异常处理。

编程工具涵盖了编码和调试需要的切,包括以下几点:

  • Visual Studio 集成开发环境(IDE)。
  • .NET 兼容的编译器(例如: C#、Visual Basic .NET、F#、IronRuby 和托管的 C++)。
  • 调试器。
  • Web 开发服务器端技术,比如 ASP.NET 或 WCF。

BCL(Base Class Library,基类库)是 .NET 框架使用的一个大的类库,而且也可以在你的程序中使用。

2.2 改进的编程环境

较之以前的 Windows 编程环境,.NET 框架为程序员带来了相当大的改进。下面将简要阐述它的特点及其带来的好处。

  1. 面向对象的开发环境

    CLR、BCL 和 C# 完全是面向对象的,并形成了良好的集成环境。

    系统为本地程序和分布式系统都提供了一致的、面向对象的编程模型。它还为桌面应用程序、移动应用程序和 Web 开发提供了软件开发接口,涉及的目标范围很广,从桌面服务器到手机。

  2. 自动垃圾回收

    CLR 有一项服务称为 GC(garbage collector,垃圾回收器),它能自动管理内存。GC 自动从内存中删除程序不再访问的对象。

    GC 使程序员不再操心许多以前必须执行的任务,比如释放内存和检查内存泄漏。这可是个很大的改进,因为检在内存泄源可能非常困难而且耗时很长。

  3. 互操作性

    .NET 框架专门考虑了不同的 .NET 语言、操作系统或 Win32 DLL 和 COM 之间的互操作性。

    • .NET 语言的互操作性允许用不同的 .NET 语言编写的软件模块无缝地交互。
      • 用一种 .NET 语言写的程序可以使用甚至继承用另外一种 .NET 语言写的类,只需要遵循一定的规则即可。
      • 正因为能够很容易地集成不同编程语言生成的模块,.NET 框架有时被称为是语言无关的。
    • .NET 提供一种称为平台调用(platform invoke,P/Invoke)的特性,允许 .NET 的代码调用并使用非 .NET 的代码。它可以使用标准 Win32 DLL 导出的纯 C 函数的代码,比如 Windows API。
    • .NET 框架还允许与 COM 进行互操作。.NET 框架软件组件能调用 COM 组件,而且 COM 组件也能调用 .NET 组件,就像它们是 COM 组件一样。
  4. 不需要 COM

    .NET 框架使程序员摆脱了 COM 的束缚。作为一名 C# 程序员,你肯定很高兴不需要使用 COM 编程环境,因而也不需要下面这些内容。

    • IUnknown 接口 在 COM 中,所有对象必须实现 IUnknown 接口。相反,所有 .NET 对象都继承一个名为 object 的类。接口编程仍是 .NET 中的个重要部分,但不再是中心主题了。
    • 类型库 在 COM 中,类型信息作为 .tlb 文件保存在类型库中,它和可执行代码是分开的。在 .NET 中,程序的类型信息和代码起被保存在程序文件中。
    • 手动引用计数 在 COM 中,程序员必须记录一个对象的引用数目以确保它不会在错误的时间被删除。在 .NET 中,GC 记录引用情况并只在合适的时候删除对象。
    • HRESULT COM 使用 HRESULT 数据类型返回运行时错误代码。.NET 不使用 HRESULT。相反,所有意外的运行时错误都产生异常。
    • 注册表 COM 应用必须在系统注册表中注册。注册表保存了与操作系统的配置和应用程序有关的信息。.NET 应用不需要使用注册表,这简化了程序的安装和卸载。(但有功能类似的工具,称为全局程序集缓存,即 GAC。)

    尽管现在不太需要编写 COM 代码了,但是系统中还在使用很多 COM 组件,C# 程序员有的时候需要编写代码来和那些组件交互。C# 4.0 引入了几个新的特性来简化这个工作。

  5. 简化的部署

    为 .NET 框架编写的程序进行部署比以前容易很多,原因如下。

    • .NET 程序不需要使用注册表注册,这意味着在最简单的情形下,一个程序只需要被复制到目标机器上便可以运行。
    • .NET 提供种称为并行执行的特性, 允许一个 DLL 的不同版本在同一台机器上存在。这意味着每个可执行程序都可以访问程序生成时使用的那个版本的 DLL。
  6. 类型安全性

    CLR 检查并确保参数及其他数据对象的类型安全,不同编程语言编写的组件之间也没有问题。

  7. 基类库

    .NET 框架提供了一个庞大的基础类库,很自然地,它被称为基类库(Base Class Libray,BCL)。在写自己的程序时,可以使用其中的类,如下所示。

    • 通用基础类 这些类提供了一 组极为强大的工具,可以应用到许多编程任务中,比如文件操作、字符串操作、安全和加密。
    • 集合类 这些类实现了列表、字典、散列表以及位数组。
    • 线程和同步类 这些类用于创建多线程程序。
    • XML类 这些类用于创建、读取以及操作 XML 文档。

    在编程领城,你现在面临的任务,尤其是最基本的任务,几乎都有人执行过了。BCL 的想法是为大多数一般性任务提供内建功能,这样你的职责就只是拼凑这些功能并编写应用程序所需的专用代码。不要担心,剩下的任务仍然需要你具备大量的知识和技能。

三、编译成 CIL

.NET 语言的编译器接受源代码文件,并生成名为程序集的输出文件。下图描述了这个过程。

  • 程序集要么是可执行的,要么是 DLL。
  • 程序集里的代码并不是本机代码,而是种名称为 CIL(Common Intermediate Language,公共中间语言)的中间语言。
  • 程序集包含的信息中,包括下列项目:
    • 程序的 CIL;
    • 程序中使用的类型的元数据;
    • 对其他程序集引用的元数据。

四、编译成本机代码并执行

程序的 CIL 直到被调用运行时才会被编译成本机代码。在运行时,CLR 执行下面的步骤:

  1. 检查程序集的安全特性
  2. 在内存中分配空间
  3. 把程序集中的可执行代码发送给即时(just-in-time,JIT)编译器,把其中的一部分编译成本机代码。

程序集中的可执行代码只在需要的时候由 JIT 编译器编译,然后它就被缓存起来以备在后来的程序中执行。使用这个方法意味着不被调用的代码不会被编译成本机代码,而且被调用到的代码只被编译一次。

一旦 CIL 被编译成本机代码,CLR 就在它运行时管理它,执行如释放无主内存、检查数组边界、检查参数类型和管理异常之类的任务。两个重要的术语由此而生。

  • 托管代码 为 .NET 框架编写的代码称为托管代码(managed code),需要 CLR。
  • 非托管代码 不在 CLR 控制之下运行的代码,比如 Win32 C/C++C DLL,称为非托管代码(unmanaged code)。

微软公司还提供了一个称为本机映像生成器的工具 Ngen,可以把一个程序集转换成当前处理器的本机代码。Ngen 处理过的代码免除了运行时的 JIT 编译过程。

编译和执行

无论原始源文件的语言是什么,都遵循同样的编译和执行过程。下图说明了 3 个用不同语言编写的程序的完整编译时和运行时过程。

五、CLR

.NET 框架的核心组件是 CLR,它在操作系统的顶层,负责管理程序的执行,如下图所示:

CLR 还提供下列服务:

  • 自动垃圾回收;
  • 安全和认证;
  • 通过访问 BCL 得到广泛的编程功能,包括如 Web 服务和数据服务之类的功能。

六、CLI

每种编程语言都有一组内置的类型,用来表示如整数、浮点数和字符等之类的对象。过去,这些类型的特征因编程语言和平台的不同而不同。例如,组成整数的位数对于不同的语言和平台就有很大差别。

然而,这种统一性的缺乏使我们难以让使用不同语言编写的程序及库一起良好协作。为了有序协作,必须有组标准。

CLI(Common Language Infrastructure,公共语言基础结构)就是这样一组标准, 它把 .NET 框架的所有组件连结成一个内聚的、一致的系统。它展示了系统的概念和架构,并详细说明了所有软件都必须遵守的规则和约定。CLI 的组成如下图所示:

CLI 和 C# 都已经被 Eema International 批准为开放的国际标准规范。Ecma 本来是 Europen Computer Manufacturer Association(欧洲计算机制造商协会)的缩写,但现在已经不是缩写了,它就是一个词。 Ecma 的成员包括微软、IBM、惠普、谷歌、雅虎等众多和计算机及消费性电子产品有关的公司。

CLI 的重要组成部分

虽然大多数程序员不需要了解 CLI 规范的细节,但至少应该熟悉公共类型系统和公共语言规范的含义和用途。

  1. 公共类型系统

    CTS(Common Type system,公共类型系统)定义了那些在托管代码中一定会使用的类型的特征。CTS 的一些重要方面如下。

    • CTS 定义了一组丰富的内置类型,以及每种类型固有的、独有的特性。
    • .NET 兼容编程语言提供的类型通常映射到 CTS 中已定义的内置类型集的某一个特殊子集。
    • CTS 最重要的特征之一是所有类型都继承自公共的基类——object。
    • 使用 CTS 可以确保系统类型和用户定义类型能够被任何 .NET 兼容的语言所使用。
  2. 公共语言规范

    CLS(Common Langage Spifcien,公共语言规范)详细说明了一个 .NET 兼容编程语言的规则、属性和行为,其主题包括数据类型、类结构和参数传递。

七、各种缩写

本文包含了许多 .NET 缩写,下表将帮助你直观第理解它们。

  • 程序集
    • 公共中间语言(CIL、IL 或 MSIL)
  • 公共语言运行库(CLR)
    • 垃圾回收器(GC)
    • 即时编译器(JIT)
    • 基类库(BCL)
  • 公共语言基础结构(CLI)
    • 公共类型系统(CTS)
    • 公共语言规范(CLS)

原文链接:https://www.dotnetprimer.com/csharp/01-the-relationship-between-csharp-and-dotnet-framework/

(完)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读6.2k次,点赞2次,收藏3次。C#数学运算表达式解释器测试文件内容:a=2+3*2;b=2*(2+3);浏览按钮事件处理程序: private void button_browse_Click(object sender, EventArgs e) { OpenFileDialog fbd = new OpenFileDialog(); fbd.T_c# 表达式分析器
文章浏览阅读5.2k次,点赞6次,收藏7次。程序要做到用户配置的灵活性,就需要添加配置管理功能,这里使用.NET的应用程序配置文件app.config来保存配置信息,.NET Framework提供了对配置文件读写的良好支持。要实现配置文件的读取功能,需要引用System.Configuration命名空间。提供源码下载,有源有真相。_引用封送类的字段,访问上面的成员可能导致运行时异常
文章浏览阅读9k次。错误信息检测到 ContextSwitchDeadlock Message: CLR 无法从 COM 上下文 0x622b440 转换为 COM 上下文 0x622b5b0,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断_contextswitchdeadlock
文章浏览阅读2w次,点赞10次,收藏9次。我发生错误时的环境:Windows 7,Framework 4、0,Microsoft Office 2007,VS2010,c# WinForm;部分代码: string strConn = "Provider=Microsoft.Ace.OleDb.12.0;Persist Security Info=False;" + "data source=" + _c# oledb 操作必须使用一个可更新的查询
文章浏览阅读9.8k次。C# 二进制字节流查找函数IndexOf /// /// 报告指定的 System.Byte[] 在此实例中的第一个匹配项的索引。 /// /// 被执行查找的 System.Byte[]。 /// 要查找的 System.Byte[]。 /// 如果找到该字节数组,则为 searchBytes 的索_c#byte[]查找
文章浏览阅读2.5w次,点赞3次,收藏9次。c#DataGridView数据绑定示例 格式化单元格的内容在使用DataGridView显示数据库中的数据时,我们需要对某列的数据显示格式进行格式化。这里使用实时构建的数据,如下图:在显示时对第三列的数据进行格式化,如下图:测试数据构建及数据绑定: private void Form1_Load(object sender, EventArgs e) { _c#datatable列格式化
文章浏览阅读2.8w次,点赞3次,收藏4次。完整错误信息错误 1 命名空间“System”中不存在类型或命名空间名称“Linq”。是否缺少程序集引用? F:CsProjectsCSharp实现SPY++CSharp实现SPY++Form1.cs 6 14 CSharp实现SPY++错误原因开始的时候创建项目选择的Framework版本是4.0,但后来为了项目的平台适应性,将Framework的版本改为了2.0,重新编译_命名空间system中不存在类型或命名空间名称
文章浏览阅读1.9w次。一、通过配置文件实现以管理员身份运行程序Vista 和 Windows 7 操作系统为了加强安全,增加了 UAC(用户账户控制) 的机制,如果 UAC 被打开,用户即使是以管理员权限登录,其应用程序默认情况下也无法对系统目录,系统注册表等可能影响系统运行的设置进行写操作。这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要_c# 默认程序以管理身份运行。
文章浏览阅读5.2k次。在使用C#操作IIS创建应用程序池出现异常:无效索引(Exception from HRESULT:0x80070585)相关代码:public static string CreateAppPool(string appPoolName, string frameworkVersion, string managedPipelineMode) {_create website 无效索引。 (0x80070585)
文章浏览阅读9.5k次,点赞3次,收藏4次。C#二进制字节数组操作函数 截取字节数组SubByte /// /// 截取字节数组 /// /// 要截取的字节数组 /// 开始截取位置的索引 /// 要截取的字节长度 /// 截取后的字节数组 public byte[] SubByte(byte[] srcByt_c#字节数组截取
文章浏览阅读2.4w次,点赞5次,收藏16次。C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(_c#读文件
文章浏览阅读4.8w次,点赞12次,收藏44次。C#创建Excel文件,这里实际上是从资源中提取一个事先创建好的Excel文件,文件提取成功后,使用OleDb方法连接Excel,向Excel文件中写入数据。创建解决方案菜单》新建》项目》Windows窗体应用程序:添加相关组件:添加两个DataGridView,一个TextBox,两个按钮 ,如下图:添加Excel资源:先在文件夹中新建一个Excel文件,在Sheet1表的第一行设置列名:双击“_c#保存到excel
文章浏览阅读2.8k次。windows 7和vista提高的系统的安全性,同时需要明确指定“以管理员身份运行”才可赋予被运行软件比较高级的权限,比如访问注册表等。否则,当以普通身份运行的程序需要访问较高级的系统资源时,将会抛出异常。如何让程序在启动时,自动要求“管理员”权限了,我们只需要修改app.manifest文件中的配置项即可。app.manifest文件默认是不存在的,我们可以通过以下操作来自_vb.net 程式以管理员运行
文章浏览阅读6.1k次,点赞4次,收藏7次。窗口风格(Window style)WS_BORDER 有边框窗口 WS_CAPTION 必须和WS_BORDER风格配合,但不能与WS_DLGFRAME风格一起使用。指示窗口包含标题要部分。 WS_CHILD 说明窗口为子窗口,不能应用于弹出式窗口风格(WS_POPUP)。 WS_CHILDWINDOW 同WS_CHILD。 WS_CLIPCHILDREN 绘制父窗口时_net(c#):ws_caption | ws_border
文章浏览阅读1.8w次,点赞3次,收藏9次。C#修改文件或文件夹的权限,为指定用户、用户组添加完全控制权限 //给Excel文件添加"Everyone,Users"用户组的完全控制权限 FileInfo fi = new FileInfo(excelPath); System.Security.AccessControl.FileSecurity fileSecurity_c# 判断 文件夹 是否 users 用户组 写入 权限
文章浏览阅读9.3k次。C# 模拟PrintScreen 和 Alt+PrintScreen截取屏幕图片keybd_event API函数功能:该函数合成一次击键事件。系统可使用这种合成的击键事件来产生WM_KEYUP或WM_KEYDOWN消息,键盘驱动程序的中断处理程序调用keybd_event函数。在Windows NT中该函数己被使用SendInput来替代它。函数原型;VOID keybd_event..._如何编程调用 printscreen
文章浏览阅读1w次。这本来是在VS2005下创建的一下项目,后来改用VS2010的开发环境,.NET Framework的版本还是使用2.0,但每次生成之后都会在解决方案的同级目录下产生一个名称乱码的文件夹,解决了那个问题之后,由于这个Windows窗体应用程序添加一个安装项目,项目生成时出现以下错误:错误 1 验证时出错。HRESULT = '8000000A' F:CsProjects屏幕截图2005屏幕截_error1an error occurred while validating. hresult = '8000000a
文章浏览阅读7.3k次。上一篇:C#软件开发实例.私人订制自己的屏幕截图工具(六)添加配置管理功能由于截图时可能需要精确截取某一部分,所以需要放大镜的功能,这样截取的时候才更容易定位截图的位置。添加PictureBox,name属性设置为“pictureBox_zoom”;在“Form1_Load”事件处理函数中添加以下代码://设置放大镜的大小 this.pictureBox_zoom.Widt_c#实现放大镜效果
文章浏览阅读4.5k次。C# 绘制箭头的方法,仿微信截图的箭头效果见下图,实际上还是有区别的,箭头的起点处微信的是圆端,而我实现的是尖端。说说我的实现吧,实现方法其实是划线,线的两端都要设置端点样式。看代码:Point _StarPoint = new Point(0, 0);Point _EndPoint = new Point(300, 300);System.Drawing.Drawing2..._adjustablearrowcap
文章浏览阅读1.3w次,点赞3次,收藏4次。在实现“C#软件开发实例.私人订制自己的屏幕截图工具(六)添加配置管理功能”功能时,遇到警告:由于“Screenshot.Form1.ZoomBoxHeight”是引用封送类的字段,访问上面的成员可能导致运行时异常解决方案:对字段对待封装:在需要封装的字段上单击鼠标右键,重构》封装字段:输入属性名:使用默认设置,单击应用_由于引入封装类的字段