.NET Standard vs .NET Core


240

Tôi đã đọc về sự khác biệt giữa .NET Standard và .NET Core, nhưng tôi thực sự không biết sự khác biệt đó là gì, hoặc khi nào nên chọn dự án thư viện .NET Standard và khi nào nên chọn dự án thư viện .NET Core.

Tôi đã đọc rằng .NET Standard là để đảm bảo rằng một bộ API luôn có sẵn, bất kể nền tảng được sử dụng (miễn là nền tảng đó tương thích với phiên bản .NET Standard mà tôi đã chọn). Nếu tôi không nhầm, điều này có nghĩa là tôi có thể tạo một thư viện lớp .NET Standard và sau đó sử dụng nó trên bất kỳ nền tảng nào tương thích với phiên bản .NET Standard mà tôi đã chọn.

Với .NET Core, tôi đã đọc được rằng nó cũng được dùng cho đa nền tảng, vì vậy nếu tôi chọn thư viện .NET Core thì dường như tôi cũng có thể sử dụng nó trên nhiều nền tảng, giống như .NET Standard.

Vì vậy, cuối cùng, tôi không thấy sự khác biệt. Khi nào nên sử dụng? sự khác biệt giữa chúng là gì?


33
Trong thuật ngữ mã: .net standard = interface, .net core = class; nếu bạn mã theo lớp, bạn sẽ nhận được nhiều phương thức hơn, v.v., nhưng bạn bị giới hạn ở loại cụ thể đó (và hậu duệ); nếu bạn sử dụng giao diện, bạn có thể có bề mặt nhỏ hơn, nhưng nó sẽ hoạt động chống lại việc triển khai tùy ý ... miễn là các triển khai đó làm những gì được mong đợi :) có, lõi .net nhắm mục tiêu vào nhiều nền tảng, nhưng có các triển khai khác của .net tiêu chuẩn
Marc Gravell

9
.NETSt Chuẩn là một sự thay thế cho PCL. Thư viện lớp di động đã giúp bạn viết một thư viện có thể chạy trên nhiều nền tảng (điện thoại, máy tính để bàn, cửa hàng, trình duyệt, xbox, v.v.). Nó không có quy mô rất tốt, chịu đựng tồi tệ từ n! vấn đề, vì vậy họ từ bỏ nó. .NETCore chỉ là khung công tác đầu tiên họ thực hiện, nó là dễ nhất, phần còn lại phải bắt kịp. Hãy nhớ rằng đây là một công việc đang tiến triển, những thay đổi lớn phía trước với .NETSt Chuẩn v2.0. Tiêu chuẩn để cai trị tất cả, bây giờ :)
Hans Passant

Vui lòng không thêm câu hỏi vào câu hỏi hiện có. Câu hỏi của bạn trong chỉnh sửa là riêng biệt cho điều này.
Jon Skeet

1
@JonSkeet Sau đó tôi nên mở một câu hỏi mới? Cám ơn đã khuyên nhủ. bởi vì lúc đầu tôi đã mở một câu hỏi mới về .net Core multi target và tôi đã bị từ chối vì họ nói đó là một câu hỏi trùng lặp.
Álvaro García

@ ÁlvaroGarcía: Vâng, nhưng hãy nói rõ - câu hỏi một câu hiện tại của bạn không rõ ràng với tôi.
Jon Skeet

Câu trả lời:


195

Tôi sẽ cố gắng làm rõ hơn những nghi ngờ của bạn và mở rộng câu trả lời của Jon Skeet.

.NET Standard là một đặc tả , do đó, một thư viện được biên dịch cho một phiên bản .NET Standard cụ thể có thể được sử dụng trong các triển khai .NET Standard khác nhau.

Như đã nói trong nhận xét khác của tôi, một sự tương tự tốt cho mối quan hệ giữa .NET Standard và các triển khai tiêu chuẩn .NET khác (.NET Core, .NET Framework, v.v.) là ý chính của David Fowler : Các phiên bản .NET Standard Interfaces, trong khi các khung là thực hiện các giao diện đó.

Sơ đồ đơn giản hóa này có thể giúp hiểu mối quan hệ này:

Tương tự giao diện tiêu chuẩn NET

Bất cứ điều gì nhắm mục tiêu NetCore10đều có quyền truy cập vào INetStandard15API API NetCore10 cụ thể (chẳng hạn như DotNetHostPolicy).

Tất nhiên thư viện này không thể được sử dụng trong các INetStandard15triển khai khác nhau (NetCore10 không thể chuyển đổi thành NetFramework462hoặc Mono46).

Thay vào đó, nếu bạn chỉ cần truy cập vào INetStandard15API (và nhắm mục tiêu đặc tả đó thay vì khung cụ thể) thì thư viện của bạn có thể được sử dụng bởi bất kỳ khung nào thực hiện nó ( NetCore10,NetFramework462 , vv)

Lưu ý: trong tương tự ban đầu, David Fowler đã sử dụng các giao diện cho cả phiên bản .NET Standard và triển khai khung. Tôi tin rằng việc sử dụng các giao diện và các lớp là, thay vào đó, trực quan hơn và thể hiện tốt hơn mối quan hệ giữa các đặc tả và các triển khai cụ thể.


2
Cảm ơn rất nhiều vì điều này. Nhưng tôi có một nghi ngờ. Nếu tiêu chuẩn .net là một giao diện và có thể được triển khai, ví dụ với khung .net và .net Core, khi tôi tạo thư viện lớp tiêu chuẩn .net và tôi sử dụng thư viện này trong một dự án khác, việc sử dụng khung nào, khung mạng hoặc .net Cốt lõi?
Álvaro García

8
Nó sẽ sử dụng việc thực hiện các ứng dụng được biên dịch (bất kể nó là gì). Nếu bạn biên dịch một ứng dụng lõi NET thì nó sẽ sử dụng các thư viện lõi NET (đó là một triển khai của tiêu chuẩn NET)
Federico Dipuma

5
Sơ đồ đó là một trợ giúp tuyệt vời trong việc minh họa mối quan hệ cốt lõi / tiêu chuẩn / khung.
jasper

Vì vậy, nếu tôi tạo một ứng dụng bảng điều khiển net461 và nhắm mục tiêu thư viện netst Chuẩn2.0, không có gì từ lib tiêu chuẩn đó giải quyết trong ứng dụng bảng điều khiển. Vì thế... ??
Trang web thẩm mỹ

2
Một bức tranh đáng giá ngàn lời nói
Nikaas

182

.NET Core là một triển khai của .NET Standard. Nó có sẵn trên nhiều hệ điều hành, nhưng đó không phải là điều tương tự - cũng có những triển khai khác của .NET Standard.

Vì vậy, nếu bạn tạo thư viện .NET Core, nó sẽ có quyền truy cập vào những thứ được triển khai trong .NET Core, nhưng không phải là một phần của .NET Standard và thư viện của bạn sẽ không tương thích với cái khác triển khai của .NET Standard, chẳng hạn như Xamarin, Tizen, khung máy tính để bàn .NET đầy đủ, v.v.

Tóm lại: để đạt được tính di động tối đa, hãy đặt thư viện của bạn nhắm mục tiêu .NET Standard.


5
@ ÁlvaroGarcía: Ý của bạn là "nó" nên tương thích với nhau? .NET Core 1.0? Không nhất thiết - vì .NET Core 1.0 vẫn có thể bao gồm những thứ bổ sung . Mục nhập đó có nghĩa là nếu bạn nhắm mục tiêu .NET Standard 1.6, bạn có thể chạy mã theo cả Mono 4.6 .NET Core 1.0.
Jon Skeet

4
Bạn không thể chạy một cụm .NET Core trên bất kỳ thứ gì khác ngoài .NET Core (CoreCLR & CoreFX). Bạn có thể chạy một tổ hợp .NET Standard trên bất kỳ khung nào đáp ứng các nghĩa vụ theo hợp đồng cho Tiêu chuẩn có liên quan (1.3, 1.6, 2.0, v.v.).
Đánh dấu Rendle

2
Đa nền tảng đề cập đến hệ điều hành, không phải khung.
Đánh dấu Rendle

15
Tương tự, hãy thử tưởng tượng .NET Standard như một Giao diện (ví dụ INetStandard16). Cả .NET Core 1.0 và Mono 4.6 đều thực hiện INetStandard16. Bạn không thể chuyển đổi .Net Core 1.0 sang Mono 4.6 (và ngược lại), nhưng mọi thứ sử dụng INetStandard16sẽ hoạt động trên cả hai. (tín dụng cho David Fowler )
Federico Dipuma

6
Điều này làm tôi ngạc nhiên. Những cái tên có vẻ ngược. Bạn sẽ nghĩ thứ gì đó có tên "cốt lõi" sẽ tối thiểu hơn trong hai ...
jpmc26

6

Thư viện .NET Core Class về cơ bản là một tập hợp con của thư viện .NET Framework, chỉ chứa ít API hơn. Việc bám vào thư viện .NET Core Class khiến việc chia sẻ mã giữa các thời gian chạy trở nên khó khăn. Mã này có thể không hoạt động cho thời gian chạy khác (Mono cho Xamarin), vì nó không có API mà bạn cần. Để giải quyết vấn đề này, có .NET Standard, đây chỉ là tập hợp các đặc tả cho bạn biết API nào bạn có thể sử dụng . Mục đích chính của .NET Standard là chia sẻ mã giữa các thời gian chạy. Và điều quan trọng là đặc điểm kỹ thuật này được thực hiện bởi tất cả các thời gian chạy. (.NET Framework, .NET Core và Mono cho Xamarin).

Vì vậy, nếu bạn chắc chắn rằng bạn sẽ chỉ sử dụng thư viện của mình cho các dự án .NET Core, bạn có thể bỏ qua .NET Standard, nhưng nếu có một cơ hội nhỏ mà mã của bạn sẽ được .NET Framework hoặc Mono sử dụng cho Xamarin thì tốt hơn dính vào tiêu chuẩn .NET

Cũng lưu ý rằng các phiên bản .NET Standard cao hơn chứa nhiều API hơn, nhưng các phiên bản thấp hơn được hỗ trợ bởi nhiều nền tảng hơn. Do đó, nếu bạn tạo thư viện .NET Standard mà bạn muốn chia sẻ giữa các thời gian chạy thì hãy nhắm mục tiêu phiên bản thấp nhất bạn có thể , giúp bạn tiếp cận hầu hết các nền tảng. Ví dụ: nếu bạn muốn chạy trên .NET Framework 4.5 và .NET Core 1.0, phiên bản .NET Standard cao nhất bạn có thể sử dụng là .NET Standard 1.1. Tham khảo bảng tuyệt vời này từ tài liệu để biết thêm thông tin về nó.

PS: Ngoài ra nếu bạn muốn chuyển đổi thư viện của mình sang .NET Standard, Trình phân tích tính di động của .NET có thể giúp bạn điều đó.


4

Tiêu chuẩn .NET là một đặc điểm kỹ thuật của API .NET dự định có sẵn trên các triển khai .NET. Điều này cho phép xác định bộ API BCL thống nhất cho tất cả các triển khai .NET.

Lõi .NET là một trong những triển khai .NET Standard như vậy. .NET Framework là một triển khai khác của .NET Standard.

Hình ảnh từ Blog .NET

nhập mô tả hình ảnh ở đây

Câu trả lời của Federicos cung cấp cho bạn tổng quan về đồ họa về cách mỗi khung phát triển với các phiên bản. Hãy xem sơ đồ dưới đây từ Microsoft Docs .

nhập mô tả hình ảnh ở đây

Nhắm mục tiêu .NET Standard tăng hỗ trợ nền tảng của bạn trong khi nhắm mục tiêu một nền tảng .NET cụ thể như .NET Core (hoặc .NET Framework) sẽ cho phép bạn sử dụng tất cả các tính năng nền tảng cho nền tảng đó.


2

Tiêu chuẩn .NET là một đặc tả của API mà tất cả các cài đặt .NET phải cung cấp. Nó mang lại tính nhất quán cho họ .NET và cho phép bạn xây dựng các thư viện mà bạn có thể sử dụng từ bất kỳ triển khai .NET nào. Nó thay thế PCL để xây dựng các thành phần dùng chung.

.NET Core là một triển khai của .NET Standard được tối ưu hóa để xây dựng các ứng dụng bảng điều khiển, ứng dụng web và dịch vụ đám mây bằng ASP.NET Core. SDK của nó đi kèm với một công cụ mạnh mẽ ngoài việc phát triển Visual Studio hỗ trợ quy trình phát triển dựa trên dòng lệnh đầy đủ. Bạn có thể tìm hiểu thêm về chúng tại aka.ms/netstiteriafaqaka.ms/netcore .


Ở trên, cùng với một lời giải thích rất rõ ràng về hầu hết những điều được thảo luận trong câu hỏi này có thể được tìm thấy trong bài viết cực kỳ hữu ích sau đây của Microsoft (MSDN - Tháng 9 năm 2017): .NET Standard - Làm sáng tỏ .NET Core và .NET Standard


0

Ý bạn là .NET Framework? Bởi vì tiêu chuẩn .NET là một triển khai, chẳng hạn như .NET Framework, .NET Core và Xamarin.

Tôi yêu .NET Core vì chúng tôi có thể lưu trữ nó trên Linux (sử dụng nginx theo kinh nghiệm của tôi). Nó khác với .NET framework mà bạn chỉ có thể lưu trữ trên IIS. Bạn có thể xem xét về ngân sách lưu trữ trong trường hợp này (Vì máy chủ windows đắt đối với tôi).

Trong phối cảnh môi trường phát triển , lõi .Net rất nhẹ. Vì vậy, bạn có thể sử dụng VSCode, Sublime, cho IDE (không chỉ studio trực quan).


0

Nói một cách đơn giản, tiêu chuẩn .NET được sử dụng để viết các dự án thư viện lớp biên dịch thành dll. .NET Core có thể được sử dụng để phát triển các ứng dụng web thực tế có thể chạy trên tất cả các hệ điều hành (Windows, Linux, MacOS). (Trong .NET Core 3, Microsoft đã cung cấp chức năng phát triển ứng dụng trên máy tính để bàn bằng WPF, nhưng giờ đây các ứng dụng này sẽ không phải là nền tảng chéo và sẽ chỉ chạy trên hệ thống windows. thư viện / dll có thể được sử dụng trong bất kỳ ứng dụng nào sử dụng .NET (.NET framework, .NET Core) có nghĩa là bạn có thể sử dụng chuẩn .NET với cả .NET framework và .NET core.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.