首页 文章

.NET Core和.NET标准类库项目类型有什么区别?

提问于
浏览
501

在Visual Studio中,您可以创建至少3种不同类型的类库:

  • 类库(.NET Framework)

  • 类库(.NET标准版)

  • 类库(.NET Core)

虽然第一个是我们已经拥有的是什么时候使用.NET标准和.NET Core类库类型 . 我最近在尝试multi-target different framework versionscreating a unit test project时被这种方式所困扰 .

那么, Class Library (.NET Standard)Class Library (.NET Core) 之间有什么区别,为什么两者都存在,何时我们应该使用另一个?

9 回答

  • 6

    .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中的框架 .

  • 0

    希望这有助于理解 relationship between .NET Standard API surface and other .NET platforms . 每个接口代表一个目标框架,方法代表该目标框架上可用的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
    }
    }
    

    Source

  • 357

    .Net Core Class Library Build 在 .Net Standard 之上 . 如果要实现可移植到 .Net Framework 的库, . Net CoreXamarin ,选择 .Net Standard Library

    .Net Core will ultimately implement .Net Standard 2Xamarin.Net Framework

    因此, .Net CoreXamarin.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 Standardset of APIs all .NET平台 have to implement . 这 unifies the .NET platformsprevents future fragmentation .

    • .NET Standard 2.0 将由 .NET Framework 实施, . NET CoreXamarin . 对于 .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

  • 239

    另一种解释差异的方法可能是现实世界的例子,因为我们大多数人都会使用现有的工具和框架(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标准库,用于处理我的应用程序的模型 .

    由于它是.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应用程序创建没有逻辑的视图 .

  • 50

    我们什么时候应该使用另一个?

    该决定是兼容性和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不兼容 .

    类库(.NET标准版)和类库(.NET Core)之间有什么区别?

    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表面区域(以兼容性为代价)并指定用于构建可执行文件的平台 .

  • 6

    所以简短的回答是:

    IAnimal == .NetStandard (General)
    ICat == .NetCore (Less General)
    IDog == .NetFramework (Specific / oldest and has the most features)
    
  • 4

    .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核心也将它用作依赖 .

  • 67

    .NET Framework和.NET Core都是框架 .

    .NET Standard是标准的(换句话说,规范) .

    您可以使用.NET Framework和.NET Core制作可执行项目(如控制台应用程序或ASP.NET应用程序),但不能使用.NET Standard .

    使用.NET Standard,您只能创建无法独立执行的类库项目,并且应该由另一个.NET Core或.NET Framework可执行项目引用 .

  • 5

    .Net标准主要用于改进代码共享,并使每个.Net实现中的API更加一致 .

    在创建库时,我们可以定位as.Net Standard 2.0,这样创建的库就可以与不同版本的.Net Framework兼容,包括.Net Core,Mono ..

相关问题