1
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
        }
    }
}

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

那么,如何告诉 CLR 只加载我的程序集而不是其他具有相同名称的程序集呢?

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

4

3 回答 3

3

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

如果您引用一个强命名的程序集,那么您已经在唯一地标识您希望使用的程序集。如果您引用的程序集不是强命名的,则该程序集无法加载到 GAC 中(并且 .Net 运行时无论如何都不会检查那里,请参阅运行时如何定位程序集)。

如果您正在引用一个强命名的程序集(或者实际上是任何程序集)并且想要接受该程序集的多个不同版本(例如 v1.0.0.0 和 v1.0.1.0),或者您想要发布更新版本的组装并允许现有应用程序继续运行而无需重新编译,那么您可以使用Assembly Binding Redirection

如果您希望能够引用一个程序集,而不管使用什么密钥来签署该程序集,那么您最好根本不签署该程序集(因此不要将其添加到 GAC)。

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

于 2012-09-25T17:29:16.337 回答
1

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

于 2012-09-25T17:21:21.710 回答
0

程序集由其名称、公钥令牌和版本定义。创建参考时,您可以具体并指明这些值中的每一个。

于 2012-09-25T17:22:25.073 回答