首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

11.7  使用共享程序集

和使用私有程序集构建程序相比,使用共享程序集构建程序唯一不同在于如何在Visual Studio 2005中添加程序集引用。事实上,工具上没有任何改变(仍然使用Add Reference对话框),但是我们必须知道的是,该对话框不允许通过浏览GAC文件夹(Assembly文件夹)来添加对其中的共享程序集的引用。如图11-21所示,(在GAC文件夹)付出任何努力都将会是白费的,想要通过这种方式引用选中的程序集CarLibrary是不可能的。

11-21  不!在 Visual Studio 2005中,不可
能通过浏览Assembly文件夹来添加
对其中的共享程序集的引用

11-22  正确!在Visual Studio 2005中,必须到项目目录下的\Bin\Debug目录来引用该程序集

相反,我们需要浏览原来的CarLibrary项目目录下的\Bin\Debug目录来引用该程序集,如图11-22所示。

虽然这样有点烦琐,但还是让我们实践一下吧。创建一个新的C#控制台应用程序SharedCarLibClient,然后编写如下代码:

 

using CarLibrary;

 

namespace SharedCarLibClient

{

  class Program

  {

    static void Main(string[] args)

文本框:  
图11-23  Copy Local 属性可以强制Visual Studio 2005把程序集复制到你的客户应用程序目录下


    {

      SportsCar c = new SportsCar();

      c.TurboBoost();

      Console.ReadLine();

    }

  }

}

 

接着编译应用程序,使用Windows资源管理器查看含有SharedCarLibClient.exe文件的文件夹,会发现Visual Studio 2005并没有把CarLibrary.dll复制到客户应用程序的目录下。事情是这样的,当发现引用程序集的清单中含有.publickey值时,Visual Studio 2005就会假定这个具有强名称的程序集已被部署到GAC中,因此它将不会对该程序集进行复制工作。

当然,如果需要Visual Studio 2005把共享程序集复制到客户端应用程序目录下,我们可以在Solution Explorer下的References节点选择一个程序集,然后在相应的Properties窗口中把Copy Local属性设置为True(如图11-23所示)。

查看SharedCarLibClient程序集的清单

前面讲到过,在为一个程序集生成强名称时,整个公钥将会被记录到程序集的清单里面。而一个客户端应用程序引用一个强名称程序集时,.NET会把该程序集的公钥压缩成散列值,然后存放在客户端应用程序清单的.publickeytoken标签里。使用ildasm.exe查看SharedCarLibClient.exe的清单,将会看到以下内容:

 

.assembly extern CarLibrary

{

  .publickeytoken = (21 9E F3 80 C9 34 8A 38)

  .ver 1:0:0:0

}

 

如果把存放在客户端清单里的公钥标记值与GAC展示给你的公钥标记值相比较,会发现它们完全匹配。记得公钥作为强名称程序集标识的一部分。因此,CLR只会加载这样的CarLibrary程序集:版本号为1.0.0.0,公钥的散列值是219EF380C9348A38。如果CLRGAC中找不到一个程序集符合以上要求(同时在客户端应用程序目录下找不到同名的私有程序集),则会抛出FileNotFound异常。

源代码      SharedCarLibClient应用程序的源代码位于Chapter 11目录下。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论