Tôi có thể sử dụng C # 4.0 với khung mục tiêu được đặt thành .NET 3.5 để phát triển tiện ích mở rộng cho ArcMap 9.3 không? Hay nó phải là C # 3.0 hoặc sớm hơn?
Tôi có thể sử dụng C # 4.0 với khung mục tiêu được đặt thành .NET 3.5 để phát triển tiện ích mở rộng cho ArcMap 9.3 không? Hay nó phải là C # 3.0 hoặc sớm hơn?
Câu trả lời:
Câu trả lời ngắn: Theo kinh nghiệm của tôi, hoàn toàn không có vấn đề gì khi phát triển mã dựa trên .NET 3.5 cho ArcGIS 9.3 trong Visual Studio 2010 (với ngôn ngữ C # phiên bản 4), miễn là bạn nhắm mục tiêu rõ ràng vào .NET Framework 3.5. Phiên bản ngôn ngữ C # chủ yếu không liên quan ở đây.
PS: Câu trả lời này không đi sâu vào sự khác biệt tồn tại giữa việc phát triển tiện ích mở rộng ArcGIS cho phiên bản 9.3 và 10. (ESRI đã thực hiện một vài thay đổi lớn đối với mô hình bổ trợ, nhưng tôi cho rằng bạn biết về điều đó .)
Câu trả lời dài hơn: Bạn cần phân biệt giữa phiên bản ngôn ngữ C # và phiên bản Khung được nhắm mục tiêu.
Bạn có thể nghĩ về .NET Framework được tạo thành từ hai phần chính: CLR (Thời gian chạy ngôn ngữ chung) và BCL (Thư viện lớp cơ sở). Cái trước là "máy ảo", trong khi cái sau là thư viện lớp (chứa tất cả các loại mà bạn có thể tra cứu trên MSDN).
.NET Frameworks 2 cho đến 3.5 đều sử dụng cùng CLR (phiên bản 2), nghĩa là môi trường thực thi chưa thực sự phát triển. Những gì đã phát triển, tuy nhiên, là BCL. Nếu bạn đang chạy ứng dụng .NET 3.5 trên máy .NET 2, vấn đề chính sẽ không phải là "mã byte" (CIL) sẽ không tương thích (nó sẽ không), nhưng ứng dụng có thể tham khảo và sử dụng loại chưa có sẵn trong .NET 2 BCL.
Bây giờ, khi bạn bảo Visual Studio 2010 nhắm mục tiêu .NET Framework 3.5, nó sẽ đảm bảo rằng bạn sẽ không sử dụng các loại BCL từ bất kỳ phiên bản Framework nào sau này. Nó cũng sẽ đảm bảo rằng đầu ra mã của trình biên dịch C # sẽ không yêu cầu các tính năng chỉ có sẵn trong phiên bản CLR 4.
Phiên bản ngôn ngữ C # có rất ít liên quan đến tất cả điều này. Trình biên dịch C # thực sự làm gì để lấy mã nguồn của bạn và dịch nó sang ngôn ngữ lập trình cấp thấp hơn nhiều gọi là CIL (Ngôn ngữ trung gian chung). Một số cấu trúc ngôn ngữ C # nhất định sẽ không còn được nhận dạng trong CIL: Ví dụ: yield return
và yield break
không tồn tại trong CIL. Chúng được dịch đơn giản để thực hiện IEnumerator<T>
giao diện.
Để tổng hợp điều này: Phiên bản ngôn ngữ C # trở nên không liên quan ngay khi mã của bạn được biên dịch. Có gì là quan trọng là ...
liệu CIL / "bytecode" đầu ra có tương thích với .NET Framework được nhắm mục tiêu hay không (nếu bạn nhắm mục tiêu .NET 3.5, nó sẽ tương thích ngay cả với .NET 2 vì các lý do đã đề cập ở trên); và
liệu mã của bạn đề cập đến / sử dụng các loại có sẵn trong khung đích hay không.
Một ngoại lệ đáng chú ý (theo nghĩa là một cấu trúc ngôn ngữ C # yêu cầu một phiên bản cụ thể của khung; đây là trường hợp cuối cùng được giới thiệu bởi IIRC) có thể là từ khóa C # dynamic
. Nó có thể được biên dịch thành mã yêu cầu các loại từ System.Dynamic
không gian tên, chỉ có sẵn từ .NET 4. Nhưng đừng lo lắng: Nếu bạn đã thiết lập dự án Visual Studio 2010 của mình để nhắm mục tiêu .NET 3.5, bạn sẽ nhận được một lỗi trình biên dịch nếu bạn đang cố sử dụng những thứ không có sẵn hoặc tương thích với phiên bản .NET Framework cụ thể đó.
Hãy nhớ rằng VS2010 không phải là IDE được hỗ trợ để phát triển 9.3. Bạn sẽ không nhận được bất kỳ tài liệu tham khảo lắp ráp, trợ giúp hoặc tích hợp mẫu.
Tuy nhiên, bạn có thể làm cho nó hoạt động: http://forums.arcgis.com/threads/29935-VS2010-with-version-9.3.1