100165416.htm

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

HTM
215
字号
<p class="a6" style="MARGIN-TOP: 8.15pt"><span lang="EN-US">static void Main(string[] args)</span></p>
<p class="a6"><span lang="EN-US">{</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp; SharedDemo quotes = new SharedDemo (@&quot;C:\ProCSharp\Assemblies\Quotes.txt&quot;);</span></p>
<p class="2" style="FTEL: 8.15pt"><span lang="EN-US">&nbsp;&nbsp; Console.WriteLine(quotes.GetAssemblyFullName());</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">使用</span><span lang="ES" style="LETTER-SPACING: 0.1pt">gacutil</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">在全局程序集缓存中再次注册共享程序集</span><span lang="ES">SharedDemo</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">的新版本。如果没有找到引用的版本</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">,就</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">会抛出一个异常</span><span lang="ES" style="LETTER-SPACING: 0.1pt">System.IO.FileLoadException</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">,因为</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">对正确程序集的绑定失败了。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">成功运行后,可以看到引用的程序集的完整名称,如图</span><span lang="EN-US">13-34</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="60" src="13/image044.jpg" width="366" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-34</span></p>
<p class="MsoToc1"><span style="FONT-FAMILY: 宋体">使用这个客户程序,可以试试执行这个共享组件的不同配置。</span></p>
<h4><span lang="ES">3. </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">1.1</span><span style="FONT-FAMILY: 宋体">来</span><span style="FONT-FAMILY: 宋体">创建共享程序集</span><span lang="ES">SharedDemo</span><span style="FONT-FAMILY: 宋体">的一个新版本。我们不想重新建立客户程序,只想在现有的客户程序中使用程序集的新版本。这适用于下述场合:共享程序集有一个错误需要修改,或者因为新版本是兼容的,所以要删除旧版本。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">使用全局程序集缓存查看器,则可以看到</span><span lang="ES">SharedDemo</span><span style="FONT-FAMILY: 宋体">程序集安装了</span><span lang="EN-US">1.0.1318.24054</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">1.0.1330.27544</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">1.1.1330.27636</span><span style="FONT-FAMILY: 宋体">版本,如图</span><span lang="EN-US">13-35</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="180" src="13/image045.jpg" width="388" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-35</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">客户应用程序的清单说明,客户程序引用了程序集</span><span lang="ES">SharedDemo</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">1.0.1330.27763</span><span style="FONT-FAMILY: 宋体">版本,如图</span><span lang="EN-US">13-36</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="178" src="13/image046.jpg" width="442" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-36</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">现在需要使用应用程序配置文件。不需要直接使用</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">来处理,</span><span lang="EN-US">.NET Framework</span><span style="FONT-FAMILY: 宋体">配置工具</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">如图</span><span lang="EN-US">13-37</span><span style="FONT-FAMILY: 宋体">所示</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">可以创建应用程序和机器配置文件。该工具是一个</span><span lang="EN-US">MMC</span><span style="FONT-FAMILY: 宋体">管理单元,可以在控制面板的&ldquo;管理工具&rdquo;中启动。</span></p>
<p align="center"><span lang="EN-US"><img height="298" src="13/image047.jpg" width="404" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-37</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在左边选择</span><span lang="EN-US">Applications</span><span style="FONT-FAMILY: 宋体">,然后选择菜单</span><span lang="EN-US">Action | Add...</span><span style="FONT-FAMILY: 宋体">,就可以显示在该计算机上以前启动的所有</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">应用程序。我们可以选择</span><span lang="EN-US">Client.exe</span><span style="FONT-FAMILY: 宋体">应用程序,为该应用程序创建一个应用程序配置文件。在给</span><span lang="EN-US">.NET Admin </span><span style="FONT-FAMILY: 宋体">工具添加了客户应用程序后,就可以查看程序集的从属文件,如图</span><span lang="EN-US">13-38</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="147" src="13/image048.jpg" width="404" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-38</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">选择</span><span lang="EN-US">Configured Assemblies</span><span style="FONT-FAMILY: 宋体">和菜单</span><span lang="EN-US">Action | Add...</span><span style="FONT-FAMILY: 宋体">,就可以在从属文件列表中配置程序集</span><span lang="EN-US">SharedDemo</span><span style="FONT-FAMILY: 宋体">的从属文件,如图</span><span lang="EN-US">13-39</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">使用</span><span lang="EN-US">Requested Version</span><span style="FONT-FAMILY: 宋体">可以指定客户程序集的清单中引用的版本。</span><span lang="EN-US">New Version</span><span style="FONT-FAMILY: 宋体">指定共享程序集的新版本。在图</span><span lang="EN-US">13-39</span><span style="FONT-FAMILY: 宋体">中,我们指定应使用版本</span><span lang="EN-US">1.1.1330.27636</span><span style="FONT-FAMILY: 宋体">,而不是使用</span><span lang="EN-US">1.0.0.0</span><span style="FONT-FAMILY: 宋体">到</span><span lang="EN-US"> 1.0.999.99999</span><span style="FONT-FAMILY: 宋体">之间的某个版本。</span></p>
<p align="center"><span lang="EN-US"><img height="307" src="13/image049.jpg" width="277" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-39</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">现在,在</span><span lang="EN-US">Client.exe </span><span style="FONT-FAMILY: 宋体">应用程序所在的目录下有一个应用程序配置文件</span><span lang="EN-US">Client.exe.config</span><span style="FONT-FAMILY: 宋体">,其中包含</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">代码:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt"><span lang="EN-US">&lt;?xml version=&quot;1.0&quot;?&gt;</span></p>
<p class="2"><span lang="EN-US">&lt;configuration&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp; &lt;runtime&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;assemblyBinding xmlns=&quot;urn:schemas-microsoft-com:asm.v1&quot;&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependentAssembly&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;assemblyIdentity FTEL=&quot;SharedDemo&quot;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; publicKeyToken=&quot;be9f9ce7b9a0a62f&quot; /&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bindingRedirect oldVersion=&quot;1.0.0.0-1.0.999.99999&quot; </span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newVersion=&quot;1.1.1330.27636&quot; /&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependentAssembly&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/assemblyBinding&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp; &lt;/runtime&gt;</span></p>
<p class="2" style="FTEL: 8.15pt"><span lang="EN-US">&lt;/configuration&gt;</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">使用</span><span lang="EN-US">&lt;runtime&gt;</span><span style="FONT-FAMILY: 宋体">元素配置运行设置,</span><span lang="EN-US">&lt;runtime&gt;</span><span style="FONT-FAMILY: 宋体">的子元素是</span><span lang="EN-US">&lt;assemblyBinding&gt;</span><span style="FONT-FAMILY: 宋体">,</span><span lang="EN-US">&lt;assemblyBinding&gt;</span><span style="FONT-FAMILY: 宋体">的子元素是</span><span lang="EN-US">&lt;dependentAssembly&gt;</span><span style="FONT-FAMILY: 宋体">。</span><span lang="EN-US">&lt;dependentAssembly&gt;</span><span style="FONT-FAMILY: 宋体">有一个必需的子元素</span><span lang="EN-US">&lt;assemblyIdentity&gt;</span><span style="FONT-FAMILY: 宋体">,使用该元素可以指定引用的程序集名称。</span><span lang="EN-US">Name</span><span style="FONT-FAMILY: 宋体">是</span><span lang="EN-US">&lt;assemblyIdentity&gt;</span><span style="FONT-FAMILY: 宋体">惟一的一个必选属性。其可选属性是</span><span lang="EN-US">publicKeyToken </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> culture</span><span style="FONT-FAMILY: 宋体">。</span><span lang="EN-US">&lt;dependentAssembly&gt;</span><span style="FONT-FAMILY: 宋体">用于版本重新定向的另一个子元素是</span><span lang="EN-US">&lt;bindingRedirect&gt;</span><span style="FONT-FAMILY: 宋体">,使用该元素可以指定从属程序集的新旧版本。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">用这个配置文件启动客户程序,会得到引用的共享程序集的新版本。</span></p>
<h4><span lang="ES">4. </span><span style="FONT-FAMILY: 黑体">发布者的策略文件</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果</span><span lang="EN-US" style="BACKGROUND: aqua"><a ftel="publisher1"></a></span><span style="FONT-FAMILY: 宋体">使用在全局程序集缓存器中共享的程序集</span><span style="FONT-FAMILY: 宋体">,</span><span style="FONT-FAMILY: 宋体">就可以使用发布者</span><span lang="ES">(publisher)</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></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">要建立发布者的策略,必须:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<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="EN-US">●<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="EN-US">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">把发布者的策略程序集添加到全局程序集缓存器中</span></p>
<p class="MsoNormal"><span lang="EN-US">(1) </span><span style="FONT-FAMILY: 宋体">创建发布人的策略文件</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">发布者的策略文件是一个把现有版本或某个版本范围重新定向到新版本的</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文件。其使用的语法与应用程序配置文件相同,所以可以使用前面创建的同一个文件,把旧版本</span><span lang="EN-US">1.0.0.0-1.0.999.99999</span><span style="FONT-FAMILY: 宋体">重新定向到新版本</span><span lang="EN-US">1.1.1330.27636</span><span style="FONT-FAMILY: 宋体">上。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">把前面创建的文件重新命名为</span><span lang="EN-US">mypolicy.config</span><span style="FONT-FAMILY: 宋体">,把它用作发布人的策略文件。</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt"><span lang="EN-US">&lt;?xml version=&quot;1.0&quot;?&gt;</span></p>
<p class="2"><span lang="EN-US">&lt;configuration&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp; &lt;runtime&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;assemblyBinding xmlns=&quot;urn:schemas-microsoft-com:asm.v1&quot;&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependentAssembly&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;assemblyIdentity FTEL=&quot;SharedDemo&quot;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; publicKeyToken=&quot;be9f9ce7b9a0a62f&quot; /&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bindingRedirect oldVersion=&quot;1.0.0.0-1.0.999.99999&quot; </span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newVersion=&quot;1.1.1330.27636&quot; /&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependentAssembly&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/assemblyBinding&gt;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp; &lt;/runtime&gt;</span></p>
<p class="2" style="FTEL: 8.15pt"><span lang="EN-US">&lt;/configuration&gt;</span></p>
<p class="MsoNormal"><span lang="EN-US">(2) </span><span style="FONT-FAMILY: 宋体">创建发布人的策略程序集</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">要把发布人的策略文件与共享程序集关联起来,必须创建一个可以放到全局程序集缓存器中的发布人策略程序集。可以创建这种文件的工具是程序集连接程序</span><span lang="EN-US">al</span><span style="FONT-FAMILY: 宋体">。选项</span><span lang="EN-US">/linkresource</span><span style="FONT-FAMILY: 宋体">把发布人的策略文件添加到生成的程序集中。生成的程序集名称必须以</span><span lang="EN-US">policy</span><span style="FONT-FAMILY: 宋体">开头,其后是应重新定向的程序集的主次版本号,以及共享程序集的文件名。在本例中,发布人策略程序集必须命名为</span><span lang="EN-US">policy.1.0.SharedDemo.dll</span><span style="FONT-FAMILY: 宋体">,才能重新定向主版本号为</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体">、次版本号为</span><span lang="EN-US">0</span><span style="FONT-FAMILY: 宋体">的程序集</span><span lang="EN-US">SharedDemo</span><span style="FONT-FAMILY: 宋体">。必须用</span><span lang="EN-US">/keyfile</span><span style="FONT-FAMILY: 宋体">选项把一个主要密钥添加到这个发布人主要密钥上,新加的这个主要密钥与用于标识共享程序集</span><span lang="EN-US">SharedDemo</span><span style="FONT-FAMILY: 宋体">的主要密钥相同,这样才能保证该版本从同一个发布人处重新定向。</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt"><strong><span lang="EN-US">al /linkresource:mypolicy.config /out:policy.1.0. SharedDemo.dll</span></strong></p>
<p class="a6" style="FTEL: 8.15pt"><strong><span lang="EN-US">/keyfile:..\..\mykey.snk</span></strong></p>
<p class="MsoNormal"><span lang="EN-US">(3) </span><span style="FONT-FAMILY: 宋体">将发布人的策略程序集添加到全局程序集缓存中</span></p>

⌨️ 快捷键说明

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