问:在技术面试中,面试官为什么倾向于以一些基础概念的题目做完开场白?
答:1.可以了解应聘者的知识点的覆盖,2.可以了解应聘者对知识掌握的是否扎实,其实基础问题是最好回答,也是最难回答的,很容易考察应聘者的水平。
1. .net基础概念
1.1 什么是CTS、CLS和CLR?
答:公共语言运行库(CLR)是一个CLI(公共语言基础)的实现,包含了.net运行引擎和符合CLI(公共语言基础)的类库。
通用类型系统(CTS)包含在微软公司提交的CLI(公共语言基础)规范中,定义了一棵可以在公共语言运行库(CLR)上运行的类型规范。
公共语言规范(CLS)是CTS的一个子集,定义了所有面向.net的程序需要符合的最小规范集。
分析:涉及的知识点:.net的基本概念,常用的术语
补充:
CLI(公共语言基础)包括了通用类型系统(CTS)、公共中间语言(CIL)、底部文件格式以及元数据格式等。(能够在公共语言运行库(CLR)上运行的语言,并不代表它是符合CTS规范的,例如C++)
1.2 开发和运行.net程序需要的最基本的环境是什么?
答:开发.net程序需要一个文本编辑器和一个针对编码语言的编译器。例如:对于C#,最常用的编译器是csc.exc。而运行.net程序,需要的是安装.net framework组件。
分析:涉及的知识点:.net的基本运行机制,.net程序的开发
补充:虽然我们非常喜欢使用IDE,但它却不是必必须的。
1.3 .net是否支持多编程语言开发?
答:.net支持多编程语言开发,但所有设计必须符合CLS规范以保证编程语言之间的特性差异不会产生运行时的异常。
分析:涉及的知识点:CLS的概念、C++/CLI的基本概念。C++/CLI和C#的协作开发
补充:java的跨平台是指跨操作系统。.net的跨平台是指跨编程语言。
1.4 CLR技术和COM技术的比较?
答:CLR和COM都定义了组件间交互的规范。COM并没有定义如何描述组件间的依赖性,并且由于其严格的物理约定,造成了很多组件版本升级和控制的问题,CLR运用元数据和逻辑类型定义等机制,有效地解决了COM遗留的问题。CLR更加的易学。
分析:COM的基本原理,缺陷,CLR比较与COM的优势
补充:COM是组件对象模型(Common Object Mode)。曾经非常流行的编程模型和平台技术。实现了接口分离。COM包含一个接口定义组件(IDL文件)和类型库文件(TLB文件)。
COM的缺点:
1)COM并没有定义如何描述组件间的依赖性,并且由于其严格的物理约定,造成了很多组件版本升级和控制的问题。
2)COM组件的扩展型很差。
1.5什么是程序集和应用程序域?
答:程序集(Assembly)是一个有类型定义、数据文件和资源文件组成的逻辑集合。每个程序集都包含一个程序集清单,该清单通常被附加在某个文件头上,也可以设置单独建立一个文件来包含该清单。
应用程序域是CLR中提供代码运行范围、错误隔离和安全设置隔离的逻辑单元。
分析:程序集和应用程序域的基本概念
补充:程序集是逻辑上的概念。
应用程序域和操作系统的区别:应用程序域的创建和销毁的开销相对较小。CLR仍在操作系统上运行,所以应用程序域必在某个操作系统的进程内。
即应用程序域实现了进程的功能,但一个进程可以包含多个应用程序域。
2 .net的运行机制?
2.1 .net程序被编译成什么形式的代码?
答:.net第一次编译后,形成CLR头、元数据和中间代码。在实施运行或者部署时,将经过第二次编译,编译的结果是在CLR中可执行的机器代码
分析:.net中的编译,中间代码的基本概念、JIT基本概念。
2.2 JIT是如何工作的?
答:JIT 引擎在编译中间代码之前,会寻找方法的本机机器代码缓存并且判断其是否可用,如果可用则直接加载,如果不可用,JIT引擎会查找类型中的方法存根,找到该中间代码并且进行编译。
补充:JIT是实时编译(Just-In-Time)提供了两张方式:
1)利用JIT引擎进行实时编译
2)在组件部署时就生成代码形式的缓存,供CLR调用。
2.3 简述程序集的加载机制
答:CLR通过System.Reflection.Assembly.LoadFrom和System.Reflection.Assembly.Load来主动地加载程序集。前者通过位置而后者则通过唯一标识强命名程序集的4个元素来标识程序集。CLR的加载机制了Load方法一致,其内在策略是依次通过版本策略、CODEBASE位置、应用程序域位置和应用程序位置来查找程序集。
2.4如何配置程序集的版本策略?
答:CLR支持3个级别上设定版本策略,依次是:应用程序策略、发行者策略和计算机策略。所有策略的设置都是通过修改配置文件来实现的。3个级别的策略会依次被CLR执行,而上一个策略的执行结果将作为下一个策略的输入。发行者策略仅仅针对那些放入GAC的程序集,并且可以在应用程序策略中被指定忽略。
3 生成、部署和管理
3.1如何生成强签名的程序集?
答:生成强签名的程序集需要公钥/私钥对后,就可以控制编译器的输入参数来得到一个强签名的程序集。
3.2 如何把程序集放入GAC中
答:GAC是一个具有特定目录结构的文件夹,所有强签名的程序集都可以放入GAC中。
3.3 延迟签名及其作用
答:延迟签名就是把对强签名程序集的私钥加密盒数字签名延迟到实际发布时进行。延迟签名提高了开发测试阶段的效率,也方便了机构和项目组管理自己的私钥。
3.4 程序集的版本分哪几部分?
答:四部分主版本号,次版本号,内部版本号,和修订号