目标框架如何真正起作用(为什么lib for 2.0可以使用lib for 4.0)?

时间:2015-04-14 08:21:44

标签: c# .net

我们有一个带有目标框架4.5.1的Web ASP.NET应用程序,它引用了一些使用target framework 2.0构建的库。所以,4.5.1可以使用2.0,没关系。

但是当app使用package for 2.0 framework时,app和library都使用log4net 1.2.11和app使用package for 4.0 framework。

以下是它的外观:

Application [4.5.1] --> Library [2.0]
     |                     |
     V                     V
  log4net [4.0]        log4net [2.0]

当我构建应用程序时,在bin文件夹中我有:app.dll,library.dll和log4net.dll。而log4net这里是针对4.0框架构建的。所以问题是:在这种情况下,library.dll(内置目标2.0)如何使用log4net(内置目标4.0)?是因为运行时是4.5.1而目标框架没有任何意义,所有代码都在4.5.1上下文中执行?

1 个答案:

答案 0 :(得分:1)

这里有几件事在玩。

首先,有公共语言基础结构(CLI)。 CLI是用于表示有关程序集,程序集中的类型,类型中的字段,方法,属性,事件等的元数据的标准,此外,它是实现方法的中间语言(IL)代码,这也是其中的一部分符合CLI标准。

第二,存在运行时环境,.NET Framework的公共语言运行时(CLR)或.NET Core的dotnet。运行时实际上通过解释元数据并将IL代码即时编译为机器代码来运行根据CLI标准构建的程序集,并引入了超出标准的内容,例如探测程序集的行为以及在何处找到它们< / p>

第三,有.NET Framework运行时库。这些库没有什么特别的地方。它们只是程序集的集合。 .NET Core也有自己的一组运行时库。 CLR使用.NET Framework运行时库,而dotnet使用.NET Core运行时库。它们只是不同应用程序之间的共享实现,每个开发特定平台的人都可以依靠它们。

最后,有了目标框架。尽管适当的框架运行时库由CLR / dotnet确定,但这不一定是您要针对的。也就是说,构建引擎而不是运行时环境决定了构建时使用的库的位置。特别是,有一些剥离了IL代码的库集,仅包含元数据,这些库称为您可能参考的每个框架的参考程序集。构建环境知道如何找到这些。可以使用的框架中的API受目标框架的选择限制。

这一切如何融合在一起?好吧,运行时库可以实现参考程序集,即.NET Framework 4.5.1运行时库包含.NET Framework 4.5.1参考程序集的所有实现,但是由于Microsoft保持向后兼容性,因此它们也包含所有实现。所有以前的.NET Framework版本。实际上,.NET Framework 4.5.1实现了.NET Core 1.0参考程序集,后者又实现了.NET Standard 1.2参考程序集和其他。如果我针对.NET Standard 1.0,.NET Core 1.0和.NET Framework 4.5编译三个库,它们将全部在具有.NET Framework 4.6.2运行时库的PC上运行的同一应用程序中工作,因为这些库包含所有我所有目标框架的API。

.NET标准?这组参考程序集是唯一的,因为它不存在规范的库实现,并且没有相应的运行时环境。它由.NET Framework,.NET Core,Mono,Xamarin等实现。这意味着要成为一个统一点,无论开发人员的库或应用程序将在何处执行,所有开发人员都可以依赖该标准。