Могу ли я использовать C # 4.0 с целевым фреймворком, установленным на .NET 3.5, для разработки расширения для ArcMap 9.3? Или это должен быть C # 3.0 или более ранний?
Могу ли я использовать C # 4.0 с целевым фреймворком, установленным на .NET 3.5, для разработки расширения для ArcMap 9.3? Или это должен быть C # 3.0 или более ранний?
Ответы:
Краткий ответ: По моему опыту, не должно быть никаких проблем при разработке кода на основе .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.
Помните, что VS2010 не является поддерживаемой IDE для разработки 9.3. Вы не получите никаких ссылок на сборку, помощь или интеграцию шаблона.
Однако вы можете заставить его работать: http://forums.arcgis.com/threads/29935-VS2010-with-version-9.3.1