在Visual Studio中,至少有三种不同类型的类库可以创建:
类库(。净框架) 类库(。净标准) 类库(。净核心)
虽然第一种是我们已经使用多年的,但我一直困惑的一个主要问题是什么时候使用. net Standard和. net Core类库类型。最近当我尝试多目标不同的框架版本,并创建一个单元测试项目时,我就被这个问题咬了一口。
那么,类库(。NET标准)和类库(。NET Core),为什么两者都存在,什么时候我们应该使用其中一个而不是另一个?
在Visual Studio中,至少有三种不同类型的类库可以创建:
类库(。净框架) 类库(。净标准) 类库(。净核心)
虽然第一种是我们已经使用多年的,但我一直困惑的一个主要问题是什么时候使用. net Standard和. net Core类库类型。最近当我尝试多目标不同的框架版本,并创建一个单元测试项目时,我就被这个问题咬了一口。
那么,类库(。NET标准)和类库(。NET Core),为什么两者都存在,什么时候我们应该使用其中一个而不是另一个?
当前回答
. net标准的存在主要是为了改进代码共享,并使每个. net实现中可用的api更加一致。
在创建库时,我们可以将目标设置为。net Standard 2.0,这样所创建的库就可以兼容不同版本的。net Framework,包括。net Core、Mono等等。
其他回答
net核心 . net Core是一个免费的、跨平台的、开源的托管框架实现。它支持四种类型的应用程序:控制台、ASP。NET核心、云和通用Windows平台(UWP)。Windows窗体和Windows Presentation Foundation(WPF)不是. net Core的一部分。
从技术上讲,. net Core只支持控制台应用程序。ASP。NET Core和UWP是建立在。NET Core之上的应用程序模型。
与。net Framework不同,. net Core不被认为是Windows组件。因此,更新以NuGet包的形式出现,而不是通过Windows Update。由于. net Core运行时是App-Local安装的,并且应用程序是通过包管理器更新的,因此应用程序可以与特定的. net Core版本相关联并单独更新。
net标准 托管框架的每个实现都有自己的一组基类库。基类库(BCL)包含异常处理、字符串、XML、I/O、网络和集合等类。
. net标准是实现BCL的规范。由于. net实现需要遵循这个标准,应用程序开发人员不必担心每个托管框架实现的BCL的不同版本。
框架类库(FCL),如WPF, WCF和ASP。NET不是BCL的一部分,因此不包括在。NET标准中。
. net标准和. net实现之间的关系就像HTML规范和浏览器之间的关系一样。第二个是第一个的实现。
因此,. net Framework、Xamarin和. net Core都在它们的托管框架中实现了BCL的. net标准。由于计算机行业将继续引入新的硬件和操作系统,将会有新的。net托管框架。该标准允许应用程序开发人员知道将有一组他们可以依赖的一致api。
每个. net版本都有一个。net标准的相关版本。
通过提供一致的api,将应用程序移植到不同的托管实现以及提供工具变得更加容易。
. net Standard被定义为一个单独的NuGet包,因为所有的。net实现都需要支持它。使用工具变得更容易,因为工具有一组一致的api可用于给定的版本。您还可以为多个. net实现构建一个库项目。
您还可以为平台特定的api构建. net标准包装器。
net框架
Windows窗体,ASP。NET和WPF应用程序必须使用。NET Framework库开发。
net标准
Xamarin, iOS和Mac OS X应用程序必须使用.NET标准库开发
net核心
通用Windows平台(UWP)和Linux应用程序必须使用。net核心库开发。 API是用c++实现的,你可以使用c++, VB。NET, c#, f#和JavaScript语言。网
我希望这将有助于理解。net标准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
}
}
源
. net标准的存在主要是为了改进代码共享,并使每个. net实现中可用的api更加一致。
在创建库时,我们可以将目标设置为。net Standard 2.0,这样所创建的库就可以兼容不同版本的。net Framework,包括。net Core、Mono等等。
什么时候我们应该使用其中一种而不是另一种?
这个决定是兼容性和API访问之间的权衡。
当你想要增加与你的库兼容的应用程序的数量,并且你可以接受你的库可以访问的。net API表面积的减少时,使用。net标准库。
当你想要增加你的库可以访问的。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标准为目标的库可以在任何。net标准兼容的运行时上运行,比如。net Core、。net Framework、Mono/Xamarin。另一方面,以。net Core为目标的库只能在。net Core运行时上运行。
. NETStandard库包含了NETStandard中的所有东西。而. 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表面区域(以兼容性为代价),并指定构建可执行文件的平台。
下面是一个交互式矩阵,显示了。net标准支持哪些。net实现,以及有多少可用的API表面积。