概念问题
什么是 .NET?
简单地说,Microsoft® .NET 是 Microsoft 以服务的方式递交软件的一种策略。有关完整信息,请参阅有关该主题的白皮书(英文)。
以下是白皮书的摘要,简要介绍了 .NET 的关键内容:
Microsoft .NET 平台
包括用于创建和操作新一代服务的 .NET 基础结构和工具、用于实施多信息客户端的 .NET 用户经验,以及用于启用新一代智能 Internet 设备的 .NET 构造块服务和 .NET 设备软件。
Microsoft .NET 产品和服务
包括 Microsoft® Windows.NET(其核心集成了一组构造块服务)、MSN.NET、个人订阅服务、Microsoft® Office.NET、Microsoft® Visual Studio.NET 和 Microsoft® bCentral™ for .NET。
第三方 .NET 服务
许多领域的合作伙伴和开发人员都有机会在 .NET 平台上提供企业和垂直服务。
此问题针对的是 .NET 框架。.NET 框架是 .NET 平台基础结构的一部分。有关 .NET 框架的详细信息,请参阅下一个问题。
什么是 .NET 框架?
.NET 框架是创建、部署和运行 Web 服务及其他应用程序的一个环境。它包括三个主要部分:公共语言运行时、框架类和 ASP.NET。
.NET 框架是否只适用于创建 Web 站点的用户?
.NET 框架使您可以创建优秀的 Web 应用程序。但它也可以帮助您创建现在的各种应用程序。与当前创建应用程序的方式相比,.NET 在编写任何 Windows 软件(使用 ATL/COM、MFC、Microsoft® Visual Basic® 或标准 Microsoft® Win32®)方面都具有更大的优势。当然,如果您是开发 Web 站点,那么从 ASP.NET 开始,您就会感受到 .NET 框架的强大吸引力。
从何处可以获得 .NET 框架 SDK?
现在可以从 MSDN Online Downloads(英文)下载 .NET 框架 SDK 的 Beta 1 版。鉴于其大小,我们以多种方式提供此 Beta 版:作为一个下载文件 (106 MB),分为 11 部分下载,或者从 Microsoft Developer Store 定购其 CD:
美国/加拿大(英语)
国际(英语)
.NET 框架可以运行于哪些平台?
Beta 1 版可以运行在 Microsoft® Windows® 2000、Windows 95/98/ME 和 Windows NT® 4.0 上。
另外,还有一个称为 .NET 精简框架的 .NET 框架版本。它用于使蜂窝电话和增强型电视等设备也具有 .NET 框架的某些功能。.NET 精简框架将运行在 Windows CE 和其他嵌入式操作系统上。
.NET 框架支持哪些编程语言?
.NET 框架与编程语言无关。事实上任何语言都可以支持 .NET 框架。目前,您可以用许多语言来创建 .NET 程序,包括:C++、Microsoft® Visual Basic.NET、Jscript® 和 Microsoft 的最新语言——C#。以后,也会有大量的第三方语言可以用来创建 .NET 框架应用程序,包括 COBOL、Eiffel、Perl、Python、Smalltalk 等等。
.NET 框架和 COM+ 服务之间是什么关系?
在 .NET 框架中,不仅可以完全访问 COM+ 服务,而且也更容易创建服务组件。
.NET 框架组件可被添加至 COM+ 应用程序中。在 COM+ 应用程序中,.NET 框架组件可以利用自动组件服务,例如:事务、对象池、排队组件、事件等等。
.NET 框架和 DCOM 之间是什么关系?
DCOM 是用于进程间通讯的 COM 基础结构。.NET 框架支持大量用于进程间通讯的可插入通道和格式化程序。在托管代码和非托管代码之间进行转换时,.NET 框架使用了 COM 基础结构,尤其是 DCOM。所有使用 COM+ 服务的方案都使用了托管到非托管转换,因此默认使用 DCOM。对于注重互操作性的进程间通讯,.NET 框架也支持 SOAP(简单对象访问协议)。
.NET 框架是否仅仅是 Windows DNA 的新名称?
不。Windows DNA 是用于创建紧耦合的分布式 Web 应用程序的一种体系结构。由于分布式应用程序变得需要更多的松耦合原理,因此 Microsoft 在 .NET 中发展了该体系结构。.NET 框架是 .NET 体系结构的一部分。
运行时技术问题
术语
什么是公共语言运行时 (CLR)?
公共语言运行时是 .NET 框架应用程序的执行引擎。
它提供许多服务,包括:
代码管理(加载和执行)
应用程序内存隔离
类型安全验证
IL 到本机代码的转换
元数据(增强的类型信息)访问
为托管对象管理内存
强制代码访问安全
异常处理,包括跨语言异常
托管代码、COM 对象和现有 DLL(非托管代码和数据)之间的互操作
自动进行对象布局
对开发人员服务(配置、调试等)的支持
什么是公共类型系统 (CTS)?
公共类型系统是多信息类型系统,它被内置在公共语言运行时中,支持大多数编程语言中的类型和操作。公共类型系统支持大量编程语言的完全实现。
什么是公共语言规范 (CLS)?
公共语言规范是一组结构和限制,用作库编写者和编译器编写者的指南。它使任何支持 CLS 的语言都可以完全使用库,并且使这些语言可以相互集成。公共语言规范是公共类型系统的子集。对于那些需要编写代码供其他开发人员使用的应用程序开发人员,公共语言规范也非常重要。如果开发人员遵循 CLS 规则来设计公共访问的 API,那么就可以在支持公共语言运行时的任何其他编程语言中很容易地使用这些 API。
什么是 Microsoft 中间语言 (MSIL)?
MSIL 是与 CPU 无关的指令集。.NET 框架程序被编译成 MSIL。它包含加载、存储、初始化和调用对象方法的指令。
与元数据和公共类型系统结合,MSIL 允许真正的跨语言集成。
MSIL 在执行前被转换为机器代码,而不是一边解释一边执行。
什么是托管代码和托管数据?
托管代码是编写为支持公共语言运行时服务的代码(请参阅“什么是公共语言运行时?”)。为了支持这些服务,代码必须向运行时提供最小级别的信息(元数据)。默认情况下,所有 C#、Visual Basic.NET 和 Jscript.NET 代码都是托管代码。Visual Studio.NET C++ 代码在默认情况下不是托管代码,但通过指定命令行开关 (/CLR),编译器也可以生成托管代码。
与托管代码密切相关的是托管数据。托管数据是由公共语言运行时的垃圾回收器进行分配和释放的数据。默认情况下,C#、Visual Basic 和 Jscript.NET 数据是托管数据。不过,通过使用特殊的关键字,C# 数据可以被标记为非托管数据。Visual Studio.NET C++ 数据在默认情况下是非托管数据(即使在使用 /CLR 开关时),但是在使用 C++ 的托管扩展时,可以使用“__gc”关键字将类标记为托管类。就象该名称所显示的那样,它表示类实例的内存由垃圾回收器管理。另外,该类也完全成为 .NET 框架的成员,同时具备它所带来的好处和限制。好处的一个例子是:它可以与其他语言编写的类正确地进行互操作(如托管的 C++ 类可以从 Visual Basic 类继承);限制的一个例子是:托管类只能从一个基类继承。
程序集
什么是程序集?
程序集是 .NET 框架应用程序的主要构造块。它是作为一个单一实现单元(包含一个或多个文件)来创建、标识和部署的功能集合。所有的托管类型和资源都可以被标记为仅在其实现单元内访问,或者标记为可由该单元以外的代码来访问。
程序集通过清单来进行自我说明。清单是每个程序集的不可或缺的组成部分。清单:
建立程序集标识(以文本名称的格式)、版本、类别和数字签名(如果要在应用程序之间共享该程序集)。
定义组成程序集实现的文件(通过名称和文件散列)。
指定组成程序集的类型和资源,包括哪些是从程序集中导出的。
逐条记录编译时对其他程序集的依存。
指定程序集正确运行所需要的权限的集合。
此信息在运行时用于解析引用、强制版本绑定策略以及验证所加载的程序集的完整性。因为每一类型都被加载到程序集的上下文中,所以运行时可以确定并定位任何正在运行的对象的程序集。程序集也是应用了代码访问安全权限的单元。在确定授予其所包含的代码哪些权限时,每个程序集的标识证据都被认为是独立的。
程序集的自我说明特征也有助于实现无影响安装和 XCOPY 部署。
什么是专用程序集和共享程序集?
专用程序集仅由单一应用程序使用,并且存储在该应用程序的安装目录中(或其子目录中)。共享程序集是可被多个应用程序引用的程序集。要共享一个程序集,该程序集必须明确为这个目的而创建,这可以通过给其指定加密的增强型名称(用作共享名称)来实现。相反,专用程序集名称只要求在使用它的应用程序中是唯一的。
通过区分专用和共享程序集,我们介绍明确决定共享的要点。只需简单地将专用程序集部署在应用程序目录中,即可确保应用程序只在创建和部署它的那部分中运行。对专用程序集的引用只在专用应用程序目录内部进行解析。
选择创建和使用共享程序集可以有多种原因,例如表达版本策略的能力。共享程序集具有加密的增强型名称,这项事实意味着只有程序集的作者才拥有密钥来生成程序集的新版本。因此,如果您做出策略声明,希望接受程序集的新版本,则您可以确信版本更新将由作者来控制和验证。否则,您就不会接受它们。
对于在本地安装的应用程序,共享程序集通常被明确安装在全局程序集缓存中(程序集的本地缓存由 .NET 框架维护)。.NET 框架的版本管理特性的关键在于下载的代码不会影响本地安装的应用程序的执行。下载的代码被放在一个特殊的下载缓存中,即使某些下载组件被编译为共享程序集,也不能在机器上全局使用这些代码。
与 .NET 框架一起发布的类都被编译为共享程序集。
如果我想创建一个共享程序集,在标记和管理密钥对方面是否需要额外的开销?
创建共享程序集确实涉及到加密密钥方面的工作。创建程序集时,只有公共密钥是必要的。支持 .NET 框架的编译器提供命令行选项(或使用自定义属性),用于在创建程序集时提供公共密钥。通常在资源数据库中保留一份常用的公共密钥,并使编译脚本指向此密钥。在发布程序集之前,必须使用相应的私人密钥将其完全标记。这是通过 SDK 工具 SN.exe(增强型名称)来完成的。
增强型名称标记不象 Authenticode 一样需要使用证书。它不涉及第三方组织,不需要付费,也不受证书约束。另外,验证增强型名称的额外开销远远小于验证 Authenticode 的开销。不过,增强型名称不会生成任何信任某个出版商的语句。增强型名称使您可以确信给定程序集的内容没有被篡改,在运行时为您加载的程序集来自于您开发时针对的出版商。但它不会生成有关是否信任出版商身份的语句。