.net 强命名程序集和公钥令牌

.net 强命名程序集和公钥令牌,.net,clr,metadata,.net-assembly,strongname,.net,Clr,Metadata,.net Assembly,Strongname,考虑这样一种情况,即两个不同发布程序集的两个公钥映射到同一公钥令牌(而程序集的名称、版本和区域性也相同) 当CLR试图解析仅引用上述其中一项的AssemblyRef条目时,它是否能够准确地知道应该加载哪一项? 我敢肯定没有什么是幸运的,那么它将如何工作? 也许这是一个折衷方案,使用更短的密钥,节省空间,避免碰撞 来源:CLR via C#,第4版,第71页(页眉)。当组件存储在GAC中时,没有歧义,一个组件将替换另一个。所以你会得到最后一个注册的 当它未存储在GAC中时,CLR将仅根据显示名称定

考虑这样一种情况,即两个不同发布程序集的两个公钥映射到同一公钥令牌(而程序集的名称、版本和区域性也相同)

当CLR试图解析仅引用上述其中一项的AssemblyRef条目时,它是否能够准确地知道应该加载哪一项?
我敢肯定没有什么是幸运的,那么它将如何工作?
也许这是一个折衷方案,使用更短的密钥,节省空间,避免碰撞


来源:CLR via C#,第4版,第71页(页眉)。

当组件存储在GAC中时,没有歧义,一个组件将替换另一个。所以你会得到最后一个注册的

当它未存储在GAC中时,CLR将仅根据显示名称定位程序集。它在探测路径中的目录中搜索文件名与文件扩展名为.exe或.dll的显示名匹配的文件。如果AssemblyName的其余部分不匹配,它找到的第一个将完成搜索。在同一目录中存储具有相同显示名称的程序集会很困难,但从技术上讲,一个名为.exe,另一个名为.dll是可能的。首先找到.exe


这些都在本文中有很好的记录。

1。所以这里有点“地狱”,一个程序集覆盖另一个程序集,尽管它们有不同的公钥。这是相当合理的,因为GAC文件夹结构基于公钥令牌。2.在GAC外部加载的强命名程序集,在第一次加载程序集时,CLR将使用版本和密钥信息,并验证签名。3.dll和exe文件具有相同的名称,dll首先加载很难猜测您是如何得出这些结论的。1:没有,你说公钥是一样的。2:否,CLR将仅在加载程序集后验证该程序集,但在不匹配的情况下不进行额外搜索。3:不,exe是第一个。谢谢大家的投票。我来这里是为了学习,所以首先我要感谢你们的关注和时间:)1。“两个不同发布者的两个公钥”-我声明映射的令牌是相同的,而不是原始的完整公钥。“地狱”是指即使完整密钥不同,名称、区域性、版本和令牌是否相同。2.好的,我现在明白了。我试过了,先用了我的dll。我有同样的问题(在读同一本书时)。我只能假设,使用令牌而不是整个公钥所带来的额外冲突风险被认为是最小的。