.NET Standard vs .NET Core


240

ฉันได้อ่านเกี่ยวกับความแตกต่างระหว่าง. NET Standard และ. NET Core แต่ฉันไม่รู้จริง ๆ ว่าความแตกต่างคืออะไรหรือเมื่อใดที่จะเลือกโครงการไลบรารี. NET Standard และเมื่อใดควรเลือกโครงการไลบรารี. NET Core

ฉันได้อ่านแล้วว่า. NET Standard นั้นเพื่อให้แน่ใจว่าชุดของ API นั้นพร้อมใช้งานเสมอไม่ว่าจะใช้แพลตฟอร์มใด (ตราบเท่าที่แพลตฟอร์มนั้นเข้ากันได้กับเวอร์ชัน. NET Standard ที่ฉันเลือก) ถ้าฉันไม่เข้าใจผิดนี่หมายความว่าฉันสามารถสร้างไลบรารีคลาสของ. NET Standard แล้วใช้บนแพลตฟอร์มใด ๆ ที่เข้ากันได้กับรุ่น. NET Standard ที่ฉันเลือกไว้

ด้วย. NET Core ฉันได้อ่านว่ามันมีไว้สำหรับการใช้ข้ามแพลตฟอร์มเช่นกันดังนั้นถ้าฉันเลือกไลบรารี. NET Core ดูเหมือนว่าฉันสามารถใช้กับแพลตฟอร์มหลาย ๆ แบบได้เช่นเดียวกับ. NET Standard

ดังนั้นในตอนท้ายฉันไม่เห็นความแตกต่าง ฉันควรใช้อันไหน ความแตกต่างระหว่างพวกเขาคืออะไร?


33
ในแง่ของรหัส: .net standard = interface, .net core = class; หากคุณใช้รหัสกับชั้นเรียนคุณจะไม่ได้รับวิธีการเพิ่มเติม (ฯลฯ ) แต่คุณถูก จำกัด ประเภทที่เป็นรูปธรรมนั้น (และผู้สืบทอด) หากคุณใช้อินเทอร์เฟซคุณอาจได้พื้นผิวที่เล็กลง แต่มันจะทำงานกับการใช้งานโดยพลการ ... ตราบเท่าที่การใช้งานเหล่านั้นทำสิ่งที่คาดหวัง :) ใช่แล้ว. net core กำหนดเป้าหมายหลายแพลตฟอร์ม แต่มีการใช้งานอื่น ๆของ. net มาตรฐาน
Marc Gravell

9
.NETStandard เป็นสิ่งทดแทนสำหรับ PCL Portable Class Library ช่วยให้คุณเขียนไลบรารีที่สามารถทำงานบนแพลตฟอร์มมากกว่าหนึ่งแพลตฟอร์ม (โทรศัพท์เดสก์ท็อปร้านค้าเบราว์เซอร์ xbox ฯลฯ ) มันไม่ได้ปรับขนาดได้ดีมากทรมานจาก n! ปัญหาพวกเขาจึงทิ้งมันไป .NETCore เป็นเพียงกรอบงานแรกที่พวกเขาทำมันเป็นวิธีที่ง่ายที่สุดที่เหลือต้องติดตาม โปรดทราบว่านี่เป็นงานที่อยู่ระหว่างดำเนินการและมีการเปลี่ยนแปลงครั้งใหญ่โดยใช้. NETStandard v2.0 มาตรฐานในการปกครองพวกเขาทั้งหมดสำหรับตอนนี้ :)
ฮันส์ Passant

โปรดอย่าเพิ่มคำถามเพิ่มเติมให้กับคำถามที่มีอยู่ คำถามของคุณในการแก้ไขแยกจากกัน
Jon Skeet

1
@ JonSkeet ถ้าอย่างนั้นฉันควรจะเปิดคำถามใหม่? ขอบคุณสำหรับคำแนะนำ เพราะในตอนแรกฉันได้เปิดคำถามใหม่เกี่ยวกับ. net Core หลายเป้าหมายและฉันถูกลดระดับลงเพราะพวกเขากล่าวว่าเป็นคำถามที่ซ้ำกัน
ÁlvaroGarcía

@ ÁlvaroGarcía: ใช่ แต่ทำให้ชัดเจน - คำถามหนึ่งประโยคปัจจุบันของคุณไม่ชัดเจนสำหรับฉันเลย
Jon Skeet

คำตอบ:


195

ฉันจะพยายามชี้แจงข้อสงสัยของคุณเพิ่มเติมและขยายคำตอบของ Jon Skeet

.NET Standard เป็นข้อมูลจำเพาะดังนั้นไลบรารีที่รวบรวมสำหรับ. NET Standard เวอร์ชันเฉพาะสามารถใช้ในการใช้งาน. NET Standard แบบต่างๆ

ดังที่ได้กล่าวไว้ในความคิดเห็นอื่น ๆ ของฉันการเปรียบเทียบที่ดีสำหรับความสัมพันธ์ระหว่าง. NET Standard กับ. NET Standard Implementations (. NET Core,. NET Framework และอื่น ๆ ) เป็นส่วนสำคัญโดย David Fowler:. NET Standard version Interfacesในขณะที่เฟรมเวิร์ก การใช้งานของอินเทอร์เฟซเหล่านั้น

แผนภาพที่เรียบง่ายนี้อาจช่วยให้เข้าใจความสัมพันธ์นี้:

การเชื่อมต่อ NET Standard อินเตอร์เฟส

การกำหนดเป้าหมายใด ๆNetCore10มีสิทธิ์เข้าถึงINetStandard15API และ API NetCore10 เฉพาะ (เช่นDotNetHostPolicy)

แน่นอนว่าไลบรารีนี้ไม่สามารถใช้ในINetStandard15การใช้งานที่แตกต่างกัน( NetCore10ไม่สามารถแปลงเป็นNetFramework462หรือMono46)

หากคุณต้องการใช้INetStandard15API เท่านั้น(และกำหนดเป้าหมายนั้นแทนเฟรมเวิร์กที่เป็นรูปธรรม) ไลบรารีของคุณอาจถูกใช้โดยเฟรมเวิร์กใดก็ได้ที่ใช้มัน ( NetCore10, NetFramework462และอื่น ๆ )

หมายเหตุ:ในแบบดั้งเดิม David Fowler ใช้อินเทอร์เฟซสำหรับทั้ง. NET Standard version และ implementations frameworks ฉันเชื่อว่าการใช้อินเทอร์เฟซและคลาสเป็นเรื่องที่ใช้งานง่ายและแสดงถึงความสัมพันธ์ระหว่างข้อกำหนดและการใช้งานที่เป็นรูปธรรมได้ดีขึ้น


2
ขอบคุณมากสำหรับสิ่งนี้ แต่ฉันมีข้อสงสัย ถ้า. net standard เป็นอินเตอร์เฟสและสามารถนำไปใช้กับตัวอย่างเช่น. net framework และ. net Core เมื่อฉันสร้างไลบรารีคลาส. net มาตรฐานและฉันใช้ไลบรารีนี้ในโครงการอื่น คอร์?
ÁlvaroGarcía

8
มันจะใช้งานแอพพลิเคชั่นที่คอมไพล์แล้ว หากคุณรวบรวมแอป NET core จากนั้นจะใช้ห้องสมุดแกน NET (ซึ่งเป็นการใช้งานมาตรฐาน NET)
Federico Dipuma

5
ไดอะแกรมนั้นเป็นตัวช่วยที่ยอดเยี่ยมในการแสดงความสัมพันธ์หลัก / std / framework
แจสเปอร์

ดังนั้นถ้าฉันสร้างแอปคอนโซล net461 และกำหนดเป้าหมายไลบรารี netstandard2.0 จะไม่มีสิ่งใดจาก lib มาตรฐานที่แก้ไขในแอปคอนโซล ดังนั้น ...
Sinaesthetic

2
รูปภาพมีค่าหนึ่งพันคำ
Nikaas

182

.NET Core คือการนำมาตรฐาน. NET มาใช้ มันมีอยู่ในระบบปฏิบัติการหลายระบบ แต่ก็ไม่เหมือนกัน - มีการใช้งานอื่น ๆ ของ. NET Standard เช่นกัน

ดังนั้นหากคุณสร้างไลบรารี. NET Core จะสามารถเข้าถึงสิ่งต่าง ๆ ที่นำมาใช้ใน. NET Core แต่ไม่ได้เป็นส่วนหนึ่งของ. NET Standard และไลบรารีของคุณจะไม่สามารถทำงานร่วมกับการใช้งานอื่น ๆของ. NET Standard ได้ เช่น Xamarin, Tizen, กรอบงานเดสก์ท็อป. NET แบบเต็ม ฯลฯ

กล่าวโดยย่อ: เพื่อให้สามารถพกพาได้สูงสุดให้ตั้งค่าไลบรารี่เป้าหมาย. NET Standard ของคุณ


5
@ ÁlvaroGarcía: "คุณ" หมายถึงอะไรที่ควรเข้ากันได้? . NET Core 1.0 ไม่จำเป็น - เนื่องจาก. NET Core 1.0 ยังสามารถรวมสิ่งต่าง ๆเพิ่มเติมได้ รายการนั้นหมายความว่าหากคุณกำหนดเป้าหมาย. NET Standard 1.6 คุณสามารถเรียกใช้รหัสภายใต้ Mono 4.6 และ . NET Core 1.0
Jon Skeet

4
คุณไม่สามารถเรียกใช้แอสเซมบลี. NET Core บนสิ่งอื่นใดนอกจาก. NET Core (CoreCLR & CoreFX) คุณสามารถเรียกใช้แอสเซมบลี. NET มาตรฐานในกรอบใด ๆ ที่ตรงกับภาระผูกพันตามสัญญาสำหรับมาตรฐานที่เกี่ยวข้อง (1.3, 1.6, 2.0, ฯลฯ )
Mark Rendle

2
ข้ามแพลตฟอร์มหมายถึงระบบปฏิบัติการไม่ใช่กรอบงาน
Mark Rendle

15
ลองจินตนาการถึง. NET Standard เป็นส่วนต่อประสาน (เช่นINetStandard16) .NET หลัก 1.0 และ 4.6 INetStandard16โมโนทั้งการดำเนินการ คุณไม่สามารถแปลง. Net Core 1.0 เป็น Mono 4.6 (และในทางกลับกัน) แต่สิ่งใดก็ตามที่ใช้INetStandard16จะใช้ได้ทั้งสองอย่าง (ให้เครดิตแก่David Fowler )
Federico Dipuma

6
เรื่องนี้ทำให้ฉันประหลาดใจ ดูเหมือนชื่อจะถอยหลัง คุณจะคิดว่าสิ่งที่ชื่อว่า "core" จะน้อยที่สุดของทั้งสอง ...
jpmc26

6

. NET Core Class library นั้นเป็นส่วนหนึ่งของ. NET Framework library ซึ่งมี API น้อยกว่า การผสานกับ. NET Core Class Library ทำให้การแบ่งปันรหัสระหว่าง runtimes ทำได้ยาก รหัสนี้อาจใช้ไม่ได้กับรันไทม์อื่น (Mono for Xamarin) เนื่องจากไม่มี API ที่คุณต้องการ เพื่อแก้ปัญหานี้มี. NET Standard ซึ่งเป็นชุดข้อมูลจำเพาะที่แจ้งให้คุณทราบว่า API ใดที่คุณสามารถใช้ได้ วัตถุประสงค์หลักของ. NET Standard คือการแบ่งปันรหัสระหว่าง runtimes และเป็นสิ่งสำคัญที่ข้อมูลจำเพาะนี้นำไปใช้กับทุกช่วงเวลา (. NET Framework ,. NET Coreและ Mono สำหรับ Xamarin)

ดังนั้นหากคุณแน่ใจว่าคุณจะใช้ห้องสมุดของคุณสำหรับโครงการ. NET Core เท่านั้นคุณสามารถเพิกเฉยต่อ. NET Standard ได้ แต่หากมีโอกาสเล็กน้อยที่รหัสของคุณจะถูกใช้โดย. NET Framework หรือ Mono สำหรับ Xamarin เพื่อยึดมาตรฐาน. NET

นอกจากนี้โปรดทราบว่า. NET Standard เวอร์ชันที่สูงกว่าจะมี API มากขึ้น แต่เวอร์ชันที่ต่ำกว่าจะได้รับการสนับสนุนโดยแพลตฟอร์มเพิ่มเติม ดังนั้นหากคุณสร้างไลบรารี. NET Standard ที่คุณต้องการแชร์ระหว่าง runtimes ให้กำหนดเป้าหมายเวอร์ชันต่ำสุดที่คุณสามารถทำได้ซึ่งช่วยให้คุณเข้าถึงแพลตฟอร์มส่วนใหญ่ได้ ตัวอย่างเช่นถ้าคุณต้องการเรียกใช้บน. NET Framework 4.5 และ. NET Core 1.0 เวอร์ชัน. NET มาตรฐานสูงสุดที่คุณสามารถใช้ได้คือ. NET Standard 1.1 อ้างถึงตารางที่ยอดเยี่ยมนี้จากเอกสารประกอบสำหรับข้อมูลเพิ่มเติมเกี่ยวกับมัน

PS: ถ้าคุณต้องการแปลงไลบรารีของคุณเป็น. NET Standard ตัววิเคราะห์ความพกพา. NET ก็สามารถช่วยคุณได้


4

. NET Standardเป็นข้อมูลจำเพาะของ. NET APIs ที่มีอยู่ในการใช้งาน. NET สิ่งนี้ช่วยให้การกำหนดชุดที่สม่ำเสมอของ BCL APIs สำหรับการใช้งาน. NET ทั้งหมด

.NET Coreเป็นการนำมาตรฐาน. NET มาใช้อย่างหนึ่ง .NET Framework เป็นอีกหนึ่งการนำมาตรฐาน. NET มาใช้

ภาพจาก. NET บล็อก

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบของ Federicosจะให้ภาพรวมแบบกราฟิกของแต่ละเฟรมเวิร์กกับเวอร์ชัน ลองดูที่แผนภาพด้านล่างจาก Microsoft เอกสาร

ป้อนคำอธิบายรูปภาพที่นี่

การกำหนดเป้าหมาย . NET Standard จะเพิ่มการรองรับแพลตฟอร์มของคุณในขณะที่การกำหนดเป้าหมายแพลตฟอร์ม. NET เฉพาะเช่น. NET Core (หรือ. NET Framework) จะช่วยให้คุณสามารถใช้คุณสมบัติแพลตฟอร์มทั้งหมดสำหรับแพลตฟอร์มนั้นได้


2

. NET Standardเป็นข้อกำหนดของ API ที่การใช้งาน. NET ทั้งหมดต้องมี มันนำมาซึ่งความสอดคล้องกับตระกูล. NET และช่วยให้คุณสามารถสร้างไลบรารี่ที่คุณสามารถใช้งานได้จากการใช้. NET มันแทนที่ PCLs สำหรับการสร้างส่วนประกอบที่ใช้ร่วมกัน

.NET Coreคือการนำมาตรฐาน. NET ที่ปรับให้เหมาะสำหรับการสร้างแอปพลิเคชั่นคอนโซลเว็บแอพและบริการคลาวด์มาใช้ ASP.NET Core SDK มาพร้อมกับเครื่องมือที่มีประสิทธิภาพซึ่งนอกเหนือจากการพัฒนา Visual Studio รองรับเวิร์กโฟลว์การพัฒนาแบบบรรทัดคำสั่งแบบเต็ม คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับพวกเขาที่ aka.ms/netstandardfaqและaka.ms/netcore


ด้านบนพร้อมด้วยคำอธิบายที่ชัดเจนมากของสิ่งต่าง ๆ ที่กล่าวถึงในคำถามนี้สามารถพบได้ในบทความที่เป็นประโยชน์อย่างยิ่งต่อไปนี้โดย Microsoft (MSDN - กันยายน 2017) :. NET Standard -. Demystifying .NET Core และ. NET Standard


0

คุณหมายถึง. NET Framework หรือเปล่า เนื่องจากมาตรฐาน. NET เป็นการใช้งานเช่น. NET Framework,. NET Core และ Xamarin

ฉันรัก. NET Core เพราะเราสามารถโฮสต์บน Linux (ใช้ nginx ในประสบการณ์ของฉัน) มันแตกต่างจาก. NET Framework ซึ่งคุณสามารถโฮสต์บน IIS ได้เท่านั้น คุณสามารถพิจารณาเกี่ยวกับการโฮสต์งบประมาณในกรณีนี้ (เนื่องจากเซิร์ฟเวอร์ windows แพงสำหรับฉัน)

ในมุมมองของสภาพแวดล้อมการพัฒนาแกน. Net มีน้ำหนักเบา ดังนั้นคุณสามารถใช้ VSCode, Sublime สำหรับ IDE (ไม่เพียง แต่ visual studio)


0

กล่าวง่ายๆคือมาตรฐาน. NET ใช้สำหรับการเขียนโปรเจ็กต์ไลบรารีคลาสที่คอมไพล์เป็น dll .NET Core สามารถใช้สำหรับการพัฒนาเว็บแอปพลิเคชันจริงซึ่งสามารถทำงานได้กับทุกระบบปฏิบัติการ (Windows, Linux, MacOS) (ใน. NET Core 3 Microsoft ได้จัดเตรียมฟังก์ชั่นในการพัฒนาแอปเดสก์ท็อปโดยใช้ WPF แต่ตอนนี้แอพเหล่านี้จะไม่ข้ามแพลตฟอร์มและจะทำงานบนระบบ windows เท่านั้นในอนาคต Microsoft อาจทำให้แพลตฟอร์มข้ามแพลตฟอร์ม) library / dlls สามารถใช้ในแอปพลิเคชันใด ๆ ที่ใช้. NET (. NET Framework, .NET Core) ซึ่งหมายความว่าคุณสามารถใช้. NET มาตรฐานที่มีทั้ง. NET Framework และ. NET core

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.