.NET 如何解析类型?

ena*_*rik 4 .net compiler-construction types runtime c#-4.0

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

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

Han*_*ant 6

当您使用无法识别的标识符时,您获得的错误消息的最终来源是编译器。您将收到来自 IntelliSense 的早期警告,它将红色波浪线放在标识符名称下。

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

在运行时,CLR 的工作是找到仅具有这三个程序集属性的程序集。抖动将是要求 CLR 在需要生成代码时找到它的抖动。关于它有几个模糊的细节,与覆盖正常查找规则相关,您可以在任何关于 .NET 或 MSDN 的好书中找到它们。这篇MSDN 文章详细介绍了。

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