Câu trả lời của Sparkie đã nhận nó, hãy để tôi bổ sung một chút.
".NET là nền tảng chéo" là một tuyên bố mơ hồ vì cả khuôn khổ và thế giới mà nó được tạo ra ban đầu đã thay đổi và phát triển.
Câu trả lời ngắn gọn là:
Công cụ cơ bản hỗ trợ .NET và các dẫn xuất của nó, Tiêu chuẩn cơ sở hạ tầng ngôn ngữ chung, là nền tảng chéo và nếu bạn muốn làm cho mã của mình chuyển sang nhiều nền tảng, bạn cần lên kế hoạch sử dụng API phù hợp trên nền tảng phù hợp để phân phối trải nghiệm tốt nhất trên mỗi nền tảng.
Gia đình CLI đã không thử phương pháp "Viết một lần, chạy mọi nơi", vì sự khác biệt từ điện thoại đến máy tính lớn là quá lớn. Thay vào đó, một vũ trụ gồm các tính năng API và thời gian chạy dành riêng cho nền tảng đã xuất hiện để cung cấp cho các nhà phát triển các công cụ phù hợp để tạo ra trải nghiệm tuyệt vời trong mỗi nền tảng.
Hãy nghĩ về nó: các lập trình viên không còn nhắm mục tiêu PC Windows hoặc Máy chủ Unix. Thế giới, hơn bao giờ hết được bao quanh bởi các nền tảng hấp dẫn từ PC, đến máy chơi game, điện thoại mạnh mẽ, hộp giải trí, máy chủ lớn và cụm máy phân tán. Một kích thước phù hợp trên tất cả các nền tảng sẽ chỉ cảm thấy cồng kềnh trên các thiết bị nhỏ và cảm thấy không đủ sức mạnh trên các hệ thống lớn .
Sản phẩm .NET Framework của Microsoft không phải là nền tảng chéo, nó chỉ chạy trên Windows. Có các biến thể của .NET Framework từ Microsoft chạy trên các hệ thống khác như Windows Phone 7, XBox360 và các trình duyệt thông qua Silverlight, nhưng tất cả chúng đều có cấu hình hơi khác nhau.
Ngày nay, bạn có thể nhắm mục tiêu mọi hệ điều hành chính, điện thoại, thiết bị di động, hệ thống nhúng và máy chủ với các công nghệ dựa trên .NET. Dưới đây là danh sách cho thấy việc triển khai CLI nào bạn sẽ sử dụng trong từng trường hợp (danh sách này không đầy đủ, nhưng sẽ bao gồm 99% các trường hợp):
- máy tính PC dựa trên x86 và x86-64:
- chạy Windows -> Thông thường bạn chạy .NET hoặc Silverlight nhưng bạn cũng có thể sử dụng Mono đầy đủ tại đây.
- chạy Linux, BSD hoặc Solaris -> Bạn chạy Mono hoặc Silverlight đầy đủ
- chạy MacOS X -> Bạn chạy Mono hoặc Silverlight đầy đủ
- chạy Android -> Bạn chạy tập hợp con Mono / Android
- Máy tính ARM:
- Chạy Windows Phone 7: bạn chạy Compact Framework 2010
- Chạy Windows 6.5 trở lên: bạn chạy Compact Framework cũ
- Thiết bị Android: bạn chạy Mono / Android
- Máy tính PowerPC:
- Bạn chạy Mono đầy đủ cho các hệ điều hành Linux, BSD hoặc Unix đầy đủ
- Bạn chạy Mono nhúng cho PS3, Wii hoặc các hệ thống nhúng khác.
- Trên XBox360, bạn chạy CompactFramework
- Máy tính S390, S390x, Itanium, SPARC:
- Các hệ điều hành nhúng khác:
- Bạn chạy .NET MicroFramework hoặc Mono với hồ sơ di động.
Tùy thuộc vào nhu cầu của bạn, những điều trên có thể là đủ hay không. Bạn sẽ khó có được mã nguồn giống nhau để chạy ở mọi nơi. Ví dụ: mã XNA sẽ không chạy trên mọi máy tính để bàn, trong khi phần mềm .NET Desktop sẽ không chạy trên XNA hoặc điện thoại. Thông thường bạn cần thay đổi mã của mình để chạy trong các cấu hình khác của .NET Framework. Dưới đây là một số hồ sơ tôi biết:
- Hồ sơ .NET 4.0
- Hồ sơ Silverlight
- Hồ sơ Windows Phone 7
- Hồ sơ XBox360
- Cấu hình lõi đơn - theo cấu hình .NET và có sẵn trên Linux, MacOS X, Solaris, Windows và BSD.
- .NET Micro Framework
- Hồ sơ cá nhân trên iPhone
- Mono trên hồ sơ Android
- Mono trên hồ sơ PS3
- Mono trên hồ sơ Wii
- Hồ sơ ánh trăng (tương thích với Silverlight)
- Cấu hình mở rộng của Moonlight (Truy cập API Silverlight + .NET 4 đầy đủ)
Vì vậy, mỗi một trong những hồ sơ đó thực sự hơi khác nhau, và đây không phải là một điều xấu. Mỗi cấu hình được thiết kế để phù hợp với nền tảng máy chủ của nó và hiển thị các API có ý nghĩa và loại bỏ các API không có ý nghĩa.
Chẳng hạn, API của Silverlight để kiểm soát trình duyệt máy chủ không có ý nghĩa trên điện thoại. Và các shader trong XNA không có ý nghĩa gì đối với phần cứng PC thiếu sự hỗ trợ tương đương cho nó.
Bạn càng sớm nhận ra rằng .NET không phải là một giải pháp để cách ly nhà phát triển khỏi các khả năng cơ bản của phần cứng và nền tảng gốc, bạn sẽ càng có lợi.
Điều đó bắt đầu, một số API và ngăn xếp có sẵn trong nhiều nền tảng, ví dụ ASP.NET có thể được sử dụng trên Windows, trên Linux, trên Solaris, trên MacOS X vì các API đó tồn tại cả trên .NET và Mono. ASP.NET không có sẵn trên một số nền tảng được hỗ trợ của Microsoft như XBox hoặc Windows Phone 7 và không được hỗ trợ trên các nền tảng khác mà Mono hỗ trợ như Wii hoặc iPhone.
Thông tin sau chỉ chính xác vào ngày 21 tháng 11 và nhiều điều trong thế giới Mono có thể sẽ thay đổi.
Các nguyên tắc tương tự có thể được áp dụng cho các ngăn xếp khác, một danh sách đầy đủ sẽ yêu cầu một bảng thích hợp, mà tôi không biết làm thế nào để trình bày ở đây, nhưng đây là danh sách các công nghệ có thể không có trên một nền tảng cụ thể. Bạn có thể cho rằng mọi thứ không được liệt kê ở đây đều khả dụng (vui lòng gửi cho tôi các chỉnh sửa cho những thứ tôi bỏ lỡ):
Core Runtime Engine [ở mọi nơi]
- Reflection.Emit Support [ở mọi nơi, ngoại trừ WP7, CF, Xbox, MonoTouch, PS3]
- Hỗ trợ CPU SIMD [Linux, BSD, Solaris, MacOS X; Sắp có PS3, MonoTouch và MonoDroid]
- Tiếp tục - Mono.Tasklets [Linux, BSD, Solaris, MacOS, PS3, Wii]
- Dỡ bỏ hội [chỉ dành cho Windows]
- VM tiêm [Linux, BSD, MacOS X, Solaris]
- DLR [Windows, Linux, MacOS X, Solaris, MonoDroid]
- Generics [một số hạn chế trên PS3 và iPhone].
Ngôn ngữ
- C # 4 [ở mọi nơi]
- Trình biên dịch C # dưới dạng dịch vụ (Linux, MacOS, Solaris, BSD, Android)
- IronRuby [ở mọi nơi, thực hiện WP7, CF, Xbox, MonoTouch, PS3]
- IronPython [ở mọi nơi, thực hiện WP7, CF, Xbox, MonoTouch, PS3]
- F # [ở mọi nơi, thực hiện WP7, CF, Xbox, MonoTouch, PS3]
Ngăn xếp máy chủ
- ASP.NET [Windows, Linux, MacOS, BSD, Solaris]
- ADO.NET [ở mọi nơi]
- LINQ to SQL [ở mọi nơi]
- Khung thực thể [ở mọi nơi]
- Ngăn xếp XML lõi [ở mọi nơi]
- Tuần tự hóa XML [ở mọi nơi, ngoại trừ WP7, CF, Xbox)
- LINQ to XML (ở mọi nơi)
- System.Json [Silverlight, Linux, MacOS, MonoTouch, MonoDroid]
- System.Messaging [Windows; trên Linux, MacOS và Solaris yêu cầu RabbitMQ]
- Dịch vụ doanh nghiệp .NET 1 [chỉ dành cho Windows]
- WCF [hoàn thành trên Windows; tập hợp nhỏ trên Silverlight, Solaris, MacOS, Linux, MonoTouch, MonoDroid]
- Dòng công việc Windows [chỉ dành cho Windows]
- Nhận dạng không gian thẻ [chỉ dành cho Windows]
Ngăn xếp GUI
- Silverlight (Windows, Mac, Linux - với Moonlight)
- WPF (chỉ dành cho Windows)
- Gtk # (Windows, Mac, Linux, BSD)
- Windows.Forms (Windows, Mac, Linux, BSD)
- MonoMac - Tích hợp Mac gốc (chỉ dành cho máy Mac)
- MonoTouch - Tích hợp iPhone gốc (chỉ dành cho iPhone / iPad)
- MonoDroid - Tích hợp Android gốc (chỉ dành cho Android)
- API trung tâm truyền thông - Chỉ dành cho Windows
- Sự lộn xộn (Windows và Linux)
Thư viện đồ họa
- GDI + (Windows, Linux, BSD, MacOS)
- Thạch anh (MacOS X, iPhone, iPad)
- Cairo (Windows, Linux, BSD, MacOS, iPhone, iPad, MacOS X, PS3, Wii)
Thư viện Mono - Đa nền tảng, có thể được sử dụng trong .NET nhưng yêu cầu xây dựng thủ công
- Trình biên dịch C # 4 như một dịch vụ
- Cecil - Thao tác CIL, quy trình làm việc, thiết bị của CIL, Linker
- Thư viện thư giãn
- Mono.Data. * Nhà cung cấp cơ sở dữ liệu
- Full System.Xaml (để sử dụng trong các thiết lập trong đó .NET không cung cấp ngăn xếp)
MonoTouch có nghĩa là Mono chạy trên iPhone; MonoDroid có nghĩa là Mono chạy trên Android; Các cổng PS3 và Wii chỉ dành cho các nhà phát triển đủ điều kiện của Sony và Nintendo.
Tôi xin lỗi vì sự thiếu hình thức.