为什么我必须为本地程序集使用完全限定的程序集名称?

时间:2009-01-15 20:28:13

标签: .net binding assemblies clr

在很多地方,比如app.config / web.config文件,我必须使用这个详细的完全限定名称来指定类型,比如

<add name="myListener" type="System.Diagnostics.TextWriterTraceListener, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

This MSDN site说,

  

部分绑定,仅指定   不允许使用程序集名称   在引用程序集时   .NET Framework。

好的,好 - 但为什么在某些地方,比如在定义我自己的自定义跟踪侦听器时,我不能在引用自己的,非强名称的,本地部署的程序集时使用部分绑定?这有更深层次的原因吗?

2 个答案:

答案 0 :(得分:0)

我想它的一部分与此有关:

http://blogs.msdn.com/suzcook/archive/2003/05/30/57159.aspx

LoadVithPartialName在v2中被折旧,我认为它在许多地方用于处理配置文件中的程序集名称。

虽然它应该可以工作(它只是折旧,但没有删除),我想他们会在内部对所有调用它的内容进行更改,包括如何处理配置文件。

答案 1 :(得分:0)

这是一个安全问题。绑定器在查找程序集时遵循一组特定的目录。如果我想要恶意破坏你的应用程序,我可以放入一个在适当的位置定义你的类型的程序集。您的代码将加载这个未签名的,不受信任的程序集,并开始执行我的代码,无论您运行的代码是什么特权。

其次,版本很重要,因为它允许安全地更新依赖于共享程序集的已部署应用程序,因为.net允许您在GAC中为程序集指定更新的策略。

最后,在.net中,拥有两个定义相同类型的程序集是完全合法的,这些程序集可能由不同的作者或公司编写,因此完全限定的名称可以保护您的代码不会出错。