如何在.NET中解决程序集?

时间:2009-08-05 19:30:42

标签: .net assembly-resolution

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

编辑:我还读过有关延迟签名和类似内容的内容。人们真的使用它吗? (有没有人实际使用过延迟签名)谁生成了签署程序集的密钥。如果我问了太多问题,我很抱歉。但是,我对这件事感到困惑。

3 个答案:

答案 0 :(得分:16)

强命名与“公钥标记”一起使用以生成程序集完整显示名称mscorlib, version=2.0.0.0, Culture=neutral, PublicKeyToken=b4778,.....)。这使我们可以在同一个应用程序目录中并排使用同一程序集的多个版本。

公钥标记(以及字符串命名技术)还允许.NET加载程序检测是否有人在您分发它之后篡改了程序集内容。这是正确的,因为当您使用“私有令牌”对程序集进行签名时,编译器将生成一个哈希值,该哈希值将嵌入到描述“私有令牌”的公共部分的程序集元数据中。然后,加载程序可以使用此值来确定您的程序集是否已被修改。

关于解决装配问题,有几点需要考虑:

  • <强>探测 加载程序尝试使用基本目录“探测”技术来定位程序集。这意味着它将尝试在应用程序的启动目录中找到“MyAssembly.dll”(例如),如果不存在,则在下面的子目录中找到。如果探测无法找到“MyAssembly.dll”,则会触发AppDomain的{​​{1}}事件。

  • 计算机/用户/系统配置 AssemblyResolvemachine.configuser.config是本地存储在系统中的配置文件,可用于在“机器”,“用户”或“系统”上更改程序集解析程序的行为“-wide setting。

  • 发布商政策 可以在应用程序的配置文件中使用“system.config”XML标记(例如,“<assemblyIdentity>”)指向解析程序到特定版本的程序集或从不同位置加载程序集

  • 自定义分辨率 处理MyApp.exe.config的“AssemblyResolve”事件。只要无法通过“传统”方法解决装配,就会引发此事件

到目前为止,最不复杂的机制是处理“AssemblyResolve”事件。

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

答案 1 :(得分:2)

MSDN上的以下文章可以帮助您:

http://msdn.microsoft.com/en-us/library/yx7xezcf(VS.71).aspx

.NET中的程序集解析可能相当复杂,因为程序集可以位于各种位置,包括GAC,与执行程序集共存,阴影复制等。一般过程称为Fusion过程,并确保加载程序集时会满足适当的安全措施。

答案 2 :(得分:1)

程序集解析可能涉及许多步骤,具体取决于它尝试加载的程序集的位置(GAC,应用程序基础文件夹,子文件夹或远离基本应用程序文件夹的其他文件夹)。

这是一篇很好的文章,介绍如何指定.Net查找程序集的位置。 MSDN Article

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

进一步补充这个答案的是这个破解链接,应该非常好地为你总结整个强大的命名:Strong Naming - keys etc..

有任何问题,请问!