Framework、Standard和Core


基本概念

  它们均可称为.NET的某种实现,只不过standard只有类库(并且framwork只支持到standard2.0,以及2.1后standard不再更新)


  .NET Framework仅面向Windows平台,主要包含两部分:公共语言运行时(CLR)和.NET Framework类库(核心为mscorlib.dll,当然还有其他的基础类库比如System.Configuration.dll等)

  .NET Core是.NET Framework(从4.5开始)的跨平台开源版本,也有它的运行时(.NET core runtime)和它的类库(核心System.Runtime.dll,其他类库比如System.Configuration.ConfigurationManager.dll)

  .NET Standard实际是一套标准。目的是建立能用于各种.NET的dll。目前framework、core等等都有各自对这套标准的实现,但也都保留了自己原来的实现方式,所以慢慢standard变成了能被各种.NET引用的一套dll。


  可以自行建立.NET Framework的dll和exe,它们只能用于windows;

  也可以建立.NET Core的dll和exe,可以跨平台——并且据测试,部分性能有所提升;

  .NET Standard只能建类库,并且不支持WCF——但只要选择.NET Standard 2.0版本,就可以在framework与其他.NET间共享代码。

 

基础类库

  指的是.NET自带的那些基础类,比如System.String,System.Configuration.ConfigurationManager、System.IO.StreamReader等

  不论哪种.NET实现,这些类的命名空间是相同的,但所属的dll各不相同。

  比如同样是ConfigurationManager类,在所有版本里都位于System.Configuration命名空间,但是

  在.NET Framework版本中,它位于Sytem.Configuration.dll

  但在.NET Core版本中,它位于System.Configuration.ConfigurationManager.dll中

  而.NET Standard中不支持这个类(还没有完全标准化),它实际使用.NET Platform Extensions(似乎是把未来要标准化的先放这里)里的System.Configuration.ConfigurationManager.dll

 

依赖项

  .NET Framework依赖的dll必须是framework或standard类型;

  .NET Core依赖的dll必须是core或standard类型;

  .NET Standard只能依赖standard类型(加上别的也识别不出内容,编译找不到命名空间)。

 

  .NET Framework会将所有的依赖项平铺展开,并且在csproj文件中能看到所有引用;

  .NET Core和.NET Standard则只显示*类库(最直接的儿子),其余孙子在儿子中以层级的方式显示,csproj文件也只记录儿子(没有孙子);
  【换句话说】这两种.net中,没有一个地方能直观地看到所有引用。

 

  添加nuget包时,.NET Framework使用package.config平铺地记录所有nuget包,同时增加csproj的引用;

  而.NET Core和.NET Standard抛弃了package.config,它们在直接csproj文件中,以<PackageReference>的方式记录*包(只记儿子,不管孙子)

 

  不论哪种.net,如果引用的dll就在同sln内(三世同堂),则默认已包含该dll引用的子类库(孙子),不必额外处理;

  引入nuget包也一样,只不过framework会把所有子孙展平,而core和standard都只是记录直接儿子(在解决方案视图中,点开儿子就可以看到孙子);

  【但是】果是通过路径指定方式引用dll,那么它需要显式引用所有子孙。

  如果这个儿子是framework还好,因为他的csproj里有它需要的所有子孙;

  但如果这个儿子是core或者standard,想找全它的子孙可有点费事。

 

【我曾犯的错误】

  我有一framework版本的exe,它通过指定路径的方式引用了dll(儿子),这个儿子引用了ConfigurationManager。

  显然,当这个儿子是framwork版时,孙子得是System.Configuration.dll;而这个儿子是standard版时,孙子得变成System.Configuration.ConfigurationManager.dll。

 
  当我引用framework版的儿子时,一切都没问题(我自己是framework,而且由于framework实际内嵌了System.Configuration.dll,我没有添加任何孙子)

  但当我把儿子改为standard版的时,就报了没有程序入口点的异常。


  原因就是缺少这个孙子System.Configuration.ConfigurationManager.dll。

  我也除了这篇文档外,额外收获了没有程序入口点除了dll版本不对里边少方法,还可能是因为压根就没找到dll。。

 

上一篇:【笔记】sklearn中的SVM以及使用多项式特征以及核函数


下一篇:.NET Standard 版本支持