2个项目可以引用同一个程序集的2个不同版本,一个来自GAC,另一个来自aap \ bin文件夹吗?

时间:2014-08-14 11:24:43

标签: .net .net-assembly gac

我的班级图书馆项目(8年前开发)需要Assembly A。虽然Assembly A名称很强,但开发人员会将它们保存在本地文件夹中并从那里引用,以便程序集始终位于应用程序的bin文件夹中。我想,这样做是为了摆脱一些部署问题。

我的班级图书馆项目由我们的一位客户使用。

较新版本的Assembly A已发布,我们客户的应用程序想要使用该版本。他们引用GAC的新版本;他们有自己的副本!现在,当他们使用最新版本时,他们会收到错误,因为我们引用的类库项目程序集需要较早版本的Assembly A

  1. 如何解决这个特殊问题?
  2. 如果我更改项目以开始从GAC引用Assembly A(当他们仍然使用本地副本时),客户端是否会面临同样的问题?
  3. 较新版本的Assembly A有一些重大变化。如果客户和我都开始使用GAC所需的程序集版本,我们的问题会解决吗?
  4. 如果有Assembly A的更新版本,如果是GAC,那么无论我们在两个项目中引用哪个版本,.NET都会从GAC加载吗?

2 个答案:

答案 0 :(得分:2)

GAC是一个部署详细信息,在您构建项目时涉及。每当CLR需要加载程序集并且它具有强名称时,它首先会在GAC中查找。该应用程序的探测路径接下来。当它存储在GAC中时,CLR可以匹配所需的版本。如果不是,则CLR一旦找到与程序集名称匹配就停止搜索探测路径中的目录。如果找到的程序集不是正确的版本,则为Kaboom。

由于您的客户希望将新版本存储在探测路径中,因此它们永远不会加载旧版本。他们必须因此将旧版本的程序集放在GAC中。它不是唯一可能出错的地方,如果您在库的公共方法中暴露程序集中的任何类型,它们就无法正确调用您的代码。

显然,通过更新您的库以使用新版本,您可以减轻他们的痛苦。

答案 1 :(得分:0)

  
      
  1. 如何解决这个特殊问题?
  2.   

为较新版本的Assembly A添加新的强名称。 (项目属性 - 签名 - 选择强名称密钥文件)

 2. Would client face the same issue if I change my project to start referencing Assembly A from GAC (when they still use their local copy) ? 

如果两个程序集都有自己的强名称,并且您使用特定版本“true”构建程序集,它将起作用...这就是我在下面的测试中所做的

 3. Newer version of `Assembly A` has some breaking changes. If client and I, both, start using required versions of the assembly from GAC, will our problem be solved? 

是的,需要两个不同的强名称。

 4. If there comes newer version of the `Assembly A` and if that goes to GAC, will .NET load the one from GAC regardless of the version we are referencing in both the projects?

是的,如果强名称相同,它将加载GAC中的那个。但是,您可以在GAC中添加所需的多个版本,但每个版本都需要它的强名称。

以下是我所做的:ClassLibrary使用强密钥编译并放入GAC。 LibraryThatUseAGacVersionOfClassLibrary引用它并使用它进行编译 enter image description here

然后我改变了ClassLibrary并给它一个新的强名称。解决方案重建/刷新之后就是我所拥有的: enter image description here

ClassLibrary汇编

namespace ClassLibrary
{
    public class Class1
    {
        public string TwoTwo { get; set; }//Was Toto in the old version
        public Class1()
        {
            TwoTwo = "TwoTwo from new Class1";
        }
    }
}

LibraryThatUseAGacVersionOfClassLibrary汇编

namespace LibraryThatUseAGacVersionOfClassLibrary
{
    public class UseGACAssembly
    {
        ClassLibrary.Class1 aaaa = new ClassLibrary.Class1();
        public UseGACAssembly()
        {
            aaaa.Toto = "Toto is in the GAC";//Is Toto in the GAC version
        }
        public string TotoFromSubClass { get { return aaaa.Toto; }  }
    }
}

同时使用

的项目
   public partial class Form1 : Form
    {
        public Form1()
        {
            LibraryThatUseAGacVersionOfClassLibrary.UseGACAssembly oldObject = new UseGACAssembly();
            ClassLibrary.Class1 newObject = new ClassLibrary.Class1();
            InitializeComponent();
            Console.WriteLine(oldObject.TotoFromSubClass);
            Console.WriteLine(newObject.TwoTwo);
        }
    }

对不起我的AWESOME命名约定。 ;)

汉斯是对的:如果可以......更新两个库以使用更新的参考文献。