在.NET中,程序集是如何被解析的?

11

.NET中的程序集是如何解析的?我的意思是,具有完全限定名称的程序集是如何解析的。我对公钥/私钥令牌和强命名感到困惑。谢谢。

编辑:我也读过关于延迟签名之类的东西。人们真的会使用它吗?(是否有人实际上使用了延迟签名?)谁生成用于签署程序集的密钥?非常抱歉如果我问了太多问题。但是,我对整个事情感到困惑。

3个回答

16
强命名和“公钥令牌”一起使用,产生一个程序集的完整显示名称(mscorlib,version=2.0.0.0, Culture=neutral, PublicKeyToken=b4778,.....)。这使我们能够在同一应用程序目录中同时拥有多个版本的相同程序集。
公钥令牌(因此也是字符串命名技术)还允许.NET加载器检测自从您分发程序集以来是否有人篡改了它的内容。这是真实的,因为当您使用“私有标记”签署程序集时,编译器将生成一个哈希值,并嵌入到描述您“私有标记”公共部分的程序集元数据中。然后,加载器可以使用此值来确定您的程序集是否被修改。
关于解析程序集,有几件基本事项需要考虑:
- 探测: 加载器使用基本的目录“探测”技术来查找程序集。这意味着,如果没有在应用程序的启动目录中找到“MyAssembly.dll”(例如),则会尝试在该目录下的子目录中查找。如果探测未能找到“MyAssembly.dll”,则会触发AppDomain的AssemblyResolve事件。 - 机器/用户/系统配置: machine.config、user.config和system.config是存储在系统上的本地配置文件,可以用来更改程序集解析器在“机器”、“用户”或“系统”范围内的行为。 - 发布策略: 您可以在应用程序的配置文件(例如“MyApp.exe.config”)中使用“”XML令牌,将解析器指向特定版本的程序集或从不同位置加载程序集。 - 自定义解析: 您可以编写自己的代码来处理程序集解析。处理AppDomain的"AssemblyResolve"事件。当程序集无法通过"传统"方法解析时,将引发此事件。

到目前为止,最简单的机制是处理 "AssemblyResolve" 事件。

总之,解析器会在当前目录或全局程序集缓存中查找,处理策略,最后允许自定义解析。


“允许.NET加载器检测是否有人篡改了您的程序集内容…” 我没太明白。 - P.K
2
当你使用强名称哈希值(也可以使用命令行实用程序sn.exe)编译汇编时,哈希值会被写入描述其版本、文化、名称和标记值的元数据中。当加载器加载您的程序集时,它会检查您的程序集是否具有公钥标记,如果是,则对您的程序集运行相同的哈希算法,将其与程序集元数据中的内容进行比较,并在它们不同时拒绝加载程序集。这就是加载程序如何检测“篡改”的方式。正如您所看到的,它非常有限,但现在已经足够了。 - Mike J
表面上看,它似乎是保护我们的.NET代码的一种方式。但是,激动很快就会消退,你很快就会意识到混淆是下一个最好的选择。 - Mike J
我不理解"..它看起来像是保护我们的.NET代码的一种方式"这部分的含义。我一直认为签名程序集可以确保我们使用的是最初用于使用的程序集。(但是是否存在可能失败的情况呢?)而不是为了保护源代码(混淆可以达到这个目的)。 - P.K
是的,签名确保我们只加载我们构建的程序集(它还允许并排版本和通过全局程序集缓存共享我们的程序集)。此外,发布者策略允许我们将对一个程序集的引用“重定向”到不同版本。是否存在失败的情况?当然有。但如果引用的程序集无法加载,通常与路径位置、程序集的无效版本或安全权限问题有关(例如从共享网络驱动器加载)。 - Mike J

2
以下这篇MSDN文章应该可以帮到你:http://msdn.microsoft.com/zh-cn/library/yx7xezcf(VS.71).aspx 在.NET中,程序集解析可能会相当复杂,因为程序集可以位于各种位置,包括GAC、与执行程序集共存、阴影复制等。通常的过程称为Fusion过程,并确保在加载程序集时满足适当的安全措施。

1

程序集的解析可能涉及多个步骤,具体取决于它正在尝试加载的程序集所在的位置(GAC、应用程序基础文件夹、子文件夹或另一个与您的基础应用程序文件夹不同的文件夹)。

这是一篇关于如何指定 .Net 查找程序集的好文章。 MSDN 文章

如果您想让运行时解析一个未存储在应用程序基础文件夹或 GAC 中的程序集,则需要注册 AppDomain 事件,该事件在找不到程序集时引发。然后,您可以通过检查文件是否存在于其他位置并使用 Assembly.LoadFrom(thePath) 返回它来对该事件做出反应。

进一步补充这个答案的是这个链接,它应该很好地为您总结整个带有密钥的强命名:Strong Naming - keys etc..

如果有任何问题,请随时提问!


谁生成程序集签名的密钥? - P.K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接