4

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

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

4

1 回答 1

6

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

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

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

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

于 2012-12-09T19:19:15.707 回答