100162733.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 89 行
HTM
89 行
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
1.4 程序集
</title></head>
<body>
<div class="area">
<div class="col1">
<div class="lineBlue">
</div>
<!-- title -->
<div class="arcTitle">
<h1>
<a href="../16">
C#高级编程(第3版)【全文连载】
</a>
</h1>
<div style="text-align: center; font-size: 15px">
<a href="100162733.htm">
1.4 程序集
</a>
</div>
<div style="text-align: center; font-size: 15px">
<a class="url" href="../../default.htm">http://book.csdn.net/</a>
2006-8-17 16:57:00
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100162733.htm'><font color='red'>1.4 程序集</font></a></h1>
<div id="divRelateNode" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100162730.htm'>1.1 C#与.NET的关系</a></div><div style='float:right;width:49%'>·<a href='100162731.htm'>1.2 公共语言运行库</a></div><div style='float:left;width:49%'>·<a href='100162732.htm'>1.3 中间语言</a></div><div style='float:right;width:49%'>·<a href='100162734.htm'>1.5 .NET Framework类</a></div><div style='float:left;width:49%'>·<a href='100162735.htm'>1.6 用C#创建.NET应用程序</a></div><div style='float:right;width:49%'>·<a href='100162736.htm'>1.7 C#在.NET企业体系结构中的作用</a></div></div>
</div>
</div>
</div>
<!-- main -->
<div id="main">
<div id="text"> <link href="css.css" rel="stylesheet" type="text/css" /><p class="MsoNormal"><span style="FONT-FAMILY: 宋体">是包含编译好的、面向</span><span lang="EN-US">.NET Framework</span><span style="FONT-FAMILY: 宋体">的代码的逻辑单元。本章不详细论述程序集,而在第</span><span lang="EN-US">13</span><span style="FONT-FAMILY: 宋体">章中论述,下面概述其中的要点。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">程序集是完全自我描述性的,也是一个逻辑单元而不是物理单元,它可以存储在多个文件中</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">动态程序集的确存储在内存中,而不是存储在文件中</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。如果一个程序集存储在多个文件中,其中就会有一个包含入口点的主文件,该文件描述了程序集中的其他文件。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">注意可执行代码和库代码使用相同的程序集结构。惟一的区别是可执行的程序集包含一个主程序入口点,而库程序集则不包含。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">程序集的一个重要特性是它们包含的元数据描述了对应代码中定义的类型和方法。程序集也包含描述程序集本身的元数据,这种程序集元数据包含在一个称为程序集清单的区域中,可以检查程序集的版本及其完整性。</span></p>
<p class="a3" style="MARGIN-TOP: 8.15pt; TEXT-INDENT: 21.45pt"><span style="FONT-FAMILY: 黑体">注意:</span></p>
<p class="a1" style="MARGIN-BOTTOM: 8.15pt; TEXT-INDENT: 21.45pt"><span lang="EN-US">ildasm</span><span style="FONT-FAMILY: 楷体_GB2312">是一个基于</span><span lang="EN-US">Windows</span><span style="FONT-FAMILY: 楷体_GB2312">的实用程序,可以用于检查程序集的内容,包括程序集清单和元数据。第</span><span lang="EN-US">13</span><span style="FONT-FAMILY: 楷体_GB2312">章将介绍</span><span lang="EN-US">ildasm</span><span style="FONT-FAMILY: 楷体_GB2312">。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">程序集包含程序的元数据,表示调用给定程序集中的代码的应用程序或其他程序集不需要指定注册表或其他数据源,以便确定如何使用该程序集。这与以前的</span><span lang="EN-US">COM</span><span style="FONT-FAMILY: 宋体">有很大的不同,以前,组件的</span><span lang="EN-US">GUID</span><span style="FONT-FAMILY: 宋体">和接口必须从注册表中获取,在某些情况下,方法和属性的详细信息也需要从类型库中读取。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">把数据分散在</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个以上的不同位置上,可能会出现信息不同步的情况,从而妨碍其他软件成功地使用该组件。有了程序集后,就不会发生这种情况,因为所有的元数据都与程序的可执行指令存储在一起。注意,即使程序集存储在几个文件中,数据也不会出现不同步的问题。这是因为包含程序集入口的文件也存储了其他文件的细节、散列和内容,如果一个文件被替换,或者被塞满,系统肯定会检测出来,并拒绝加载程序集。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">程序集有两种类型:共享程序集和私有程序集。</span></p>
<h3 style="MARGIN: 8.15pt 0cm"><span lang="EN-US">1.4.1</span><span lang="EN-US"> </span><span style="FONT-FAMILY: 黑体">私有程序集</span></h3>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">系统可以保证,私有程序集不被其他软件使用,因为应用程序只能加载位于主执行文件所在文件夹或其子文件夹中的程序集。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">用户一般会希望把商用软件安装在它自己的目录下,这样软件包没有覆盖、修改或加载另一个软件包的私有程序集的风险。私有程序集只能用于自己的软件包,这样,用户对什么软件使用它们就有了更多的控制。因此,不需要采取安全措施,因为这没有其他商用软件用某个新版本的程序集覆盖原来的私有程序集的风险</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">但软件是专门执行怀有恶意的损害性操作的情况除外</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。名称也不会有冲突。如果私有程序集中的类正巧与另一个人的私有程序集中的类同名,是不会有问题的,因为给定的应用程序只能使用私有程序集的名称。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">因为私有程序集完全是自含式的,所以安装它的过程就很简单。只需把相应的文件放在文件系统的对应文件夹中即可</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">不需要注册表项</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">,这个过程称为“</span><span lang="EN-US">0</span><span style="FONT-FAMILY: 宋体">影响</span><span lang="EN-US">(xcopy)</span><span style="FONT-FAMILY: 宋体">安装”。</span></p>
<h3 style="MARGIN: 8.15pt 0cm"><span lang="EN-US">1.4.2</span><span lang="EN-US"> </span><span style="FONT-FAMILY: 黑体">共享程序集</span></h3>
<p class="MsoNormal"> </p>
<p class="1" style="MARGIN-LEFT: 37.55pt; TEXT-INDENT: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">名称冲突,另一个公司的共享程序集执行的类型与自己的共享程序集同名。因为客户机代码理论上可以同时访问这些程序集,所以这是一个严重的问题。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; TEXT-INDENT: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">程序集被同一个程序集的不同版本覆盖<span style="LETTER-SPACING: -0.5pt">——</span>新版本与某些已有的客户机代码不兼容。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这些问题的解决方法是把共享程序集放在文件系统的一个特定的子目录树中,称为全局程序集缓冲区</span><span lang="EN-US">(GAC)</span><span style="FONT-FAMILY: 宋体">。与私有程序集不同,不能简单地把共享程序集复制到对应的文件夹中,而需要专门安装到缓冲区中,这个过程可以用许多</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">工具来完成,其中包含对程序集的检查、在程序集缓冲区中设置一个小的文件夹层次结构,以确保程序集的完整性。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">为了避免名称冲突,共享程序集应根据私有密钥加密法指定一个名称</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">私有程序集只需要指定与其主文件名相同的名称即可</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。该名称称为强名</span><span lang="EN-US">(strong name)</span><span style="FONT-FAMILY: 宋体">,并保证其惟一性,它必须由要引用共享程序集的应用程序来引用。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">与覆盖程序集相关的问题,可以通过在程序集清单中指定版本信息来解决,也可以通过同时安装来解决。</span></p>
<h3 style="MARGIN: 8.15pt 0cm"><span lang="EN-US">1.4.3</span><span lang="EN-US"> </span><span style="FONT-FAMILY: 黑体">反射</span></h3>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">章详细介绍了它们。该技术很有趣,因为它表示托管代码实际上可以检查其他托管代码,甚至检查它自己,以确定该代码的信息。它们常常用于获取特性的详细信息,也可以把反射用于其他目的,例如作为实例化类或调用方法的一种间接方式,如果把方法上的类名指定为字符串,就可以选择类来实例化方法,以便在运行时调用,而不是在编译时调用,例如根据用户的输入来调用</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">动态绑定</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100162732.htm">上一页</a> <a href="index.html">首页</a> <a href="100162734.htm">下一页</a>
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100162733.htm'><font color='red'>1.4 程序集</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100162730.htm'>1.1 C#与.NET的关系</a></div><div style='float:right;width:49%'>·<a href='100162731.htm'>1.2 公共语言运行库</a></div><div style='float:left;width:49%'>·<a href='100162732.htm'>1.3 中间语言</a></div><div style='float:right;width:49%'>·<a href='100162734.htm'>1.5 .NET Framework类</a></div><div style='float:left;width:49%'>·<a href='100162735.htm'>1.6 用C#创建.NET应用程序</a></div><div style='float:right;width:49%'>·<a href='100162736.htm'>1.7 C#在.NET企业体系结构中的作用</a></div></div>
</div>
</div>
</div>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?