100165413.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 175 行 · 第 1/2 页
HTM
175 行
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在重新建立该文件后</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">使用</span><span lang="ES">ildasm</span><span style="FONT-FAMILY: 宋体">查看该程序集</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">则该程序集的清单中应有一个公钥</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">如图</span><span lang="ES">13-31</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 style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">就可以使用全局程序集缓存工具</span><span lang="ES">gacutil</span><span style="FONT-FAMILY: 宋体">及其</span><span lang="ES">/I</span><span style="FONT-FAMILY: 宋体">选项把它安装到全局程序集缓存中</span><span style="FONT-FAMILY: 宋体">:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 8.15pt"><strong><span lang="EN-US">gacutil /i SharedDemo.dll</span></strong></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">可以使用全局程序集缓存查看器检查共享程序集的版本,看看它是否安装成功。</span></p>
<p align="center"><span lang="EN-US"><img height="228" src="13/image041.jpg" width="373" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US"> 13-31</span></p>
<h4><span lang="ES">3. </span><span style="FONT-FAMILY: 黑体">使用共享程序集</span></h4>
<p class="MsoNormal" style="LINE-HEIGHT: 18pt"><span style="FONT-FAMILY: 宋体">要使用共享程序集,应创建一个</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">控制台应用程序</span><span lang="EN-US">Client</span><span style="FONT-FAMILY: 宋体">,不是把新项目添加到原来的解决方案中,而是创建一个新的解决方案,这样在重新建立客户时,就不会重新建立该共享程序集了。把命名空间改为</span><span lang="EN-US">Wrox.ProCSharp.Assemblies.Sharing</span><span style="FONT-FAMILY: 宋体">,类名改为</span><span lang="EN-US">Client</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 18pt"><span style="FONT-FAMILY: 宋体">以引用私有程序集方式引用程序集</span><span lang="EN-US">SimpleShared.dll</span><span style="FONT-FAMILY: 宋体">:使用菜单</span><span lang="EN-US">Project | Add Reference </span><span style="FONT-FAMILY: 宋体">,或者使用</span><span lang="EN-US">Solution Explorer </span><span style="FONT-FAMILY: 宋体">中的上下文菜单。然后选择</span><span lang="EN-US">Browse</span><span style="FONT-FAMILY: 宋体">按钮查找程序集</span><span lang="EN-US">SimpleShared.dll</span><span style="FONT-FAMILY: 宋体">,把它添加到引用中。</span></p>
<p class="a3" style="MARGIN-TOP: 8.15pt; FTEL: 21.45pt"><span style="FONT-FAMILY: 黑体">注意:</span></p>
<p class="a1" style="FTEL: 21.45pt"><span style="FONT-FAMILY: 楷体_GB2312">有了共享程序集,引用属性</span><span lang="EN-US">CopyLocal</span><span style="FONT-FAMILY: 楷体_GB2312">就可以设置为</span><span lang="EN-US">false</span><span style="FONT-FAMILY: 楷体_GB2312">,这样,共享程序集就不会复制到输出文件的目录下,而会从全局程序集缓存中加载。</span></p>
<p class="MsoToc1" style="LINE-HEIGHT: 18pt"><span style="FONT-FAMILY: 宋体">下面是客户机应用程序的代码:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt"><span lang="EN-US">using System;</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="EN-US">namespace Wrox.ProCSharp.Assemblies.Sharing</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES">{</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> class Client</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> {</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> [STAThread]</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> static void Main(string[] args)</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> {</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> SharedDemo quotes = new SharedDemo(</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> @"C:\ProCSharp\Assemblies\Quotes.txt");</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> for (int i=0; i < 3; i++)</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> {</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> Console.WriteLine(quotes.GetQuoteOfTheDay());</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> Console.WriteLine();</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> }</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> }</span></p>
<p class="2" style="LINE-HEIGHT: 15pt"><span lang="ES"> }</span></p>
<p class="2" style="FTEL: 8.15pt"><span lang="ES">}</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 18pt"><span style="FONT-FAMILY: 宋体">在使用</span><span lang="ES">ILDASM</span><span style="FONT-FAMILY: 宋体">查看客户程序集的清单时</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">可以看到对共享程序集</span><span lang="ES">SharedDemo:.assembly extern SimpleShared</span><span style="FONT-FAMILY: 宋体">的引用</span><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">13-32</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="208" src="13/image042.jpg" width="434" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US"> 13-32</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">公钥的标记也可以使用强名称工具</span><span lang="EN-US">sn</span><span style="FONT-FAMILY: 宋体">在共享程序集中查看:</span><span lang="EN-US">sn –T</span><span style="FONT-FAMILY: 宋体">会显示程序集中的公钥标记,</span><span lang="EN-US">sn –Tp</span><span style="FONT-FAMILY: 宋体">显示标记和公钥。注意使用大写字母</span><span lang="EN-US">T</span><span style="FONT-FAMILY: 宋体">!</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">该程序引用了示例文件,其结果如图</span><span lang="EN-US">13-33</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="85" src="13/image043.jpg" width="311" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US"> 13-33</span></p>
<h4><a ftel="_Toc507815146"><span lang="ES">4. </span></a><span style="FONT-FAMILY: 黑体">程序集的延迟签名</span></h4>
<p class="MsoNormal"><a ftel="delayed1"></a><a ftel="AssemblyDelaySign1"><span style="FONT-FAMILY: 宋体">公司的私钥应安全存储。大多数公司都不允许所有的开发人员访问私钥。只有几<span style="LETTER-SPACING: -0.1pt">个有安全权限的人才能访问它。这就是为什么程序集的签名可以以后</span></span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">(</span></a><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">例如在发布之前</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">)</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">添加的原因。在全局程序集属性</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">AssemblyDelaySign</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">设置为</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">true</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">时,签名就不会存储在程序集中,但保留了足够的空间,以便以后添加。但是,不使用密钥,就不能测试程序集,在全局程序集缓存中安装它。但是可以使用临时密钥进行测试,以后再用真正的公司密钥代替这个临时密钥。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">程序集的延迟签名需要执行下面的步骤:</span></p>
<p class="MsoNormal"><span lang="EN-US">(1) </span><span style="FONT-FAMILY: 宋体">首先必须用强名称工具</span><span lang="EN-US">sn</span><span style="FONT-FAMILY: 宋体">创建一个公共</span><span lang="EN-US">/</span><span style="FONT-FAMILY: 宋体">私钥对,生成的文件</span><span lang="EN-US">mykey.snk</span><span style="FONT-FAMILY: 宋体">包含公共和</span><span lang="EN-US"> </span><span style="FONT-FAMILY: 宋体">私钥。</span></p>
<p class="a6" style="MARGIN-TOP: 4.9pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 4.9pt"><strong><span lang="EN-US">sn –k mykey.snk</span></strong></p>
<p class="MsoNormal"><span lang="EN-US">(2) </span><span style="FONT-FAMILY: 宋体">接着可以提取公钥,使之可以用于开发人员。选项</span><span lang="EN-US">-p</span><span style="FONT-FAMILY: 宋体">提取密钥文件的公钥。文件</span><span lang="EN-US">mypublickey.snk</span><span style="FONT-FAMILY: 宋体">仅包含公钥。</span></p>
<p class="a6" style="MARGIN-TOP: 6.5pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 6.5pt"><strong><span lang="EN-US">sn –p mykey.snk mypublickey.snk</span></strong></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">公司中的所有开发人员都可以使用这个密钥文件</span><span lang="EN-US">mypublickey.snk</span><span style="FONT-FAMILY: 宋体">,在文件</span><span lang="EN-US">AssemblyInfo.cs</span><span style="FONT-FAMILY: 宋体">中设置</span><span lang="EN-US">AssemblyDelaySign </span><span style="FONT-FAMILY: 宋体">和</span> <span lang="EN-US">AssemblyKeyFile</span><span style="FONT-FAMILY: 宋体">属性:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt"><a ftel="AssemblyKeyFile2"><span lang="EN-US">[assembly: AssemblyDelaySign</span></a><span lang="EN-US">(<span style="COLOR: black">true)</span>]</span></p>
<p class="2" style="FTEL: 8.15pt"><span lang="EN-US">[assembly: AssemblyKeyFile</span><span lang="EN-US">("../../mypublickey.snk")]</span></p>
<p class="MsoNormal"><span lang="EN-US">(3) </span><span style="FONT-FAMILY: 宋体">关闭签名的验证功能,因为程序集没有包含签名。</span></p>
<p class="a6" style="MARGIN-TOP: 6.5pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 6.5pt"><strong><span lang="EN-US">sn –Vr ShareDemo.dll</span></strong></p>
<p class="MsoNormal"><span lang="EN-US">(4) </span><span style="FONT-FAMILY: 宋体">在发布之前,程序集可以用</span><span lang="EN-US">sn</span><span style="FONT-FAMILY: 宋体">工具重新签名。</span><span lang="EN-US">–R</span><span style="FONT-FAMILY: 宋体">选项用于对以前已签名或延迟签名的程序集进行重新签名。</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt"><strong><span lang="EN-US">sn –R MyAssembly.dll mykey.snk</span></strong></p>
<p class="a3" style="MARGIN-TOP: 8.15pt; FTEL: 21.45pt"><span style="FONT-FAMILY: 黑体">注意:</span></p>
<p class="a1" style="FTEL: 21.45pt"><span style="FONT-FAMILY: 楷体_GB2312">签名的验证功能只能在开发过程中关闭。不经过验证是不能发布程序集的,因为这个程序集可能被怀有恶意的程序集替代。</span></p>
<h4><span lang="ES">5. </span><span style="FONT-FAMILY: 黑体">引用</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">图</span><span lang="ES">13-29</span><span style="FONT-FAMILY: 宋体">所示的属性对话框还列出了引用总数。这个引用总数表示:如果应用程序仍需要引用,被缓存的程序集就不能删除。例如,如果</span><span lang="ES">Microsoft</span><span style="FONT-FAMILY: 宋体">安装程序包</span><span lang="ES">(MSI</span><span style="FONT-FAMILY: 宋体">文件</span><span lang="ES">)</span><span style="FONT-FAMILY: 宋体">安装了一个共享程序集,就只能在卸载应用程序时删除它,而不能从全局程序集缓存中删除它。从全局程序集缓存中删除程序集会得到一个错误消息:“程序集</span><span lang="ES"><name></span><span style="FONT-FAMILY: 宋体">不能卸载,因为其他应用程序还需要它。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">使用</span><span lang="ES">gacutil</span><span style="FONT-FAMILY: 宋体">工具的选项</span><span lang="ES">/r</span><span style="FONT-FAMILY: 宋体">可以设置程序集的引用。该选项需要一个引用类型、一个引用</span><span lang="ES">ID</span><span style="FONT-FAMILY: 宋体">和描述。引用的类型可以是下面</span><span lang="ES">3</span><span style="FONT-FAMILY: 宋体">个选项中的一个:</span><span lang="ES">UNINSTALL_KEY</span><span style="FONT-FAMILY: 宋体">、</span><span lang="ES">FILEPATH</span><span style="FONT-FAMILY: 宋体">和</span><span lang="ES">OPAQUE</span><span style="FONT-FAMILY: 宋体">。</span><span lang="ES">UNINSTALL_KEY</span><span style="FONT-FAMILY: 宋体">由</span><span lang="ES">MSI</span><span style="FONT-FAMILY: 宋体">使用,定义一个卸载时也需要的注册键。</span><span lang="ES">FILEPATH</span><span style="FONT-FAMILY: 宋体">可以指定一个目录,应用程序的任一目录均有效。</span><span lang="ES">OPAQUE</span><span style="FONT-FAMILY: 宋体">引用类型允许设置引用的任意类型。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">命令行:</span></p>
<p class="a6" style="MARGIN-TOP: 6.5pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 6.5pt"><strong><span lang="EN-US">gacutil /i shareddemo.dll /r FILEPATH c:\ProCSharp\Assemblies\Client "Shared Demo"</span></strong></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">通过对客户应用程序目录的引用,在全局程序集缓存中安装程序集。这个程序集的另一个版本可以使用另一个目录安装,或使用</span><span lang="ES">OPAQUE</span><span style="FONT-FAMILY: 宋体">安装,如下面的命令行:</span></p>
<p class="a6" style="MARGIN-TOP: 6.5pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 6.5pt"><strong><span lang="EN-US">gacutil /i shareddemo.dll OPAQUE 4711 "Opaque installation"</span></strong></p>
<p class="MsoBodyTextIndent" style="LINE-HEIGHT: 16.6pt"><span style="FONT-FAMILY: 宋体">现在全局程序集缓存中只有一个程序集,但有两个引用。为了从全局程序集缓存中删除程序集,必须删除这两个引用:</span></p>
<p class="a6" style="MARGIN-TOP: 6.5pt"><strong><span lang="EN-US">gacutil /u shareddemo OPAQUE 4711"Opaque installation"</span></strong></p>
<p class="a6" style="MARGIN-TOP: 6.5pt"><strong><span lang="EN-US">gacutil /u shareddemo FILEPATH c:\ProCSharp\Assemblies\Client "Shared Demo"</span></strong></p>
<p class="a3" style="MARGIN-TOP: 8.15pt; FTEL: 21.45pt"><span style="FONT-FAMILY: 黑体">注意:</span></p>
<p class="a1" style="FTEL: 21.45pt"><span style="FONT-FAMILY: 楷体_GB2312">第</span><span lang="ES">18</span><span style="FONT-FAMILY: 楷体_GB2312">章将介绍程序集的部署,在</span><span lang="ES">MSI</span><span style="FONT-FAMILY: 楷体_GB2312">包中要处理引用总数。</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165412.htm">上一页</a> <a href="index.html">首页</a> <a href="100165414.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='100165413.htm'><font color='red'>13.5.2 创建共享程序集</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165410.htm'>13.4.3 全局程序集缓存工具(gacutil.exe)</a></div><div style='float:right;width:49%'>·<a href='100165411.htm'>13.5 创建共享程序集</a></div><div style='float:left;width:49%'>·<a href='100165412.htm'>13.5.1 共享程序集名</a></div><div style='float:right;width:49%'>·<a href='100165414.htm'>13.6 配置</a></div><div style='float:left;width:49%'>·<a href='100165415.htm'>13.6.1 配置类别</a></div><div style='float:right;width:49%'>·<a href='100165416.htm'>13.6.2 版本问题</a></div></div>
</div>
</div>
</div></div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?