11.7 使用共享程序集
和使用私有程序集构建程序相比,使用共享程序集构建程序唯一不同在于如何在Visual Studio 2005中添加程序集引用。事实上,工具上没有任何改变(仍然使用Add Reference对话框),但是我们必须知道的是,该对话框不允许通过浏览GAC文件夹(Assembly文件夹)来添加对其中的共享程序集的引用。如图11-21所示,(在GAC文件夹)付出任何努力都将会是白费的,想要通过这种方式引用选中的程序集CarLibrary是不可能的。
|
|
|
|
图11-21 不!在 Visual
Studio 2005中,不可 |
图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)
{
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。如果CLR在GAC中找不到一个程序集符合以上要求(同时在客户端应用程序目录下找不到同名的私有程序集),则会抛出FileNotFound异常。
源代码 SharedCarLibClient应用程序的源代码位于Chapter 11子目录下。








