繁体   English   中英

.NET如何解析类型?

[英]How does .NET resolve types?

我很好奇.net如何解析类型。 我知道有一个编译时组件,因为您不能编译具有使用当前程序集或引用程序集中所没有的语句或完全限定类型的程序。 我想知道是编译器遇到了错误,还是Visual Studio在proj文件中找不到引用时引发了构建错误?

我也想知道.net如何在运行时找到程序集。 我知道.net使用JIT编译器在它第一次从该程序集运行为类型时加载程序集。 我很好奇如何寻找类型和搜索顺序。 程序集清单是否告诉运行时准确在哪里查找引用的程序集(如ASP.NET web.config文件)? 任何对博客文章,书籍,规格等的链接将不胜感激。

当您使用无法识别的标识符时,错误消息的最终来源是编译器。 您将收到IntelliSense的预警,它将红色的花键放在标识符名称下。

编译器在从源代码生成的程序集的元数据中记录程序集,名称空间和类型名称。 对于程序集,它记录显示名称(如System),它在参考程序集中找到的[AssemblyVersion]和PublicKeyToken(与强命名程序集相关的值)。

在运行时,CLR的任务是仅使用这三个装配属性来找到装配。 抖动将是要求CLR在需要生成代码时找到它的抖动。 关于它,有一些晦涩的细节,它们与覆盖正常的查找规则有关,您可以在任何有关.NET或MSDN的好书中找到它们的文档。 MSDN文章将详细介绍。

通常的方法是,它首先在GAC中查找,它是程序集的存储库以及所有.NET Framework程序集的存储位置。 GAC是特殊的,因为它可以存储具有相同名称但不同版本的多个程序集,这是强大的DLL Hell对策。 如果在该处找不到它,则使用与这三个属性以及体系结构的完全匹配,然后在存储EXE的目录中查找,如果显示名称匹配,则接受匹配。 如果所有程序集属性都匹配,并且可以使用相同的名称空间和类型名称找到类型,那么一切都很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM