.NET Core ra đời từ 2016 và đến nay đã ra phiên bản 3. Hiện nay .NET Core cũng giành được sự ưu tiên so với .NET Framework – một nền tảng truyền thống đã ra đời từ 2001.
Trong thời gian gần đây xuất hiện rất nhiều thay đổi quan trọng đối với .NET Core, đặc biệt là .NET Core 3.0 (tháng 9/2019) và 3.1 (tháng 11/2019). Những sự thay đổi lớn này làm cho nhiều lập trình viên .NET bị rối. Nó càng dễ gây nhầm lẫn hơn cho những bạn chưa từng biết đến các công nghệ .NET và mong muốn theo học hướng công nghệ này.
Trong bài viết này chúng tôi sẽ cố gắng giải thích theo cách đơn giản nhất sự liên quan giữa hai nền tảng .NET Core và .NET Framework cũng như xu hướng phát triển trong tương lai của các nền tảng này.
Loạt bài “Các công nghệ phát triển ứng dụng Microsoft sinh viên nên biết”:
Phần 1 – Giới thiệu chung, .NET Framework, .NET Core, Ngôn ngữ, Công cụ
Phần 2 – Windows form, WPF, ASP.NET, ASP.NET Core, ADO.NET
Phần 3 – Phân biệt các nền tảng .NET Core, .NET Framework, .NET Standard
Phần 4 – .NET 5 – tương lai của các công nghệ .NET
.NET Framework – platform, framework, library
.NET Framework là một nền tảng (Platform) + các framework + hệ thống thư viện (Library) do Microsoft phát triển từ 2001. Đừng để từ “Framework” trong tên gọi gây nhầm lẫn. .NET Framework thực sự bao trùm nhiều định nghĩa.
Thứ nhất, .NET Framework là một nền tảng (platform) để thực thi ứng dụng.
Chương trình bạn viết bằng bất kỳ ngôn ngữ lập trình .NET nào sẽ dịch sang mã trung gian (Intermediate Language) dù chương trình ở dạng thư viện dll hoặc tự thực thi exe.
Khi chạy, mã IL sẽ được một trình biên dịch khác có tên gọi là Just-in-Time (JIT) compiler chuyển tiếp thành một dạng mã máy (machine instruction) và thực thi trong một môi trường khép kín do .NET quản lý. Mỗi trường thực thi này có tên gọi là Common Language Runtime.
Cả quy trình code – dịch sang mã IL – dịch sang mã máy – thực thi như vậy được gọi là toolchain của .NET Framework.
Thứ hai, .NET Framework tạo ra nhiều loại chương trình khung (framework) khác nhau giúp bạn nhanh chóng bổ sung những tính năng riêng để tạo thành chương trình hoàn chỉnh.
.NET Framework đã tạo khung xương cho nhiều loại ứng dụng khác nhau, bao gồm ứng dụng web (ASEP.NET), ứng dụng desktop (như Windows Forms, Windows Presentation Foundation), ứng dụng hướng dịch vụ (Windows Communication Foundation).
.NET Framework cung cấp hệ thống thư viện class khổng lồ chung mà tất cả các framework trên nó đều có thể sử dụng. Ngoài ra, với từng framework lại có hệ thống thư viện class hỗ trợ riêng. Đây chính là vai trò “thư viện” của .NET Framework.
Trên thực tệ, hệ thống thư viện của .NET Framework còn ảnh hưởng đến tất cả các ngôn ngữ hỗ trợ. Ví dụ ngôn ngữ lập trình C# chỉ có hệ thống cú pháp chứ không có hệ thống kiểu dữ liệu và thư viện của riêng mình. Tất cả những thứ này trong C# đều đến từ .NET Framework. Các kiểu dữ liệu của C# (như int, bool, char, v.v.) đều là những biệt danh (alias) của các kiểu dữ liệu đến từ .NET Framework (Int32, Boolean, Char, v.v.).
Dưới đây là minh họa toolchain của .NET Framework.
.NET Core là một hệ thống độc lập với .NET Framework
Khi bạn đã hiểu .NET Framework theo khía cạnh như trên, bạn sẽ cần hình dung tương tự về .NET Core.
.NET Core cũng là một hệ thống trọn vẹn bao gồm nền tảng dịch mã trung gian và thực thi ứng dụng, các framework để phát triển các loại ứng dụng, và là hệ thống thư viện hỗ trợ.
Hệ thống của .NET Core được xây dựng mới hoàn toàn và độc lập với .NET Framework.
Dưới đây là minh họa toolchaine của .NET Core.
Về mặt ý tưởng nó có những điểm tương tự như trong .NET Framework. Tuy nhiên nó không liên quan đến .NET Framework.
Thứ nhất, môi trường thực thi của .NET Core được gọi là CoreCLR. CoreCLR có thể chạy trên nhiều hệ điều hành. Hiện nay CoreCLR có thể hoạt động trên Windows, Linux và macOS.
CoreCLR sử dụng một trình biên dịch trung gian tương tự JIT compiler của .NET Framework. Mặc dù tên gọi giống nhau nhưng JIT compilter của .NET Core không phải là JIT của .NET Framework. JIT của .NET Core có thể dịch mã IL sang mã máy của 3 nền tảng nó hỗ trợ.
Một sự khác biệt nữa về runtime nằm ở chỗ, CoreCLR và mã máy được tải và kích hoạt bởi một tiến trình khác, dotnet.exe, trong khi CLR được kiểm soát bởi hệ điều hành Windows.
Với vai trò framework, .NET Core cung cấp khung sườn cho phát triển ứng dụng web (ASP.NET Core), phát triển ứng dựng desktop trên windows (Windows Forms và WPF, từ .NET Core 3.1). Về tính năng này, .NET Core và .NET Framework gần như tương đương nhau.
Với vai trò thư viện, .NET Core cũng cung cấp hệ thống class cho các ngôn ngữ nó hỗ trợ (hiện nay có C#, VB.NET và F#).
Tuy nhiên ở đây cần nhấn mạnh rằng:
Thứ nhất, hệ thống thư viện của .NET Core và .NET Framework là hoàn toàn độc lập nhau. Tuy nhiên chúng đều là các file chứa mã trung gian IL cho nên về lý thuyết chúng có thể sử dụng thư viện của nhau. Trên thực tế, bắt đầu từ .NET 2.0 bạn có thể tham chiếu tới các thư viện viết trên .NET Framework. Điều này giúp việc chuyển đổi sang .NET Core dễ dàng hơn.
Tuy nhiên, việc tham chiếu này cũng có giới hạn. Thư viện xây dựng trên .NET Framework sẽ không chạy được trên .NET Core nếu nó phụ thuộc vào những API không được .NET Core hỗ trợ.
Thứ hai, đội ngũ phát triển .NET Core sử dụng lại nguyên vẹn của các thư viện cơ bản của .NET Framework. Điều này giúp lập trình viên dễ dàng chuyển đổi từ .NET Framework sang .NET Core.
Lấy ví dụ, cả trong .NET Framework và .NET Core đều có class Console (System.Console), trong đó đều có các phương thức như Write, WriteLine, Read, ReadLine. Do vậy, nếu bạn đã thành thạo C# (trên .NET Framework), bạn tiếp tục sử dụng nó trên .NET Core mà không cần học thêm gì về ngôn ngữ lập trình nữa.
Nói chung, nếu bạn có thư viện ở dạng các POCO (Plain Olde C# Object) viết trên .NET Framework, bạn có thể dễ dàng tham chiếu tới và sử dụng nó trong project .NET Core.
Update: Hiện nay có cả những thư viện .NET Framework phức tạp như Entity Framework 6.3 có thể chạy trên .NET Core.
Để chia sẻ thư viện dùng chung phưc tạp hơn, bạn có thể dùng .NET Standard.
.NET Standard – chia sẻ code giữa các nền tảng
Đây là một tên gọi cũng như một “thể loại” gây nhiều nhầm lẫn và khó hiểu.
Như trên đã nói, .NET Core và .NET Framework khá khó khăn khi chia sẻ thư viện. Microsoft đưa ra một giải pháp – .NET Standard.
.NET Standard là một bộ đặc tả kỹ thuật (specification) về những API (tạm hiểu là những kiểu dữ liệu) chung mà tất cả các loại .NET phải thực thi.
Nếu bạn hiểu và phân biệt khái niệm interface và implementation trong C# thì .NET Standard có thể xem như là một dạng interface, còn .NET Core hay .NET Framework là những implementation khác nhau.
.NET Standard cho phép bạn viết các thư viện nhưng thư viện này khá đặc biệt: mã IL của nó không thực sự chứa code như các thư viện viết trên .NET Core hay .NET Framework!
Khi bạn sử dụng thư viện trong project của .NET Core, các class thực sự của .NET Core mới được “ghép” vào. Tương tự, khi bạn sử dụng nó trong project của .NET Framework, các class cụ thể của .NET Framework sẽ được đưa vào. Loại kỹ thuật này có tên gọi là type forwarding.
Như vậy, hiện nay có hai implementation cụ thể của .NET chạy trên máy desktop là .NET Core và .NET Framework. Ngoài ra có Xamarin/Mono chạy trên Android và iOS.
.NET Standard đóng vai trò là interface để thống nhất các thư viện mà các implementation cụ thể cần xây dựng. Qua đó giúp các nền tảng trên chia sẻ code với nhau.
Tuy nhiên, có lẽ sau một năm nữa sẽ không còn cần đến .NET Standard do sự ra đời của .NET 5.
.NET 5 – hợp nhất các nền tảng
.NET 5 là phiên bản thống nhất của tất cả các nền tảng .NET hiện có. Nói cách khác, khi .NET 5 ra đời thì bạn sẽ không cần phân biệt .NET Framework, .NET Core hay Xamarin nữa.
Microsoft có kế hoạch phát hành .NET 5 vào tháng 11/2020. Sau đó cứ mỗi năm sẽ phát hành một bản cập nhật lớn vào cuối năm.
Cùng với sự ra đời của .NET 5, các phiên bản hiện nay của .NET Core hay .NET Framework sẽ không tiếp tục được phát triển riêng rẽ nữa. .NET Core sẽ dừng ở phiên bản 3, .NET Framework sẽ dừng ở phiên bản 4.8.
Tuy nhiên, các nền tảng này sẽ vẫn được tiếp tục hỗ trợ trong thời gian dài tiếp theo để các nhà phát triển có thể chuyển đổi ứng dụng đang có sang các nền tảng mới, hoặc duy trì các hệ thống có sẵn.
Tên gọi .NET 5 phản ánh sự hợp nhất và kế thừa từ các nền tảng .NET hiện nay.
Tuy là một nền tảng hợp nhất, không phải tất cả các framework cho phát triển ứng dụng hiện nay đều sẽ xuất hiện trong .NET 5. Một số công nghệ (như Windows Communications Foundation, Workflow Foundation, Asp.net Web Forms, v.v.) sẽ không xuất hiện trên .NET 5.
Ngoài ra, .NET 5 cũng sẽ đưa thêm vào các công nghệ mới (như Blazor).
Kết luận
Đến đây có lẽ bạn cũng đã hình dung được đầy đủ sự khác biệt giữa .NET Framework, .NET Core, .NET Standard, cũng như tương lai của các công nghệ này.
Nếu bạn đã có kinh nghiệm phát triển ứng dụng trên bất kỳ nền tảng nào, việc chuyển đổi sang nền tảng khác là tương đối đơn giản.
Nếu bạn chưa từng biết đến hệ sinh thái .NET, bạn có thể bắt đầu với .NET Framework hoặc .NET Core với ngôn ngữ C#. Việc học lập trình C# cơ bản không có gì khác biệt trên các nền tảng này.
Tuy nhiên, sau đó bạn nên lựa chọn theo một nền tảng cụ thể. Xu hướng hiện nay đối với người mới bắt đầu là đi theo .NET Core. Bản thân .NET Core cũng là nền tảng gần gũi nhất với .NET 5 trong tương lai.
Trong thời gian tiếp theo, Tự học ICT sẽ lần lượt cung cấp các nội dung liên quan đến .NET Core.
Loạt bài “Các công nghệ phát triển ứng dụng Microsoft sinh viên nên biết”:
Phần 1 – Giới thiệu chung, .NET Framework, .NET Core, Ngôn ngữ, Công cụ
Phần 2 – Windows form, WPF, ASP.NET, ASP.NET Core, ADO.NET
Phần 3 – Phân biệt các nền tảng .NET Core, .NET Framework, .NET Standard
Phần 4 – .NET 5 – tương lai của các công nghệ .NET
+ Nếu bạn thấy site hữu ích, trước khi rời đi hãy giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.
+ Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.
+ Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.
Cảm ơn bạn!
Chi ơi cho mình hỏi câu hỏi như này: khi mình code c#trên visual studio mà máy mình cài netcore thì sau khi biên dịch ra file dll hoặc exe thì chuyển sang máy khác chỉ có .net framework thì có chạy đc không.mong bạn trả lời giúp
chay bthuong nhe ban
Một bài chia sẻ quá hữu ích cho người chưa từng biết về .NET mà bị rối như mình ạ, cảm ơn rất nhiều!