我的班级图书馆项目(8年前开发)需要Assembly A
。虽然Assembly A
名称很强,但开发人员会将它们保存在本地文件夹中并从那里引用,以便程序集始终位于应用程序的bin
文件夹中。我想,这样做是为了摆脱一些部署问题。
我的班级图书馆项目由我们的一位客户使用。
较新版本的Assembly A
已发布,我们客户的应用程序想要使用该版本。他们不引用GAC的新版本;他们有自己的副本!现在,当他们使用最新版本时,他们会收到错误,因为我们引用的类库项目程序集需要较早版本的Assembly A
。
Assembly A
(当他们仍然使用本地副本时),客户端是否会面临同样的问题? Assembly A
有一些重大变化。如果客户和我都开始使用GAC所需的程序集版本,我们的问题会解决吗?Assembly A
的更新版本,如果是GAC,那么无论我们在两个项目中引用哪个版本,.NET都会从GAC加载吗?答案 0 :(得分:2)
GAC是一个部署详细信息,在您构建项目时涉及不。每当CLR需要加载程序集并且它具有强名称时,它首先会在GAC中查找。该应用程序的探测路径接下来。当它存储在GAC中时,CLR可以匹配所需的版本。如果不是,则CLR一旦找到与程序集名称匹配就停止搜索探测路径中的目录。如果找到的程序集不是正确的版本,则为Kaboom。
由于您的客户希望将新版本存储在探测路径中,因此它们永远不会加载旧版本。他们必须因此将旧版本的程序集放在GAC中。它不是唯一可能出错的地方,如果您在库的公共方法中暴露程序集中的任何类型,它们就无法正确调用您的代码。
显然,通过更新您的库以使用新版本,您可以减轻他们的痛苦。
答案 1 :(得分:0)
- 如何解决这个特殊问题?
醇>
为较新版本的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
引用它并使用它进行编译
然后我改变了ClassLibrary
并给它一个新的强名称。解决方案重建/刷新之后就是我所拥有的:
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命名约定。 ;)
汉斯是对的:如果可以......更新两个库以使用更新的参考文献。