在Visual Studio中,您可以创建至少3种不同类型的类库:
-
类库(.NET Framework)
-
类库(.NET标准版)
-
类库(.NET Core)
虽然第一个是我们已经拥有的是什么时候使用.NET标准和.NET Core类库类型 . 我最近在尝试multi-target different framework versions和creating a unit test project时被这种方式所困扰 .
那么, Class Library (.NET Standard)
和 Class Library (.NET Core)
之间有什么区别,为什么两者都存在,何时我们应该使用另一个?
9 回答
.Net Framework 和 .Net Core 是.Net运行时的两种不同实现 . Core和Framework(尤其是Framework)都有不同的配置文件,包括Microsoft为.Net创建的许多API和程序集的更大或更小(或只是简单的不同)选择,具体取决于它们的安装位置和配置文件 . 例如,通用Windows应用程序中有一些不同的API,而不是"normal" Windows配置文件 . 即使在Windows上,您也可能拥有"Client"配置文件与"Full"配置文件 . 此外,还有其他实现(如Mono)具有自己的库集 .
.Net Standard 是必须提供API库和程序集集的规范 . 为.Net Standard 1.0编写的应用程序应该能够编译和运行任何版本的Framework,Core,Mono等,它们宣传对.Net Standard 1.0库集合的支持 . 类似于.Net Standard 1.1,1.5,1.6,2.0等 . 只要运行时提供对程序所针对的Standard版本的支持,您的程序就应该在那里运行 .
针对标准版本的项目将无法使用该标准修订版中未包含的功能 . 这不依赖于其他供应商或其他供应商发布的API(即:NuGet上的项目)的依赖关系 . 但它确实意味着您所采用的任何依赖项还必须包括对您的.Net Standard版本的支持 . .Net标准正在快速发展,但它仍然足够新,并且对一些较小的运行时配置文件足够关注,这种限制可能让人感到窒息 . (注意一年半之后:这已经开始改变,最近的.Net标准版本更好,功能更全面) .
另一方面,针对Standard的应用程序应该能够在更多部署情况下使用,因为理论上它可以与Core,Framework,Mono等一起运行 . 对于寻求广泛分发的类库项目,这是一个有吸引力的承诺 . 对于主要用于内部目的的类库项目,它可能不是一个问题 .
.Net标准也适用于SysAdmin团队由于哲学或成本原因而希望从Windows上的ASP.Net迁移到Linux上的.Net Core的ASP.Net的情况,但开发团队希望继续反对.Net Windows上Visual Studio中的框架 .
希望这有助于理解 relationship between .NET Standard API surface and other .NET platforms . 每个接口代表一个目标框架,方法代表该目标框架上可用的API组 .
Source
.Net Core Class Library Build 在 .Net Standard 之上 . 如果要实现可移植到 .Net Framework 的库, . Net Core 和 Xamarin ,选择 .Net Standard Library
.Net Core will ultimately implement .Net Standard 2 ( Xamarin 和 .Net Framework )
因此, .Net Core , Xamarin 和 .Net Framework 可以标识为 flavours .Net Standard
为了使您的代码共享和重用应用程序能够面向未来,您宁愿实现.Net标准库 .
Microsoft还建议您使用 .NET Standard 而不是 Portable Class Libraries .
要引用MSDN作为权威来源, .Net Standard 应为 One Library to Rule Them All . 由于图片胜过千言万语,以下内容将使事情变得非常清楚:
1. Your current application scenario (fragmented)
像我们大多数人一样,您可能处于以下情况:( . NET Framework,Xamarin和现在.Net Core风格的应用程序)
2. What the .Net Standard Library will enable for you (cross-framework compatibility)
实现.Net标准库允许跨所有这些不同风格的代码共享:
对于不耐烦:
.NET Standard 通过在您需要的环境中引入您期望和喜爱的所有API,解决了所有平台上.NET开发人员的代码共享问题:桌面应用程序,移动应用程序和游戏以及 Cloud 服务:
.NET Standard 是 set of APIs all .NET平台 have to implement . 这 unifies the .NET platforms 和 prevents future fragmentation .
.NET Standard 2.0 将由 .NET Framework 实施, . NET Core 和 Xamarin . 对于 .NET Core ,这将添加许多已请求的现有API .
.NET Standard 2.0 包含 .NET Framework 二进制文件的兼容性填充程序,显着增加了可以从.NET标准库引用的库集 .
.NET Standard will replace Portable Class Libraries (PCLs) 作为构建多平台.NET库的工具故事 .
对于一张 table 来根据您打算运行的.NET平台,帮助了解您可以定位的最高版.NET Standard,head over here .
资料来源:MSDN: Introducing .Net Standard
另一种解释差异的方法可能是现实世界的例子,因为我们大多数人都会使用现有的工具和框架(Xamarin,Unity等)来完成这项工作 .
因此,使用.NET Framework,您可以使用所有.NET工具,但只能定位Windows应用程序(UWP,Winforms,ASP.NET等) . 由于.NET Framework是封闭源代码,因此没有太多事情可做 .
使用.NET Core,您可以使用较少的工具,但可以定位主要的桌面平台(Windows,Linux,Mac) . 这在ASP.NET核心应用程序中特别有用,因为您现在可以在Linux中托管Asp.net(更便宜的托管价格) . 现在,由于.NET Core是开源的,因此在技术上可以为其他平台开发库 . 但由于没有支持它的框架,我认为这不是一个好主意 .
使用.NET Standard,您可以使用更少的工具,但您可以定位所有/大多数平台 . 你可以通过Xamarin来定位Mobile,你甚至可以通过Mono / Unity来定位Game Consoles .
在实际应用程序中,您可能需要使用所有这些应用程序 . 例如,我开发了具有以下架构的销售点应用程序:
Shared both Server and Client:
由于它是.NET标准库,因此可以在任何其他库中使用 .
Server Side (Web API):
.NET标准(也可以是Core)库,用于处理所有数据库连接 .
一个.NET Core项目,它处理Rest API并使用数据库库 .
由于这是在.NET Core中开发的,我可以在Linux服务器上托管该应用程序 .
Client Side (MVVM with WPF + Xamarin.Forms Android/IOS):
用于处理客户端API连接的.NET标准库 .
处理ViewModels Logic的.NET标准库 . 用于所有视图 .
.NET Framework WPF应用程序,用于处理Windows应用程序的WPF视图 .
一个处理Xamarin Forms视图的.NET标准库 .
Xamarin Android和Xamarin IOS项目 .
所以你可以看到在应用程序的客户端有一个很大的优势,因为我可以重用.NET标准库(Client API和ViewModels),只是为WPF,Xamarin和IOS应用程序创建没有逻辑的视图 .
该决定是兼容性和API访问之间的权衡 .
如果要增加与库兼容的应用程序数量,请使用.NET标准库,并且可以减少库可以访问的.NET API表面区域 .
如果要增加库可以访问的.NET API表面区域,请使用.NET Core库,并且只允许.NET Core应用程序与库兼容即可 .
例如,面向.NET Framework 1.3 will be compatible with应用程序的库,其目标是.NET Framework 4.6,.NET Core 1.0,Universal Windows Platform 10.0以及支持.NET Standard 1.3的任何其他平台 . 但是,该库无法访问.NET API的某些部分 . 例如,Microsoft.NETCore.CoreCLR包与.NET Core兼容,但与.NET Standard不兼容 .
The Package-based frameworks section here描述了差异 .
兼容性:面向.NET Standard的库将在任何符合.NET标准的运行时上运行,例如.NET Core,.NET Framework,Mono / Xamarin . 另一方面,面向.NET Core的库只能在.NET Core运行时上运行 .
API表面区域:.NET标准库随附
NETStandard.Library
中的所有内容,而.NET核心库随附Microsoft.NETCore.App
中的所有内容 . 后者包括大约20个额外的库,其中一些我们可以手动添加到我们的.NET标准库(例如System.Threading.Thread
),其中一些与.NET标准不兼容(例如Microsoft.NETCore.CoreCLR
) .此外,.NET Core库指定运行时并附带应用程序模型 . 例如,重要的是使单元测试类库可运行 .
暂时忽略库,.NET Standard存在的原因是可移植性;它定义了.NET平台同意实现的一组API . 任何实现.NET标准的平台都与目标.NET标准的库兼容 . 其中一个兼容的平台是.NET Core .
回到库,.NET标准库模板可以在多个运行时上运行(以API表面区域为代价) . 相反,存在.NET Core库模板以访问更多API表面区域(以兼容性为代价)并指定用于构建可执行文件的平台 .
所以简短的回答是:
.NET标准:将其视为一个大型标准库 . 当使用它作为依赖项时,您只能创建库(.DLLs),不是可执行文件 . 可以将使用.NET标准作为依赖项的库添加到Xamarin.Android,Xamarin.iOS,.NET Core Windows / OSX / Linux项目中 .
.NET Core:将它视为旧.NET框架的延续,只是它的开源,一些东西尚未实现,而其他东西已被弃用 . 它扩展了.NET标准的附加功能,但只能在桌面上运行 . 将此作为依赖项添加时,您可以在Windows,Linux和OSX上创建可运行的应用程序 . (虽然现在只有控制台,没有GUI) . 所以.NET Core = .NET Standard Desktop特定的东西 .
UWP也使用它,新的ASP.NET核心也将它用作依赖 .
.NET Framework和.NET Core都是框架 .
.NET Standard是标准的(换句话说,规范) .
您可以使用.NET Framework和.NET Core制作可执行项目(如控制台应用程序或ASP.NET应用程序),但不能使用.NET Standard .
使用.NET Standard,您只能创建无法独立执行的类库项目,并且应该由另一个.NET Core或.NET Framework可执行项目引用 .
.Net标准主要用于改进代码共享,并使每个.Net实现中的API更加一致 .
在创建库时,我们可以定位as.Net Standard 2.0,这样创建的库就可以与不同版本的.Net Framework兼容,包括.Net Core,Mono ..