.NET如何解析类型?

时间:2012-12-09 18:46:02

标签: .net c#-4.0 compiler-construction types runtime

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

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

1 个答案:

答案 0 :(得分:4)

使用无法识别的标识符时,您获得的错误消息的最终来源是编译器。您将从IntelliSense获得早期警告,它将红色曲线置于标识符名称下。

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

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

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