Phiên bản C # cho ArcObjects 9.3


10

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?


Nếu khung mục tiêu 3.5 thì bạn đang sử dụng C # 2.0 với các tiện ích mở rộng. ArcEngine 10 cần nhắm mục tiêu .NET 3.5 để bạn bỏ lỡ một số tính năng 4.0. Tôi muốn sử dụng điều khiển lịch wpf trong ứng dụng của mình, nhưng tôi không thể vì đó là 4.0. Vì vậy, tôi đã phải sử dụng winforms một.
patrick

Tôi đã sử dụng C # 4.0 để phát triển tiện ích mở rộng cho ArcMap 10 với khung mục tiêu được đặt thành 3.5 vì vậy tôi tự hỏi liệu nó có tương thích ngược không, miễn là khung vẫn ở mức 3.5. Tôi có nên thay đổi tiện ích mở rộng ArcMap 10 của mình thành C # 2.0 để có thể được biên dịch lại với ArcMap 9 mà không phải thực hiện nhiều chỉnh sửa mã không? C # 3.0 có hoạt động với ArcMap 9 không?
Mike Rogers

Câu trả lời:


13

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 returnyield breakkhô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ì 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.Dynamickhô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ể đó.


1
@SeaJunk, điều này không hoàn toàn chính xác. Ngay cả khi có thể không có tiện ích mở rộng SDK ESRI cho ArcGIS 9.3 / VS2010, điều này sẽ không ngăn bạn tham khảo các hội đồng ArcGIS và bắt đầu viết mã. Đó là, vẫn có thể sử dụng IDE đó, chỉ khó chịu hơn. Cũng có thể có thêm một số công việc thủ công liên quan (đăng ký các thành phần, v.v.) nhưng một lần nữa, đó là khả thi AFAIK.
stakx

Yep xin lỗi, chỉ cần nhìn lên thôi :)
SeaJunk

Bạn đã cung cấp một lời giải thích tốt, nhưng các mối quan hệ phức tạp hơn một chút, vì các tính năng của cả ba (CLR, BCL và C #) bị ảnh hưởng rất nhiều bởi nhau.
Petr Krebs

Là một lưu ý phụ, cũng có một vài sự thật thú vị rất thú vị về sự phát triển của CLR và C #. Ví dụ, hiệp phương sai và chống đối với các tham số loại chung đã được giới thiệu trong CLR 2.0, nhưng phải đến C # 4 khi nó bắt đầu được ngôn ngữ hỗ trợ. Một ví dụ khác, tình cờ là một ví dụ tuyệt vời về quan điểm của bạn: LINQ, được giới thiệu trong C # 3, dựa trên các phương thức mở rộng, có thể được mô phỏng trong C # 2 với việc sử dụng System.R nb.CompilerService.ExtensionAttribution.
Petr Krebs

1
Blog của Eric Lippert ( blog.msdn.com/b/ericlippert ) là một tài nguyên tuyệt vời trên các góc tối khác nhau của .NET / C # và các quyết định đằng sau thiết kế của họ.
Petr Krebs

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.