C# 具有相同名称、相同版本但公钥不同的两个程序集

C# 具有相同名称、相同版本但公钥不同的两个程序集,c#,asp.net,C#,Asp.net,GAC中是否可以存在两个名称相同、版本相同但公钥不同的程序集 我不确定这一点是否正确,但这是我在一次采访中必须面对的问题。简短回答:当然,他们可以一起存在于GAC中。你不能同时使用它们 详细回答:程序集使用其显示名称位于GAC中。可以注册两个具有相同名称的不同程序集,但应用程序只能看到最后注册的一个程序集 在您的情况下(不同的公钥),如果在应用程序中引用了较旧的程序集,则可能会出现异常:引用将解析为较新的程序集,但公钥不匹配,则程序集将不会加载 EDIT:此行为并非来自程序集签名本身(签名是一种

GAC中是否可以存在两个名称相同、版本相同但公钥不同的程序集


我不确定这一点是否正确,但这是我在一次采访中必须面对的问题。

简短回答:当然,他们可以一起存在于GAC中。你不能同时使用它们

详细回答:程序集使用其显示名称位于GAC中。可以注册两个具有相同名称的不同程序集,但应用程序只能看到最后注册的一个程序集

在您的情况下(不同的公钥),如果在应用程序中引用了较旧的程序集,则可能会出现异常:引用将解析为较新的程序集,但公钥不匹配,则程序集将不会加载


EDIT:此行为并非来自程序集签名本身(签名是一种第一级弱安全性,也是使程序集唯一的一种方法),而是如何实现GAC
。它甚至没有固定在石头上,这种行为在将来甚至可能改变。现在,只需考虑避免这种奇怪的场景……

< p>是的,你的程序集引用可以指定你要引用的程序集的公钥,所以它们可以有相同的名称、版本、文化、任何东西,只要你指定了你想使用的公钥。

显然(强调我的):

公钥标记用于使程序集名称唯一。因此 两个强名称程序集可以具有相同的PE文件名,但 CLI将它们识别为不同的程序集。Windows文件 系统(FAT32和NTFS)只识别PE文件名,因此 具有相同PE文件名(但区域性、版本不同)的程序集 或公钥令牌)不能存在于同一Windows文件夹中。解决 此问题CLI引入了GAC(全局程序集缓存),即 运行时将其视为单个文件夹,但实际上已实现 使用嵌套的文件系统文件夹


正如我在我的
%windir%\assembly
中看到的,相同的名称+相同的版本+相同的公钥也可以存在。(他们有不同的语言)@codroipo当然,要在GAC程序集中生活在一起,只需要有不同的东西(名称、版本、处理器体系结构、区域性、公钥)。不,如果有两个程序集具有相同的名称和不同的公钥…如果您尝试加载旧的程序集,您会遇到异常。真的吗?我需要对此进行一些测试,我不明白为什么它不允许您加载旧版本,只要您不想同时使用这两个版本:GAC本身并不是为了解决“那个”问题而引入的,它还有其他含义。CLR完全可以使用变体使用GAC一样的解析(甚至允许通过显式文件名加载强签名程序集)。。相反,GAC的运行方式完全不同,并且恰好“捕获”了效果:GAC中的强命名程序集是权威源。