100165412.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 97 行 · 第 1/2 页

HTM
97
字号
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><span style="FONT-FAMILY: 宋体">强名由下述项目组成:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="ES">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">程序集本身的名称</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="ES">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">版本号。有了版本号,可以同时使用同一个程序集的不同版本。不同的版本可以同时存在,并可以同时加载到同一个进程上。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="ES">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">公钥保证强名称是独一无二的。它也保证引用的程序集不能被另一个源替代。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="ES">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">文化。详见第</span><span lang="ES">17</span><span style="FONT-FAMILY: 宋体">章。</span></p>
<p class="a3" style="MARGIN-TOP: 6.5pt; FTEL: 21.45pt"><span style="FONT-FAMILY: 黑体">注意:</span></p>
<p class="a1" style="FTEL: 21.45pt"><span style="FONT-FAMILY: 楷体_GB2312">共享程序集必须有一个强名称,来惟一地标识该程序集。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><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">&nbsp;&nbsp; </span><span style="FONT-FAMILY: 宋体">序集。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><span style="FONT-FAMILY: 宋体">但是,这个密钥不能用作信任密钥,程序集可以利用</span><span lang="EN-US">Authenticode </span><span style="FONT-FAMILY: 宋体">签名来建立信任关系。</span><span lang="EN-US">Authenticode </span><span style="FONT-FAMILY: 宋体">签名的密钥可以与强名称中使用的密钥不同。</span></p>
<p class="a3" style="MARGIN-TOP: 6.5pt; FTEL: 21.45pt"><span style="FONT-FAMILY: 黑体">注意:</span></p>
<p class="a1" style="FTEL: 21.45pt"><span style="FONT-FAMILY: 楷体_GB2312">从开发的角度来看,可以使用不同的公钥,以后也可以与真正的密钥进行互换。该特性将在&ldquo;程序集的延迟签名&rdquo;中介绍。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">为了惟一地标识公司中的程序集,应使用命名空间层次结构来给类命名。下面是一个组织命名空间的例子:</span><span lang="EN-US">Wrox Press </span><span style="FONT-FAMILY: 宋体">使用主命名空间</span><span lang="EN-US">Wrox </span><span style="FONT-FAMILY: 宋体">来标识其类和命名空间。在命名空间</span><span lang="EN-US">Wrox</span><span style="FONT-FAMILY: 宋体">下面的层次结构中,必须对命名空间进行组织,使所有的类都是惟一的。本书中的每一章都使用</span><span lang="EN-US">Wrox.ProCSharp.&lt;Chapter&gt;</span><span style="FONT-FAMILY: 宋体">形式的命名空间。本章使用</span><span lang="EN-US">Wrox.ProCSharp.Assembly</span><span style="FONT-FAMILY: 宋体">命名空间。这样,如果在某两章中都有类</span><span lang="EN-US">Hello</span><span style="FONT-FAMILY: 宋体">,也不会有名称冲突,因为它们在不同的命名空间中。可以在不同的书中使用的工具类则放在命名空间</span><span lang="EN-US">Wrox.Utilities</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></p>
<h4><span lang="ES">1. </span><span style="FONT-FAMILY: 黑体">公钥的加密</span></h4>
<p class="MsoNormal"><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></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">公钥</span><span lang="EN-US">/</span><span style="FONT-FAMILY: 宋体">私钥总是成对创建。公钥可以由任何人使用,甚至可以放在</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">站点上,但私钥必须安全地加锁。下面看看使用公钥和私钥的例子。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果</span><span lang="EN-US">Sarah</span><span style="FONT-FAMILY: 宋体">给</span><span lang="EN-US">Julian</span><span style="FONT-FAMILY: 宋体">发了一封电子邮件,</span><span lang="EN-US"> Sarah</span><span style="FONT-FAMILY: 宋体">希望能保证除了</span><span lang="EN-US">Julian</span><span style="FONT-FAMILY: 宋体">外,其他人都不能阅读该邮件,所以使用</span><span lang="EN-US">Julian </span><span style="FONT-FAMILY: 宋体">的公钥。信息是使用</span><span lang="EN-US">Julian </span><span style="FONT-FAMILY: 宋体">的公钥加密的。</span><span lang="EN-US">Julian </span><span style="FONT-FAMILY: 宋体">打开该邮件,并使用他秘密存储的私钥解密。这种方式可以保证除了</span><span lang="EN-US">Julian</span><span style="FONT-FAMILY: 宋体">外,其他人都不能阅读</span><span lang="EN-US">Sarah</span><span style="FONT-FAMILY: 宋体">的邮件。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">但这还有一个问题:</span><span lang="EN-US">Julian </span><span style="FONT-FAMILY: 宋体">不能确保邮件是</span><span lang="EN-US">Sarah </span><span style="FONT-FAMILY: 宋体">发送来的。任何人都可以使用</span><span lang="EN-US">Julian </span><span style="FONT-FAMILY: 宋体">的公钥加密发送给</span><span lang="EN-US">Julian </span><span style="FONT-FAMILY: 宋体">的邮件。我们把这个规则扩展一下。下面再次从</span><span lang="EN-US">Sarah</span><span style="FONT-FAMILY: 宋体">给</span><span lang="EN-US">Julian</span><span style="FONT-FAMILY: 宋体">发电子邮件开始。在</span><span lang="EN-US">Sarah </span><span style="FONT-FAMILY: 宋体">使用</span><span lang="EN-US">Julian </span><span style="FONT-FAMILY: 宋体">的公钥加密邮件之前,她添加了自己的签名,再使用自己的私钥加密该签名。然后使用</span><span lang="EN-US">Julian </span><span style="FONT-FAMILY: 宋体">的公钥加密邮件。这样就保证了除</span><span lang="EN-US">Julian</span><span style="FONT-FAMILY: 宋体">外,其他人都不能阅读该邮件。在</span><span lang="EN-US">Julian </span><span style="FONT-FAMILY: 宋体">解密邮件时,检测到一个加密的签名。这个签名可以使用</span><span lang="EN-US">Sarah </span><span style="FONT-FAMILY: 宋体">的公钥来解密。而</span><span lang="EN-US">Julian </span><span style="FONT-FAMILY: 宋体">则可以访问</span><span lang="EN-US">Sarah </span><span style="FONT-FAMILY: 宋体">的公钥,因为这个密钥是公钥。在解密了签名后,</span><span lang="EN-US">Julian </span><span style="FONT-FAMILY: 宋体">就可以确定是</span><span lang="EN-US">Sarah </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></p>
<h4><span lang="ES">2. </span><span style="FONT-FAMILY: 黑体">使用强名称获得完整性</span></h4>
<p class="MsoNormal"><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">8</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">A</span><span style="FONT-FAMILY: 宋体">创建了一个组件</span><span lang="EN-US">Math</span><span style="FONT-FAMILY: 宋体">,在客户机上引用该组件,黑客的组件就无法替代它。只有私钥的主人才能用新版本替换原来的共享组件。因此保证了其完整性,共享程序集会得到期望的发布器。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">13-30</span><span style="FONT-FAMILY: 宋体">显示了一个共享组件,它的公钥由客户机程序集引用,该程序集在其清单中包含共享程序集的公钥标记。</span></p>
<p align="center"><span lang="EN-US"><img height="121" src="13/image040.gif" width="312" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-30</span></p></div>
                <!-- page -->
                <div class="page" style="text-align: center">
                    <a href="100165411.htm">上一页</a>&nbsp;&nbsp;&nbsp;<a href="index.html">首页</a>&nbsp;&nbsp;&nbsp;<a href="100165413.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='100165412.htm'><font color='red'>13.5.1  共享程序集名</font></a></h1>
                        <div id="divRealteNod2" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165409.htm'>13.4.2  全局程序集缓存查看器</a></div><div style='float:right;width:49%'>·<a href='100165410.htm'>13.4.3  全局程序集缓存工具(gacutil.exe)</a></div><div style='float:left;width:49%'>·<a href='100165411.htm'>13.5  创建共享程序集</a></div><div style='float:right;width:49%'>·<a href='100165413.htm'>13.5.2  创建共享程序集</a></div><div style='float:left;width:49%'>·<a href='100165414.htm'>13.6  配置</a></div><div style='float:right;width:49%'>·<a href='100165415.htm'>13.6.1  配置类别</a></div></div>
                    </div>
                </div>
                </div></div>
   
</body>
</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?