ITPub博客

首页 > 应用开发 > IT综合 > Microsoft .NET 框架常见问题之四(转)

Microsoft .NET 框架常见问题之四(转)

原创 IT综合 作者:hphubei 时间:2007-07-08 20:50:43 0 删除 编辑

什么是托管代码和托管数据?

托管代码是编写为支持公共语言运行时服务的代码(请参阅“什么是公共语言运行时?”)。为了支持这些服务,代码必须向运行时提供最小级别的信息(元数据)。默认情况下,所有 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 的开销。不过,增强型名称不会生成任何信任某个出版商的语句。增强型名称使您可以确信给定程序集的内容没有被篡改,在运行时为您加载的程序集来自于您开发时针对的出版商。但它不会生成有关是否信任出版商身份的语句。

返回页首

名称空间与程序集名称之间有什么区别?

名称空间是类型的一种逻辑命名方案,其中简单类型名称(如 MyType)前面带有用点分隔的层次结构名称。这样的命名方案完全在开发人员的控制之下。例如,键入 MyCompany.FileAccess.A 和 MyCompany.FileAccess.B 在逻辑上将会具有与文件访问相关的功能。.NET 框架使用一种层次结构命名方案,用于将类型按相关功能的逻辑类别进行分组,例如,ASP.NET 应用程序框架或远程处理功能。设计工具可以利用名称空间使开发人员更容易在代码中浏览和引用类型。名称空间的概念与程序集的概念之间没有任何联系。一个程序集可以包含其层次结构名称具有不同名称空间根的类型,而一个逻辑名称空间根可以跨越多个程序集。在 .NET 框架中,名称空间是在设计时进行逻辑命名的便捷方式,而程序集在运行时为类型建立名称作用域。

返回页首

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/79548/viewspace-925366/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    181
  • 访问量
    274757