ความแตกต่างระหว่าง. NET Core,. NET Framework และ Xamarin คืออะไร


362

ขณะนี้ Microsoft มี. NET Core, .NET Framework และ Xamarin (Mono) ในตระกูล. NET

ดูเหมือนจะมีการทับซ้อนกันมากมายที่นี่ . NET ประเภทนี้แตกต่างกันอย่างไร เมื่อใดที่ฉันควรเลือกใช้. NET Core ในโครงการของฉันแทนที่จะเป็น. NET Framework หรือ Xamarin


2
เป็นคำถามที่ดี! นี่คือบทความเพิ่มเติมเกี่ยวกับ. net framework และ. net core pogsdotnet.blogspot.sg/2017/11/… ขอบคุณ!
Allan Chua

คำตอบ:


269

คุณควรใช้ .NET หลักแทนการ .NET Framework หรือ Xamarin ใน 6 ต่อไปนี้สถานการณ์โดยทั่วไปเป็นไปตามเอกสารที่นี่

1. ความต้องการข้ามแพลตฟอร์ม

เห็นได้ชัดว่าถ้าเป้าหมายของคุณคือมีแอพพลิเคชัน (เว็บ / บริการ) ที่ควรจะสามารถใช้งานข้ามแพลตฟอร์ม (Windows, Linux และ MacOS) ตัวเลือกที่ดีที่สุดในระบบนิเวศ. NET คือการใช้. NET Core เป็นรันไทม์ (CoreCLR ) และไลบรารีเป็นข้ามแพลตฟอร์ม อีกทางเลือกหนึ่งคือใช้โครงการโมโน

ตัวเลือกทั้งสองเป็นโอเพ่นซอร์ส แต่. NET Core ได้รับการสนับสนุนโดยตรงและเป็นทางการโดย Microsoft และจะมีการลงทุนจำนวนมากก้าวไปข้างหน้า

เมื่อใช้. NET Core ข้ามแพลตฟอร์มประสบการณ์การพัฒนาที่ดีที่สุดจะมีอยู่ใน Windows ด้วย Visual Studio IDE ซึ่งสนับสนุนคุณสมบัติการเพิ่มผลผลิตมากมายรวมถึงการจัดการโครงการการดีบักการควบคุมแหล่งข้อมูลการปรับโครงสร้างการแก้ไขที่หลากหลายรวมถึง Intellisense การทดสอบและอีกมากมาย แต่การพัฒนาที่หลากหลายก็รองรับการใช้ Visual Studio Code บน Mac, Linux และ Windows รวมถึงระบบภายในและการดีบัก แม้แต่บรรณาธิการบุคคลที่สามเช่น Sublime, Emacs, VI และทำงานได้ดีขึ้นและสามารถแก้ไขระบบ Intellisense โดยใช้โอเพ่นซอร์ส Omnisharp

2. Microservices

เมื่อคุณกำลังสร้างระบบไมโครเซอร์วิซที่ประกอบด้วยไมโครเซลเวอร์ขนาดเล็กแบบอิสระปรับขนาดได้แบบไร้รัฐหรือไร้รัฐประโยชน์ที่ยอดเยี่ยมที่คุณมีที่นี่คือคุณสามารถใช้เทคโนโลยี / กรอบ / ภาษาต่างๆในระดับบริการไมโคร ที่ช่วยให้คุณใช้วิธีการที่ดีที่สุดและเทคโนโลยีต่อพื้นที่ขนาดเล็กในระบบของคุณดังนั้นหากคุณต้องการสร้าง microservices ที่มีประสิทธิภาพและปรับขนาดได้คุณควรใช้. NET Core ในที่สุดหากคุณต้องการใช้ไลบรารี. NET Framework ใด ๆ ที่ไม่รองรับกับ. NET Core คุณสามารถสร้าง microservice นั้นด้วย. NET Framework และในอนาคตคุณอาจจะสามารถแทนที่ด้วย. NET แกน

แพลตฟอร์มโครงสร้างพื้นฐานที่คุณสามารถใช้ได้มีมากมาย ในอุดมคติสำหรับระบบไมโครบริการขนาดใหญ่และซับซ้อนคุณควรใช้ Azure Service Fabric แต่สำหรับ Microservices ไร้สัญชาติคุณสามารถใช้ผลิตภัณฑ์อื่น ๆ เช่น Azure App Service หรือ Azure Function

โปรดทราบว่า ณ เดือนมิถุนายน 2559 เทคโนโลยีทุกตัวใน Azure ไม่รองรับ. NET Core แต่การสนับสนุน. NET Core ใน Azure จะเพิ่มขึ้นอย่างมากในขณะนี้ที่. NET Core นั้นเปิดตัว RTM

3. ระบบที่มีประสิทธิภาพและปรับขนาดได้ดีที่สุด

เมื่อระบบของคุณต้องการประสิทธิภาพและความสามารถในการปรับขยายที่ดีที่สุดเพื่อให้คุณได้รับการตอบสนองที่ดีที่สุดไม่ว่าคุณจะมีผู้ใช้จำนวนเท่าใดก็ตามนั่นคือที่. NET Core และ ASP.NET Core ส่องแสงจริงๆ ยิ่งคุณสามารถทำอะไรกับโครงสร้างพื้นฐาน / ฮาร์ดแวร์ในจำนวนที่เท่ากันประสบการณ์ที่คุณมีต่อผู้ใช้ของคุณก็จะยิ่งมากขึ้นด้วยต้นทุนที่ต่ำลง

การปรับปรุงกฎหมายของ Moore สำหรับซีพียูเดี่ยวไม่ได้ใช้งานอีกต่อไป แต่คุณต้องทำมากขึ้นในขณะที่ระบบของคุณกำลังเติบโตและต้องการความสามารถในการปรับขนาดและประสิทธิภาพที่สูงขึ้นสำหรับผู้ใช้ที่มีความต้องการมากขึ้นทุกวันซึ่งมีจำนวนเพิ่มขึ้นอย่างทวีคูณ คุณต้องมีประสิทธิภาพมากขึ้นปรับให้เหมาะสมทุกที่และเพิ่มขนาดให้ดีขึ้นในกลุ่มของเครื่อง VMs และแกนประมวลผล CPU ในที่สุด มันไม่ได้เป็นเพียงเรื่องของความพึงพอใจของผู้ใช้ นอกจากนี้ยังสามารถสร้างความแตกต่างอย่างมากในต้นทุน / TCO นี่คือเหตุผลว่าทำไมจึงเป็นเรื่องสำคัญที่จะต้องพยายามให้มีประสิทธิภาพและขยายขีดความสามารถได้

ดังที่กล่าวไว้ถ้าคุณสามารถแยกชิ้นส่วนเล็ก ๆ ของระบบของคุณเป็น microservices หรือวิธีการแบบคู่อื่น ๆ แบบหลวม ๆ มันจะดีกว่าเพราะคุณจะไม่สามารถพัฒนาแต่ละชิ้นเล็ก ๆ / microservice ได้อย่างอิสระและมีระยะยาวที่ดีขึ้น ความคล่องตัวและการบำรุงรักษา แต่คุณจะสามารถใช้เทคโนโลยีอื่นใดในระดับบริการระดับไมโครถ้าสิ่งที่คุณต้องทำไม่สามารถทำงานร่วมกับ. NET Core ได้ และในที่สุดคุณจะสามารถ refactor มันและนำไปที่. NET Core เมื่อเป็นไปได้

4. การพัฒนารูปแบบบรรทัดคำสั่งสำหรับ Mac, Linux หรือ Windows

วิธีนี้เป็นทางเลือกเมื่อใช้. NET Core คุณสามารถใช้ Visual Studio IDE แบบเต็มได้ แต่ถ้าคุณเป็นนักพัฒนาซอฟต์แวร์ที่ต้องการพัฒนาด้วยเครื่องมือแก้ไขน้ำหนักเบาและการใช้บรรทัดคำสั่งอย่างหนัก NET Core ได้รับการออกแบบสำหรับ CLI มันมีเครื่องมือบรรทัดคำสั่งง่าย ๆ ที่มีอยู่บนแพลตฟอร์มที่รองรับทั้งหมดทำให้ผู้พัฒนาสามารถสร้างและทดสอบแอพพลิเคชั่นด้วยการติดตั้งเพียงเล็กน้อยบนเครื่องผู้พัฒนาห้องปฏิบัติการหรือเครื่องจักรที่ใช้งานจริง บรรณาธิการเช่น Visual Studio Code ใช้เครื่องมือบรรทัดคำสั่งเดียวกันสำหรับประสบการณ์การพัฒนาของพวกเขา และเช่นเดียวกับ Visual Studio ใช้เครื่องมือ CLI เดียวกัน แต่ซ่อนไว้เบื้องหลังประสบการณ์ IDE ที่สมบูรณ์ ตอนนี้นักพัฒนาสามารถเลือกระดับที่พวกเขาต้องการโต้ตอบกับห่วงโซ่เครื่องมือจาก CLI ไปยังตัวแก้ไขไปยัง IDE

5. ต้องการเคียงข้างกับ. NET เวอร์ชั่นต่อระดับแอปพลิเคชัน

หากคุณต้องการติดตั้งแอปพลิเคชั่นที่มีการพึ่งพาเฟรมเวิร์กเวอร์ชันต่าง ๆ ใน. NET คุณต้องใช้. NET Core ซึ่งให้ 100% เคียงข้างกันตามที่อธิบายไว้ก่อนหน้าในเอกสารนี้

6. แอพ Windows 10 UWP .NET

นอกจากนี้คุณอาจต้องการอ่าน:

  1. เมื่อใดที่ฉันไม่ควรใช้. NET Core
  2. เมื่อใดที่ฉันควรใช้. NET Framework 4.x แทนที่จะเป็น. NET Core
  3. เมื่อใดที่ฉันควรใช้ Xamarin แทนที่จะเป็น. NET Core

17
ทำไม asp.net Core จึงมีประสิทธิภาพมากกว่า ทำไมจะดีกว่าเมื่อคุณสร้าง microservices
Juan Zamudio

4
ตอนนี้ Visual Studio สำหรับ Mac ก็มีให้เช่นกัน ดังนั้นอีกหนึ่งจุดบวกต่อ. NET Core visualstudio.com/vs/visual-studio-mac
Husyn

8
ลิงก์ของคุณเสีย
shaneparsons

2
@JuanZamudio เวอร์ชั่นของเฟรมเวิร์กเป็นชั้นหินใหญ่ซึ่งแต่ละอันขึ้นอยู่กับเวอร์ชั่นก่อนหน้านี้ทันทีในห่วงโซ่การพึ่งพากลับไปเป็นเวอร์ชั่น 2.0 ซึ่งแทนที่ 1.1 ทั้งหมด ดังนั้นหากคุณใช้สิ่งใดก็ตามจาก 4.5 คุณจะต้องพึ่งพาทุกอย่างที่เคยกลับมาที่ 2.0 เฟรมเวิร์กหลักคือเพิ่มเติมเกี่ยวกับการเปลี่ยนโครงสร้างการอ้างอิงเพื่อกำจัดสัมภาระที่ไม่เกี่ยวข้องกว่าการเขียน API ใหม่ซึ่งส่วนใหญ่ แต่ไม่เปลี่ยนแปลงโดยสิ้นเชิง บางสิ่งก็ง่ายขึ้นอย่างมากมายเช่น EF Core
Peter Wone

ขอบคุณสำหรับคำตอบที่เป็นคำอธิบาย
Tolga Kartal

171

นี่คือวิธีที่ Microsoft อธิบาย:

.NET Framework, .NET Core, Xamarin

.NET Frameworkเป็นรสชาติ "เต็ม" หรือ "ดั้งเดิม" ของ. NET ที่เผยแพร่กับ Windows ใช้สิ่งนี้เมื่อคุณสร้างเดสก์ท็อป Windows หรือแอพ UWP หรือทำงานกับ ASP.NET 4.6 ขึ้นไป

.NET Coreเป็น. NET แบบข้ามแพลตฟอร์มที่ทำงานบน Windows, Mac และ Linux ใช้สิ่งนี้เมื่อคุณต้องการสร้างคอนโซลหรือเว็บแอปที่สามารถทำงานบนแพลตฟอร์มใดก็ได้รวมถึงภายในคอนเทนเนอร์ Docker ไม่รวมแอพ UWP / เดสก์ท็อปในปัจจุบัน

Xamarinใช้สำหรับสร้างแอพมือถือที่สามารถทำงานบน iOS, Android หรืออุปกรณ์ Windows Phone

โดยปกติ Xamarin จะทำงานบนMonoซึ่งเป็นรุ่นของ. NET ที่สร้างขึ้นเพื่อรองรับข้ามแพลตฟอร์มก่อนที่ Microsoft จะตัดสินใจข้ามแพลตฟอร์มกับ. NET Core อย่างเป็นทางการ เช่นเดียวกับ Xamarin แพลตฟอร์ม Unity ยังทำงานบน Mono


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


3
เมื่อใดก็ตามที่มีคนบอกว่า. NET Coreเป็นแพลตฟอร์มข้ามผู้พัฒนารายใหม่จะสับสน '. NET Core' รองรับUWP + ASP.NET Coreเท่านั้นและASP.NET Coreเป็นข้ามแพลตฟอร์มUWPไม่ได้เป็น
Hassan Tareq

@HassanTareq นั่นไม่ถูกต้องนัก .NET Core หมายถึงรันไทม์และไลบรารีที่สามารถทำงานบน Windows, Mac หรือ Linux ASP.NET Core เป็นแพลตฟอร์มข้ามเนื่องจาก. NET Core เป็นแพลตฟอร์มข้าม
Nate Barbettini

ถ้าคุณพูดถึงว่า. core ( รันไทม์และไลบรารี่ ) เป็นข้ามแพลตฟอร์มเราก็ไม่สามารถใช้แอพ UWP ใน Mac / Linux ได้ UWP ไม่ใช่ข้ามแพลตฟอร์มฉันคาดว่า UWP เป็นทางเลือกข้ามแพลตฟอร์มของ WPF (Xamarin.Forms is)
Hassan Tareq

@HassanTareq คำแนะนำที่ดีฉันได้แก้ไขคำตอบของฉัน
Nate Barbettini

1
แบบฟอร์ม Xamarin ทำงานเกือบทุกอย่างจากฐานรหัสเดียว เดสก์ท็อป Windows UWP, เดสก์ท็อป WPF, MacOS, iOS, Android และ Tizen (ทีวี) ค่าเริ่มต้นคือการกำหนดเป้าหมาย. NET Standard จากการใช้งานหลัก ช่วงเวลาที่ดี!
Sean Anderson

35

คุณสามารถอ้างอิงในบรรทัดนี้ - ความแตกต่างระหว่าง ASP.NET Core (.NET Core) และ ASP.NET Core (.NET Framework)

.NET Framework, .NET Core, Xamarin

ซามารินไม่ได้เป็นที่ถกเถียงกันเลย เมื่อคุณต้องการสร้างแอปมือถือ (iOS, Android และ Windows Mobile) โดยใช้ C # Xamarin เป็นทางเลือกเดียวของคุณ

.NET Frameworkรองรับ Windows และเว็บแอปพลิเคชัน วันนี้คุณสามารถใช้ Windows Forms, WPF และ UWP เพื่อสร้างแอปพลิเคชัน Windows ใน. NET Framework ASP.NET MVC ใช้เพื่อสร้างเว็บแอปพลิเคชั่นใน. NET Framework

.NET Coreเป็นเฟรมเวิร์กโอเพนซอร์สและข้ามแพลตฟอร์มใหม่เพื่อสร้างแอปพลิเคชันสำหรับระบบปฏิบัติการทั้งหมดรวมถึง Windows, Mac และ Linux .NET Core รองรับ UWP และ ASP.NET Core เท่านั้น UWP ใช้เพื่อสร้าง Windows 10 เป้าหมาย Windows และแอพพลิเคชั่นมือถือ ASP.NET Core ใช้เพื่อสร้างเว็บแอปพลิเคชันที่ใช้เบราว์เซอร์

คุณต้องการรายละเอียดเพิ่มเติมอ้างอิงลิงค์นี้
https://blogs.msdn.microsoft.com/dotnet/2016/07/15/net-core-roadmap/ https://docs.microsoft.com/en-us/dotnet/articles / มาตรฐาน / การเลือก-core กรอบเซิร์ฟเวอร์


12
  1. .NETเป็นระบบนิเวศน์ตามภาษาc #
  2. . NET Standard คือมาตรฐาน (กล่าวอีกนัยหนึ่งคือข้อมูลจำเพาะ) ของ. NET Ecosystem

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

  1. .NET Frameworkเป็นเฟรมเวิร์กที่ใช้. NETและสนับสนุน Windows และเว็บแอปพลิเคชัน

(คุณสามารถสร้างโครงการที่ปฏิบัติการได้ (เช่นแอปพลิเคชันคอนโซลหรือแอปพลิเคชัน ASP.NET) ด้วย. NET Framework

  1. ASP.NETเป็นเทคโนโลยีการพัฒนาโปรแกรมประยุกต์บนเว็บซึ่งสร้างขึ้นบน. NET Framework
  2. .NET หลักยังกรอบอยู่บนพื้นฐานของ.NET

เป็นกรอบโอเพ่นซอร์สและข้ามแพลตฟอร์มใหม่เพื่อสร้างแอปพลิเคชันสำหรับระบบปฏิบัติการทั้งหมดรวมถึง Windows, Mac และ Linux

  1. Xamarinเป็นกรอบในการพัฒนาแอพพลิเคชั่นมือถือข้ามแพลตฟอร์ม ( iOS, Android และ Windows Mobile ) โดยใช้C #

การสนับสนุนการใช้งาน. NET Standard [สีน้ำเงิน]และแพลตฟอร์มที่ทำงานได้ขั้นต่ำสำหรับการสนับสนุนอย่างเต็มรูปแบบของ. NET Standard (ล่าสุด: [ https://docs.microsoft.com/en-us/dotnet/standard/net-standard#net-implementation-net) สนับสนุน] )


ลงคะแนนสำหรับตาราง "ประวัติรุ่น" ไม่ใช่ "Version Version" ของ. net / standard หรือ core ที่คุณทำซ้ำ เป็นรุ่นแพลตฟอร์มที่ทำงานได้ขั้นต่ำที่คุณสามารถใช้ได้หากคุณต้องการจับคู่รุ่นมาตรฐาน. Net เฉพาะ EG: ถ้าคุณต้องการสนับสนุน. NET Standard 1.4 บน. NET เวอร์ชันต่ำสุดที่คุณสามารถใช้ได้คือ 4.6.1
shawty

ลงคะแนนลบออกตอนนี้คุณได้อัปเดตและบันทึกคำตอบของคุณอย่างถูกต้องแล้ว :-)
shawty

คิดว่าฉันจะพัฒนาบน Apple แทน ...
Richard Hammond

7

.NET 5จะเป็นเวอร์ชั่นรวมของ. NET Variants ทุกรุ่นที่จะมีขึ้นในเดือนพฤศจิกายน 2563 ดังนั้นจึงไม่จำเป็นต้องเลือกระหว่างตัวแปรอีกต่อไป ป้อนคำอธิบายรูปภาพที่นี่


1
มันเป็นเรื่องโกหก. .NET Core ไม่สามารถรองรับ WPF / WinForms บน Linux!
Vincent

นั่นเป็นความจริง แต่ตัวแปรอื่น ๆ ของ. NET ไม่สนับสนุนสิ่งนั้น ตัวเลือกสำหรับ. NET ของหายไปซึ่งเป็นสิ่งที่ดี
Yanlend

1

.NET Core เป็น. NET ปัจจุบันที่คุณควรใช้ในตอนนี้ (ฟีเจอร์เพิ่มเติม, บั๊กคงที่ ฯลฯ )

Xamarin เป็นแพลตฟอร์มที่ให้บริการโซลูชั่นสำหรับปัญหามือถือข้ามแพลตฟอร์มที่เข้ารหัสใน C # ดังนั้นคุณไม่จำเป็นต้องใช้ Swift แยกต่างหากสำหรับ IOS และจะใช้สำหรับ Android


2
ฉันจะบอกว่า. Net Core เป็นสิ่งที่คุณควรใช้หากคุณต้องทำงานบน Linux หรือ Linux และ Windows แต่คุณสามารถทำกรณีนี้สำหรับ Mono ได้เช่นกันฉันคิดว่า มันไม่ได้มีคุณสมบัติเพิ่มเติมอย่างแน่นอน ตามคำจำกัดความมันเป็นเพียง "แกน" บิตมันไม่มีบิตเฉพาะ Windows เท่านั้นดังนั้นคุณลักษณะที่น้อยลง และฉันแค่คาดเดา แต่ดูเหมือนว่า. Net Core จะมีข้อบกพร่องน้อยลง . Net Framework เปิดตัวในโลกมาเกือบสองทศวรรษแล้ว ฉันคิดว่ามันจะแข็งกระด้างในการต่อสู้ในตอนนี้ แต่นั่นเป็นเพียงการเดา
Jason Jason Boyd

แน่นอนว่ามันมีคุณสมบัติใหม่มากขึ้นเมื่อเร็ว ๆ นี้พวกเขาได้เพิ่มคลาสใหม่ที่จะไม่ถูกเพิ่มลงใน. NET 4.8 พวกเขายังพอร์ต WPF และ WinForms ที่จริงแล้วดูเหมือนว่า. NET Core สามารถแทนที่. NET Framework ดูเหมือนว่าจะมีประสิทธิภาพมากขึ้นเช่นกัน
asdf

0

Xamarin ใช้สำหรับแอปพลิเคชั่นโทรศัพท์ (ทั้ง IOS / Android) .NET Core ใช้สำหรับการออกแบบเว็บแอปพลิเคชันที่สามารถทำงานได้ทั้ง Apache และ IIS

นั่นคือความแตกต่างในสองประโยค


อืม .. นอกเหนือจากการขาดตัวเลือกที่ 3 (.net framework) มันไม่เป็นความจริงทั้งหมด . NET core สามารถใช้ได้กับทุกสิ่ง (เว็บ, เดสก์ท็อป, มือถือ, คลาวด์, เกม, IoT เป็นต้น) .NET Framework เป็นหน้าต่างศูนย์กลางและถูกปิดทั้งหมด Mono เป็นรุ่น. NET Framework ที่ใช้โอเพ่นซอร์ส (ขับเคลื่อนโดยชุมชน) ซึ่งใช้โดย Xamarin ซึ่งวางเครื่องมือข้ามแพลตฟอร์มบนมือถือของโมโน ในที่สุดซามารินจะถูกแทนที่โดย Blazor ซึ่งน่าจะเป็นไปได้มากที่สุด (ปัจจุบันคือกปภ. แต่ลูกผสมนั้นเป็นลูกผสมของแผนที่ถนน)
shox

มันเป็นเรื่องจริง Xamarin สำหรับแอปพลิเคชันมือถือ ฉันไม่คิดว่ามันจะถูกแทนที่ในไม่ช้า ASMX ยังคงใช้สำหรับบริการบนเว็บและรวมอยู่ใน Visual 2019
user10868910

-1

อัพเดทเมื่อพฤษภาคม 2019

คุณควรใช้. Net Core 3.0 และใหม่กว่าในการอัปเกรดเป็นรุ่นถัดไป. Net 5 สิ่งที่คุณต้องการคือเพียงหนึ่งแพลตฟอร์มแบบครบวงจร. Net5

จะมีเพียง. NET เพียงหนึ่งก้าวไปข้างหน้าและคุณจะสามารถใช้เพื่อกำหนดเป้าหมาย> Windows, Linux, macOS, iOS, Android, tvOS, watchOS และ WebAssembly และอื่น ๆ https://devblogs.microsoft.com/dotnet/introducing-net-5/


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