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

P.K*_*P.K 10 .net assembly-resolution

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

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

Mik*_*e J 16

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

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

关于解决装配问题,有几个基本的事项需要考虑:

  • 探测 加载程序尝试使用基本目录"探测"技术来定位程序集.这意味着它将尝试MyAssembly.dll在应用程序的启动目录中找到" "(例如),如果不存在,则在下面的子目录中找到.如果探测无法找到" MyAssembly.dll",那么AppDomainAssemblyResolve事件.

  • 机/用户/系统的配置machine.config,user.configsystem.config存储在本地其中一个可用来更改"机器","用户"或"系统" -宽设置在组件分解器的行为的系统上的配置文件.

  • 发布者策略 可以<assemblyIdentity>在应用程序的配置文件中使用" "XML标记(例如," MyApp.exe.config")指向解析程序到某个版本的程序集或从其他位置加载程序集.

  • 自定义分辨率 处理" AssemblyResolve"事件AppDomain.只要无法通过"传统"方法解决装配,就会引发此事件

到目前为止,最不复杂的机制是处理"AssemblyResolve"事件.

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

  • 当然.基本上,当你使用强名称的哈希值编译程序集(您也可以使用命令行工具SN.EXE),散列值被写入到描述它的版本,文化,名称和标记值集的元数据.当加载器加载程序集,它会检查,如果你的组件具有公钥标记,如果是这样,您的程序集运行相同的哈希算法,它与什么是在程序集元数据进行比较,并拒绝如果不同加载程序集.这就是加载检测"篡改"的方式.你可以看到,这是非常有限的,但现在已经足够了. (2认同)