11

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

编辑:我也读过延迟签名之类的东西。人们真的会使用它吗?(有没有人实际使用过延迟签名)谁生成了对程序集进行签名的密钥。如果我问的问题太多,我很抱歉。但是,我对这整件事感到困惑。

4

3 回答 3

16

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

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

关于解决程序集,有一些基本的事情需要考虑:

  • 探测 加载器尝试使用基本目录“探测”技术定位程序集。这意味着它将尝试MyAssembly.dll在应用程序的启动目录中找到“”(例如),如果没有,则在该目录下的子目录中。如果探测未能找到“ MyAssembly.dll”,则触发AppDomain'事件。AssemblyResolve

  • 机器/用户/系统配置machine.config和是存储在系统本地 的配置文件user.configsystem.config可用于更改“机器”、“用户”或“系统”范围设置上的程序集解析器的行为。

  • 发布 者策略 可以使用<assemblyIdentity>应用程序配置文件中的“” XML 标记(例如“ MyApp.exe.config”)将解析器指向程序集的某个版本或从不同位置加载程序集。

  • 自定义解析 处理“ AssemblyResolve”事件AppDomain。每当无法通过“传统”方法解决程序集时,就会引发此事件

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

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

于 2009-08-05T20:03:52.690 回答
2

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

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

.NET 中的程序集解析可能相当复杂,因为程序集可以位于各种位置,包括 GAC、与执行程序集位于同一位置、影子复制等。一般过程称为 Fusion 过程,并确保采取适当的安全措施加载程序集时遇到。

于 2009-08-05T19:49:32.457 回答
1

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

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

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

只是为了进一步添加这个答案是这个破解链接应该很好地总结了整个强命名与键:强命名 - 键等。

对此有任何疑问,尽管问!

于 2009-08-05T19:46:22.900 回答