Gig*_*igi 729 .net class-library .net-core .net-standard
在Visual Studio中,您可以创建至少3种不同类型的类库:
虽然第一个是我们多年来一直使用的,但我遇到的一个主要问题是何时使用.NET Standard和.NET Core类库类型.最近,当我尝试多目标不同的框架版本并创建一个单元测试项目时,我一直被这种做法所困扰.
那么,类库(.NET标准版)和类库(.NET Core)之间有什么区别,为什么两者都存在,什么时候应该使用另一个呢?
Sha*_*tin 539
我们什么时候应该使用另一个?
该决定是兼容性和API访问之间的权衡.
如果要增加与库兼容的应用程序数量,请使用.NET标准库,并且可以减少库可以访问的.NET API表面区域.
如果要增加库可以访问的.NET API表面区域,请使用.NET Core库,并且只允许.NET Core应用程序与库兼容即可.
例如,面向.NET Standard 1.3的库将与面向.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不兼容.
类库(.NET标准)和类库(.NET Core)之间有什么区别?
基于包的框架部分描述了差异.
兼容性:面向.NET Standard的库将在任何符合.NET标准的运行时上运行,例如.NET Core,.NET Framework,Mono/Xamarin.另一方面,面向.NET Core的库只能在.NET Core运行时上运行.
API表面区域:.NET标准库包含所有内容,NETStandard.Library而.NET Core库随附所有内容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表面区域(以兼容性为代价)并指定用于构建可执行文件的平台.
use*_*426 369
一对.NET核心类库是在内置的.Net标准.如果要实现可移植到.Net Framework的库,.Net Core和Xamarin,选择.Net标准库
.Net Core最终将实施.Net Standard 2(Xamarin和.Net Framework也将如此)
达网络核心,Xamarin和.Net框架可以,因此也被认定为调味剂的.NET标准
为了使您的代码共享和重用应用程序能够面向未来,您宁愿实现.Net标准库.
Microsoft还建议您使用.NET Standard而不是Portable Class Libraries.
引用MSDN作为权威来源,.Net标准旨在成为统一所有的一个图书馆.由于图片胜过千言万语,以下内容将使事情变得非常明确:
1.您当前的应用场景(碎片化)
像我们大多数人一样,您可能处于以下情况:(.NET Framework,Xamarin和现在.Net Core风格的应用程序)
2. .Net标准库将为您启用什么(跨框架兼容性)
实现.Net标准库允许跨所有这些不同风格的代码共享:
对于不耐烦:
有关一个表,以帮助了解您可以根据您打算运行的.NET平台来定义最高版本的.NET Standard,请转到此处.
资料来源:MSDN:介绍.Net标准版
小智 82
所以简短的回答是:
IAnimal == .NetStandard (General)
ICat == .NetCore (Less General)
IDog == .NetFramework (Specific / oldest and has the most features)
Run Code Online (Sandbox Code Playgroud)
Joe*_*orn 68
.Net Framework和.Net Core是.Net运行时的两种不同实现.Core和Framework(尤其是Framework)都有不同的配置文件,包括Microsoft为.Net创建的许多API和程序集的更大或更小(或只是简单的不同)选择,具体取决于它们的安装位置和配置文件.例如,通用Windows应用程序中提供的某些API与"普通"Windows配置文件中的API不同.即使在Windows上,您也可能拥有"客户端"配置文件与"完整"配置文件.此外,还有其他实现(如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中的框架.
bsi*_*ide 27
.NET Framework和.NET Core都是框架.
.NET Standard是标准的(换句话说,规范).
您可以使用.NET Framework和.NET Core制作可执行项目(如Console应用程序或ASP.NET应用程序),但不能使用.NET Standard.
使用.NET Standard,您只能创建无法独立执行的类库项目,并且应该由另一个.NET Core或.NET Framework可执行项目引用.
Mah*_*man 16
希望这有助于理解.NET Standard API表面与其他.NET平台之间的关系.每个接口代表一个目标框架,方法代表该目标框架上可用的API组.
namespace Analogy
{
// .NET Standard
interface INetStandard10
{
void Primitives();
void Reflection();
void Tasks();
void Xml();
void Collections();
void Linq();
}
interface INetStandard11 : INetStandard10
{
void ConcurrentCollections();
void LinqParallel();
void Compression();
void HttpClient();
}
interface INetStandard12 : INetStandard11
{
void ThreadingTimer();
}
interface INetStandard13 : INetStandard12
{
//.NET Standard 1.3 specific APIs
}
// And so on ...
// .NET Framework
interface INetFramework45 : INetStandard11
{
void FileSystem();
void Console();
void ThreadPool();
void Crypto();
void WebSockets();
void Process();
void Drawing();
void SystemWeb();
void WPF();
void WindowsForms();
void WCF();
}
interface INetFramework451 : INetFramework45, INetStandard12
{
// .NET Framework 4.5.1 specific APIs
}
interface INetFramework452 : INetFramework451, INetStandard12
{
// .NET Framework 4.5.2 specific APIs
}
interface INetFramework46 : INetFramework452, INetStandard13
{
// .NET Framework 4.6 specific APIs
}
interface INetFramework461 : INetFramework46, INetStandard14
{
// .NET Framework 4.6.1 specific APIs
}
interface INetFramework462 : INetFramework461, INetStandard15
{
// .NET Framework 4.6.2 specific APIs
}
// .NET Core
interface INetCoreApp10 : INetStandard15
{
// TODO: .NET Core 1.0 specific APIs
}
// Windows Universal Platform
interface IWindowsUniversalPlatform : INetStandard13
{
void GPS();
void Xaml();
}
// Xamarin
interface IXamarinIOS : INetStandard15
{
void AppleAPIs();
}
interface IXamarinAndroid : INetStandard15
{
void GoogleAPIs();
}
// Future platform
interface ISomeFuturePlatform : INetStandard13
{
// A future platform chooses to implement a specific .NET Standard version.
// All libraries that target that version are instantly compatible with this new
// platform
}
}
Run Code Online (Sandbox Code Playgroud)
Dev*_*vin 13
解释差异的另一种方法可能是在现实世界中的示例,因为我们大多数人都将使用现有工具和框架(Xamarin,Unity等)来完成这项工作。
因此,使用.NET Framework,您可以使用所有.NET工具,但只能针对Windows应用程序(UWP,Winforms,ASP.NET等)。由于.NET Framework是封闭源代码,因此无需太多处理。
使用.NET Core,您拥有较少的工具,但是您可以针对主要的桌面平台(Windows,Linux,Mac)。这在ASP.NET Core应用程序中特别有用,因为您现在可以在Linux中托管Asp.net(便宜的托管价格)。现在,由于.NET Core是开源的,因此在技术上可以为其他平台开发库。但是由于没有支持它的框架,所以我认为这不是一个好主意。
使用.NET Standard,您拥有甚至更少的工具,但您可以针对所有/大多数平台。您可以通过Xamarin来定位Mobile,甚至可以通过Mono / Unity来定位游戏机。
在实际的应用程序中,您可能需要使用所有这些。例如,我开发了具有以下架构的销售点应用程序:
共享服务器和客户端:
由于它是.NET标准库,因此可以在任何其他库中使用。
服务器端(Web API):
处理所有数据库连接的.NET Standard(也可以是Core)库。
一个处理Rest API并使用数据库库的.NET Core项目。
由于它是在.NET Core中开发的,因此我可以将应用程序托管在Linux服务器上。
客户端(带有WPF + Xamarin.Forms Android / IOS的MVVM):
一个处理客户端API连接的.NET Standard库。
一个处理ViewModels逻辑的.NET标准库。在所有视图中使用。
.NET Framework WPF应用程序,用于处理Windows应用程序的WPF视图。
一个处理Xamarin Forms视图的.NET标准库。
Xamarin Android和Xamarin IOS项目。
因此,您可以看到应用程序的客户端具有很大的优势,因为我可以重用.NET标准库(客户端API和ViewModels),并且只需为WPF,Xamarin和IOS应用程序创建没有逻辑的视图。
syd*_*ydd 10
.NET标准:将其视为一个大型标准库.当使用它作为依赖项时,您只能创建库(.DLL),而不是可执行文件.使用.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核心也将它用作依赖.
小智 8
.Net标准主要用于改进代码共享,并使每个.Net实现中的API更加一致.
在创建库时,我们可以定位as.Net Standard 2.0,这样创建的库就可以与不同版本的.Net Framework兼容,包括.Net Core,Mono ..