【问题标题】:How does .NET resolve types?.NET 如何解析类型?
【发布时间】:2012-11-27 06:01:30
【问题描述】:

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

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

【问题讨论】:

  • 嗯,Visual Studio 本质上是你的编译器。 cl是VS执行编译的可执行文件。
  • @JonathonReinhart 好吧,C# 编译器和 VS 使用的其他组件之间有一个(偶尔有用的)区别。
  • 同意,但他在这里询问是否是 VS 或编译器引发了构建错误。在这种情况下,cl 可能会打印它,VS 会选择它并将其显示在构建错误框中。
  • 您可以配置 VS 以抛出与编译构建步骤无关的构建错误。例如,在运行单元测试后返回状态失败的构建步骤。当我说我不知道​​它是 VS 还是 csc.exe 编译器时,这就是我所说的(但现在我知道在这种情况下它是编译器)

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢您提供详细而翔实的答案和链接。这正是我想知道的,你让我走上了正确的轨道,还有其他一些问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
  • 2016-08-26
  • 2020-10-16
相关资源
最近更新 更多