Версия 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 calendar, но не смог, потому что это 4.0. Таким образом, я должен был использовать winforms один.
Патрик

Я использовал 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 (Common Language Runtime) и BCL (Base Class Library). Первый - это «виртуальная машина», а второй - библиотека классов (содержащая все типы, которые вы можете найти в 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 # не потребуются функции, доступные только в версии 4 CLR.

Языковая версия 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.