如何让CLR知道要从GAC中选择哪个程序集


using System;
using System.Collections.Generic;
using System.Text;
using Shapes;
namespace ShapeUser
{
public class ShapeUser
{
public static void Main() 
{
Circle c = new Circle(1.0F);
Console.WriteLine("Area of Circle(1.0) is {0}", c.Area());
Console.ReadKey(); // press a key to exit program
}
}
}

该程序使用GAC中的Shapes程序集。如果只有一个程序集,那没关系。但是,GAC可能包含其他具有相同名称(但版本和密钥不同)的程序集。

那么,如何告诉CLR只加载我的程序集,而不加载其他同名程序集

我很困惑。我知道它受到公钥加密的保护,但我们仍然应该在访问它的程序中有一些私钥。请澄清我的困惑。

当您在GAC中引用程序集时,必须通过其强名称、名称、版本号、区域性(如果提供)的组合以及公钥和数字签名来引用它(程序集必须经过签名才能被视为强名称,并且只有强名称程序集才能添加到GAC)。

如果引用强命名程序集,则已经唯一标识了要使用的程序集。如果引用的程序集不是强名称的,则无法将该程序集加载到GAC中(.Net运行时也不会检查该程序集,请参阅运行时如何定位程序集)。

如果您引用的是强名称程序集(或者实际上是任何程序集),并且希望接受该程序集的多个不同版本(例如v1.0.0.0和v1.0.1.0),或者您希望发布程序集的新版本,并允许现有应用程序继续运行而无需重新编译,则可以使用程序集绑定重定向。

如果您希望能够引用程序集,而不管使用什么密钥对该程序集进行签名,那么最好不要对该程序集中进行签名(因此也不要将其添加到GAC)。

我相信您也可以订阅程序集解析事件,但是使用程序集绑定重定向是首选方法,只要它提供所需的行为即可。

编译时,可以指定要使用的确切版本。这是将在执行时加载的版本。如果您使用的是Visual Studio,则引用的"属性"将包含版本号,以及一个指示是否必须加载确切版本号的标志。

程序集由其名称、公钥标记和版本定义。创建引用时,可以是特定的,并指示其中的每个值。

最新更新