(假设我这个问题只有一个默认的appdomain)
显然,Assembly.LoadFrom()可以导致加载相同名称,版本和内容的多个程序集,即使它们的路径不同也是如此。 这似乎违背了这里所说的:
“在程序集绑定时,程序集显示名称的组件 确定身份“。(http://blogs.msdn.com/b/suzcook/archive/2003/07/21/57232.aspx)
因为如果身份相同,为什么.NET会第二次将其加载到进程中?似乎有两种不同的身份。
从博客文章中可以得出的结论是:
“并非所有组件都在所有情况下都很重要。如果组件不是 强名称,然后绑定版本被忽略。但是,如果是的话 强烈命名,程序集引用中的整个版本需要 匹配找到的组件。“
这对于这里所说的内容有何意义:
“启用此功能时,不会验证强名称 加载程序集时的正确性。默认为true“ (http://msdn.microsoft.com/en-us/library/cc679069(v=vs.90).aspx)
如此强大的名字根本没有得到验证,这将使Suzanne在她的博客文章中所写的不正确。或者“验证”究竟是什么意思?我认为所有这些都归结为对集会身份的完全误解。我不明白集会身份在哪里以及为何以及如何以何种方式发挥作用。
答案 0 :(得分:3)
程序集标识崩溃的过程:程序集具有名称和版本,到目前为止非常简单。大会也有文化。例如,针对不同区域性的实现可能会以不同的方式设置日期字符串的格式,尽管它们可能具有相同的名称和相同的版本,但它们执行的功能并不完全相同。公钥令牌是弱安全措施的一部分,可以防止不同的发布者生产具有冲突身份的程序集。
.NET为什么会多次将程序集加载到同一App Domain中?
因为程序集在不同的加载上下文中加载。存在与默认解析行为相对应的上下文,从文件路径加载副本的上下文以及其他情况(例如,从程序集解析器中的字节加载程序集时)的上下文。这种行为已受到批评,因为来自具有相同标识但在不同上下文中的程序集类型被视为完全不同的类型。请参阅此MSDN文章和此博客文章:
https://msdn.microsoft.com/en-ie/magazine/dd727509%28en-us%29.aspx#id0400031
http://www.pabich.eu/2009/07/how-many-times-can-you-load-assembly.html
Suzanne Cook的验证是什么意思?作为一种安全机制(已被证明是脆弱且容易破解的),有一个私人强名称密钥和一个相应的公共密钥。公钥出现在DLL的清单中。 DLL是使用私钥签名的,并且签名出现在PE文件中的某个位置-PE标头指向此信息。公钥的缩写形式成为公钥令牌。这样可以确保只有拥有私钥的发布者才能生成带有特定公钥令牌的二进制文件,尽管这样做存在安全性问题。此机制可防止不同发布者之间的程序集标识冲突。完全信任程序集还有其他签名机制可确保其真实性。作为一种优化,您可以绕过检查强名称签名,因为它假定完全受信任的发布者不会尝试将程序集身份相互冲突。在此Microsoft文档中查看更多信息:
奖金问题:我想要一个强大的安全机制,以便我的客户真正信任我的程序集。我什至可能要验证我的应用程序组件确实是由我发布的,以防止进行反向工程,避免许可等。
SHA256 Authenticode签名是对任何PE文件(无论是托管程序集还是非托管二进制文件)进行签名的最新且最大的签名。这不能替代公钥令牌。公钥令牌对于建立程序集身份很重要。 Authenticode签名对于验证程序集的真实性很重要。