Версія C # для ArcObjects 9.3


10

Чи можу я використовувати C # 4.0 із цільовою рамкою, встановленою на .NET 3.5, щоб розробити розширення для ArcMap 9.3? Або це повинно бути C # 3.0 або раніше?


Якщо цільовий фреймворк 3.5, то ви використовуєте C # 2.0 з розширеннями. ArcEngine 10 повинен орієнтуватися на .NET 3.5, щоб ви пропустили 4,0 смаколиків. Я хотів використовувати керування календарем wpf у своєму додатку, але не зміг, оскільки це 4.0. Тому мені довелося скористатися формою winins.
патрік

Я використовував C # 4.0, щоб розробити розширення для ArcMap 10 з цільовою рамкою, встановленою на 3,5, тому мені було цікаво, чи буде воно сумісним назад, поки рамка залишилася 3,5. Чи варто змінити розширення ArcMap 10 на C # 2.0, щоб його можна було перекомпілювати за допомогою ArcMap 9 без необхідності вносити багато змін до коду? Чи буде C # 3.0 працювати з ArcMap 9?
Майк Роджерс

Відповіді:


13

Коротка відповідь: На мій досвід, не повинно виникнути жодних проблем при розробці коду на основі .NET 3.5 для ArcGIS 9.3 в Visual Studio 2010 (з мовою C # 4), якщо ви чітко орієнтуєтесь на .NET Framework 3.5. Версія мови C # тут здебільшого не має значення.

PS: Ця відповідь не входить у відмінності між розробкою розширення ArcGIS для версій 9.3 та 10. (ESRI внесла досить великі зміни в модель надбудови, але я припускаю, що ви знаєте про це .)

Більш довга відповідь: Вам потрібно розрізняти версію мови C # та цільову версію Framework.

Ви можете подумати про .NET Framework як про дві основні частини: CLR (загальна мова виконання) та BCL (Бібліотека базових класів). Перший - це "віртуальна машина", а останній - бібліотека класів (містить усі типи, які можна шукати на MSDN).

.NET Frameworks 2 до 3.5 всі використовують один і той же CLR (версія 2), тобто середовище виконання насправді не еволюціонувало. Однак, що розвинулося, це BCL. Якщо ви запускаєте додаток .NET 3.5 на машині .NET 2, основною проблемою буде не те, що "байт-код" (CIL) буде несумісним (він не буде), а в тому, що програма може посилатися і використовувати типи, які ще не були доступні в .NET 2 BCL.

Тепер, коли ви скажете Visual Studio 2010 орієнтуватися на .NET Framework 3.5, він переконається, що ви не будете використовувати типи BCL з будь-якої пізнішої версії Framework. Він також переконається, що для виведення коду компілятором C # не потрібні функції, доступні лише у CLR версії 4.

Мовна версія C # має дуже мало спільного з усім цим. Що компілятор C # дійсно робить це, щоб взяти ваш вихідний код і перекласти його на набагато нижчий рівень мови програмування, який називається CIL (Common Intermediate Language). Деякі конструкції мови C # більше не будуть впізнавані в CIL: Наприклад, yield returnі yield breakне існують у CIL. Вони просто переводяться в реалізацію IEnumerator<T>інтерфейсу.

Підсумовуючи це: Версія мови C # стає неактуальною, як тільки ваш код складений. Що це важливо ...

  • чи сумісний вихідний CIL / "байт-код" з цільовим .NET Framework (якщо ви орієнтуєтесь на .NET 3.5, він буде сумісний навіть з .NET 2 з причин, зазначених вище); і

  • чи стосується ваш код / ​​використовує типи, доступні в цільовій структурі.

Один помітний виняток (в тому сенсі, що конструкція мови C # вимагає певної версії фреймворку; це був останній випадок, коли введені дженерики IIRC) може бути ключовим словом C # dynamic. Це може бути складено з коду, який вимагає типів з System.Dynamicпростору імен, який доступний лише з .NET 4. Але не хвилюйтеся: якщо ви налаштували проект Visual Studio 2010 для націлювання на .NET 3.5, вам слід отримати помилка компілятора, якщо ви намагаєтесь використовувати матеріали, які недоступні або сумісні з цією конкретною версією .NET Framework.


1
@SeaJunk, це не зовсім коректно. Навіть якщо розширення ESRI SDK для ArcGIS 9.3 / VS2010 не може бути, це не зупинить вас від посилань на збірки ArcGIS і почати писати код. Тобто, використовувати цю IDE все ще можна, тільки більш незручно. Можливо, буде задіяно ще кілька ручних робіт (реєстрація компонентів тощо), але знову-таки це можливо AFAIK.
stakx

Так вибачте, просто подивився це :)
SeaJunk

Ви дали хороше пояснення, але відносини трохи складніші, оскільки особливості всіх трьох (CLR, BCL та C #) сильно впливають один на одного.
Петро Кребс

Як зауваження, також є кілька дуже цікавих цікавих фактів про еволюцію CLR та C #. Наприклад, в CLR 2.0 було введено коваріантність та протирівноважність параметрів загального типу, але це було не до C # 4, коли воно почало підтримуватися мовою. Ще один, до речі, чудовий приклад вашої точки зору: LINQ, введений в C # 3, покладається на методи розширення, які можна моделювати в C # 2 за допомогою System.Runtime.CompilerServices.ExtensionAttribute.
Петро Кребс

1
Блог Еріка Ліпперта ( blogs.msdn.com/b/ericlippert ) - прекрасний ресурс для різних темних куточків .NET / C # та рішень, що стоять за їх дизайном.
Петро Кребс

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.