Effective C#第4章:创建基于二进制的组件

随着类的数量增加,创建二进制的组件就变得很平常了:你想分离部分功能 。所有不同的是,二进制组件可以让你独立的保存这些离散的功能。创建的组件 程序集可以方便的共享逻辑,方便交叉语言 编程,以及方便布置。

在.Net程序就是组件包,每一个程序什么样可以随时更新和发布。你应该已经知 道,基于程序集之间的应用程序是多么容易更新呀,程序集之间的偶合是多么好 呀! 最小偶合就是说更多的是减少了程序集之间复杂的依懒关系。同时也意味着 你可以简单的更新小块新 的程序集。这一章就是关于创建简单易用,容易布置 ,以及容易更新的程序集。

.Net环境中的应用程序可以由多样的二进制 组件组成。随后,你可以独立的更新这些组件,也就是可以在一个多程序集应用 程序中安装与更新一个程序集。但你必须明白一件事,那就是CLR是如何发现和 载入这些程序集的。在你创建这些二进制组件时,你也就必须创建符合这些明确 期望的组件。接下来就介绍这一概念。

CLR并不会在程序启动时加载全部 的引用程序集。更合适的作法是当运行时须要程序的成员时,加载器才解决程序 集的引用问题。这可能是调用一个方法或者访问数据,加载器先查找引用的程序 集,然后加载它,然后JIT编译须要的IL。

当CLR须要加载一个程序集时 ,先是断定那个文件要加载。程序集的元数据包含了对所有其它程序集的引用记 录,这个记录有强名称和弱名称之分。一个强名称(程序集)由四部分组成:程序 名,版本号,语言属性(译注:这里的语言范指区域性特定的信息,如关联的语 言、子语言、国家/地区、日历和区域性约定),以及公开密钥。如果程序集不是 一个强名称程序,那么就只记录了程序集名。如果你的程序是一个强名称程序集 ,那么你的程序集就不太可能被一些恶意的组件(程序集)所取代。强程序集还可 以让你用配置文件对组件的版本进行配置,是新的,还是先前的。

确定 正确的程序集以后,CLR接来就断定这个程序集是否已经在当前的应用程序中加 载。如果是,就用原来的。如果不是,CLR就继承查找程序集。如果程序是强名 称的,CLR就先在全局程序缓存(GAC)中查找,如果不在GAC中,加载器就检测代 码目录(codebase directory,译注,这里只是译为代码目录,其实并不是源代 码所在的目录)中的配置文件,如果当前代码目录存在,那就是唯一被搜索程的 目录了。如果在代码目录中没有找到所要的程序集,那么加载就失败。

如果没有直接的代码目录,加载器会搜索预先设定的目录集:

* 应用程 序目录。也就是与主应用程序集同在的位置。

* 语言目录。这是一个在 应用程序目录下的子目录,这个目录与当前语言名匹配。

* 程序集子目 录。这是一个与程序集同名的子目录,这两个可以组合成这样: [语言]/[程序 集名]

* 私有的运行目录(binPath)。这是一个在应用程序配置文件中定 义的私有目录。它同样可以和语言和程序集名组合: [bin目录]/[程序集名], 或者[bin目录]/[语言], 还可以是:[bin目录]/[语言]/[程序集名]。

从 这个讨论中你应该明白三个内容:第一,只有强名称程序集才能放到GAC中。其 次,你可以通过配置文件来修改默认的行为,从而升级程序中个别的强名称程序 集。第三,强名称程序集可以阻止对程序集的恶意篡改,从而提供更安全的应用 程序。

了解CLR是如何加载程序集的,有利于在实际操作中考虑如何创建 和更新组件。首先,你应该使用强名称程序集,把所有的元数据信息都记录下来 。当你在VS.net中创建一个项目时,你应该把assemblyInfo.cs文件中的所有属 性都填满,包括完整的版本号。这会让你在后面的升级中更简单的。VS.net在 assemblyInfo.cs中创建三个不同的部份,首先就是信息报告:

[assembly: AssemblyTitle("My Assembly")]
[assembly: AssemblyDescription
 ("This is the sample assembly")]
#if DEBUG
[assembly: AssemblyConfiguration ("Debug")]
#else
[assembly: AssemblyConfiguration ("Release")]
#endif
[assembly: AssemblyCompany ("My company")]
[assembly: AssemblyProduct("It is part of a product")]
[assembly: AssemblyCopyright ("Insert legal text here.")]
[assembly: AssemblyTrademark("More legal text")]
[assembly: AssemblyCulture("en-US")]

最后一条, AssemblyCulture 只针对本地化程序集。如果你的程序不包含任何的本地化资源 ,就空着。否则就应该遵从RFC1766标准填写语言描述信息。

接下来的部 份就是版本号,VS.net是这样记录的:

[assembly: AssemblyVersion("1.0.*")]

时间: 2024-12-03 00:09:28

Effective C#第4章:创建基于二进制的组件的相关文章

Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法

原文:Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我们讲了Raspberry安装Win10 IoT系统及搭建Visual Studio 2015开发环境的方法(http://www.cnblogs.com/cloudtech/p/5562120.html)

《Unity着色器和屏幕特效》——第2章 创建自定义着色器 2.1 打开程序项目

第2章 创建自定义着色器 这一章的内容将继续围绕飞船维修场景展开.通过添加自定义着色器,场景的真实感将获得进一步提升.我们将探索物体表面与场景光照之间的互动关系,展示Unity的基于物理的着色系统为游戏画面的质量带来的提升. 本章涉及的内容如下: 从无到有创建基本的自定义着色器. 为自定义着色器添加属性. 在场景中测试自定义着色器. 使用Cg语言编写着色器代码. 用多遍渲染实现更好的透明效果. 创建一个自定义的大气着色器. 2.1 打开程序项目 如果读者还没有打开过本书附带的示例程序项目,请从前

MS CRM 2011 如何创建基于Fetch的自定义报表,并使用数据预筛选(Pre-Filtering)

在前一篇文章中,我向大家介绍了如何创建基于SQL的自定义报表.由于CRM http://www.aliyun.com/zixun/aggregation/16846.html">Online只支持基于Fetch的报表,所以我在这篇文章中再向大家介绍一下如何创建基于Fetch的报表,并使用数据预筛选功能. (1) 打开Business Intelligence Development Studio,创建一个新的report server 项目; (2) 在项目管理器中,右键单击Reports

Pro JavaScript Techniques第三章: 创建可重用的代码

 Pro JavaScript Techniques第三章: 创建可重用的代码 mozart0 [楼主] 匪徒田老大 版主 帖子 2326体力 6628 威望 177 注册 2003-6-18 #1 发表于 2007-4-8 12:46  资料  短消息  加为好友  Pro Javascript Techniques翻译连载:说明和目录 当与其它程序员共同开发代码时(这里对大多数合作或团队项目来说是很常见的),为了保持你们的清醒而维护良好的编程惯例将会变得极其重要.随着近年来JavaScrip

《 嵌入式系统设计与实践》一一第2章 创建系统架构

**第2章 创建系统架构**即使是小型嵌入式系统也有很多细节部分,在哪里可以应用模式?这有一定的困难.这需要我们对整个系统有个比较好的了解,如哪些部分有直接的解决方案,哪些部分包含隐藏的依赖关系等.优秀的设计通常源于一个好的设计,并对其进行优化,理想情况下,设计是在开始着手实现之前进行的.系统架构图就是一个很好的理解系统的途径,也是软件设计的起点.从零开始一个项目是比较难的.因为刚开始的时侯很难把一个产品的功能定义清楚,所以可能需要经过好几轮的精心推敲之后才能确定一些思路.当我们在白板上写下产品

.NET Framework创建基于Windows应用程序

简介 目前 Web 已成了街谈巷议的话题,看起来好像Microsoft Visual Studio开发系统对创建基于Microsoft Windows的传统应用程序的支持有所减弱.实际上,Microsoft 对基于Windows的应用程序开发方面的投资在不断加大. Win 表单是一个新的窗体程序包,借助这一程序包,开发人员能够充分利用 Microsoft Windows操作系统所提供的丰富的用户界面功能,创建基于 Windows 的应用程序.Win Forms 是新的 Microsoft .NE

Dreamweaver 入门:创建基于表格的页面布局

dreamweaver|创建|页面 本文章介绍如何在 Macromedia Dreamweaver 8 中创建基于表格的页面布局.页面布局将确定您的页面在浏览器中会如何显示,例如,显示菜单.图像和 Macromedia Flash 内容将如何放置.表格是用于在 HTML 页上显示表格式数据以及对文本和图形进行布局的强有力的工具.您可以使用表格快速轻松地创建布局.在本教程中,您将在一个新的 Dreamweaver 文档中创建若干表格.这些表格的行和单元格实际上用作您将在以后添加的内容的"容器框&q

使用WebSphere Application Server Feature Pack for Web 2.0创建基于Ajax的

使用WebSphere Application Server Feature Pack for Web 2.0创建基于Ajax的动态Web应用程序 简介 与 Web 2.0 相关的技术,比如 Asynchronous JavaScript XML (Ajax).Web 远程和 Web 消息传递等,在当今的 Web 应用程序中变得日益流行.与传统 Web 应用程序相比,基于 Ajax 的应用程序 可以提供更好的响应性和交互性.在那些并入了 Ajax 架构的 Web 应用程序中 ,用户不需要等待整个

如何创建基于虚拟账号的邮件系统

按照如下图所以创建基于虚拟账号的邮件系统: 如上图所示:客户端登录邮件系统需要经过cyrus-sasl函数库账号的认证,但是cyrus-sasl无法调用mysql,所以必须安装courier-authlib来调用mysql. 发送邮件时使用dovecot来进行接收.extmail为用户提供web界面的方式来进行邮件的接收或发送.extman是为管理员提供管理的web界面. postfix默认无法支持mysql数据库,所以在此必须使用源码按安装postfix 修改主机名: [root@lyt ~]