C# 什么';什么是程序集标识?

C# 什么';什么是程序集标识?,c#,.net,C#,.net,(假设此问题只有一个默认appdomain) 显然,Assembly.LoadFrom()可能导致加载多个具有相同名称、版本和内容的程序集,即使只是它们的路径不同。 这似乎与这里所说的背道而驰: 在程序集绑定时,程序集的组件显示名称 确定身份。() 因为如果标识相同,为什么.NET会再次将其加载到进程中?似乎有两种不同的身份 从那篇博文中,同样没有意义的是: “并非所有的部件在所有情况下都是重要的 强名称,则绑定时忽略该版本 强名称,程序集引用中的整个版本需要 匹配找到的程序集。“ 这与这里所说

(假设此问题只有一个默认appdomain)

显然,Assembly.LoadFrom()可能导致加载多个具有相同名称、版本和内容的程序集,即使只是它们的路径不同。 这似乎与这里所说的背道而驰:

在程序集绑定时,程序集的组件显示名称 确定身份。()

因为如果标识相同,为什么.NET会再次将其加载到进程中?似乎有两种不同的身份

从那篇博文中,同样没有意义的是:

“并非所有的部件在所有情况下都是重要的 强名称,则绑定时忽略该版本 强名称,程序集引用中的整个版本需要 匹配找到的程序集。“

这与这里所说的有什么关系:

“启用此功能时,不会对其验证强名称 加载程序集时的正确性。默认值为true“ ()


因此,强名称根本没有得到验证,这将使苏珊娜在她的博客文章中所写的内容不正确。或者“验证”的确切含义是什么?我认为所有这些归结为对集会身份的完全误解。我不明白程序集标识在何处、为何以及如何以何种方式起作用。

程序集标识速成班:程序集有名称和版本,到目前为止都是直截了当的。集会也有一种文化;例如,不同区域性的实现可能会以不同的方式格式化日期字符串,尽管它们可能具有相同的名称和版本,但它们做的事情并不完全相同。公钥令牌是弱安全措施的一部分,用于防止不同的发布者生成具有冲突身份的程序集

为什么.NET会多次将程序集加载到同一应用程序域中

因为程序集是在不同的加载上下文中加载的。有一个与默认解析行为相对应的上下文,一个从文件路径加载副本的上下文,以及一个用于其他情况的上下文,例如从程序集解析器中的字节加载程序集时的上下文。这种行为受到了批评,因为具有相同标识但在不同上下文中的程序集的类型被视为完全不同的类型。请参阅这篇MSDN文章和这篇博文:

苏珊娜·库克所说的验证是什么意思?作为一种安全机制(已被证明是脆弱且容易被破坏的),存在一个私有的强名称密钥和一个相应的公钥。公钥出现在DLL的清单中。DLL使用私钥签名,签名出现在PE文件中的某个位置-PE头指向此信息。公钥的缩写形式成为公钥令牌。这确保了只有持有私钥的发布者才能生成具有特定公钥令牌的二进制文件,尽管这存在安全问题。此机制可防止不同发布服务器之间的程序集标识冲突。完全信任程序集具有确保其真实性的其他签名机制。作为一种优化,您可以绕过检查强名称签名,因为它假定完全受信任的发布者不会试图相互碰撞程序集标识。请参阅此Microsoft文档中的详细信息:

附加问题:我想要一个强大的安全机制,这样我的客户才能真正信任我的程序集。我甚至可能想验证我的应用程序的组件是否真的由我发布,以防止逆向工程、避免许可等。我如何做到这一点

SHA256 Authenticode签名是对任何PE文件(无论是托管程序集还是非托管二进制文件)进行签名的最新和最好的签名。这不是公钥令牌的替换。公钥令牌对于建立程序集标识很重要。Authenticode签名对于验证程序集真实性非常重要