Czy mogę używać C # 4.0 z docelową strukturą ustawioną na .NET 3.5, aby opracować rozszerzenie ArcMap 9.3? Czy to musi być C # 3.0 lub wcześniejszy?
Czy mogę używać C # 4.0 z docelową strukturą ustawioną na .NET 3.5, aby opracować rozszerzenie ArcMap 9.3? Czy to musi być C # 3.0 lub wcześniejszy?
Odpowiedzi:
Krótka odpowiedź: z mojego doświadczenia nie powinno być absolutnie żadnego problemu przy tworzeniu kodu opartego na .NET 3.5 dla ArcGIS 9.3 w Visual Studio 2010 (z językiem C # wersja 4), pod warunkiem, że wyraźnie celujesz w .NET Framework 3.5. Wersja językowa C # jest tutaj w większości nieistotna.
PS: Ta odpowiedź nie dotyczy różnic, jakie istnieją między opracowaniem rozszerzenia ArcGIS dla wersji 9.3 i 10. (ESRI wprowadził kilka istotnych zmian w modelu dodatku, ale zakładam, że zdajesz sobie z tego sprawę .)
Dłuższa odpowiedź: należy rozróżnić wersję językową C # od docelowej wersji Framework.
Można sobie wyobrazić, że .NET Framework składa się z dwóch głównych części: CLR (Common Language Runtime) i BCL (biblioteka klas podstawowych). Pierwszy to „maszyna wirtualna”, a drugi biblioteka klas (zawierająca wszystkie typy, które można wyszukać w MSDN).
.NET Frameworks 2 do wersji 3.5 używają tego samego CLR (wersja 2), co oznacza, że środowisko wykonawcze tak naprawdę nie ewoluowało. Ewoluował jednak BCL. Jeśli uruchamiasz aplikację .NET 3.5 na komputerze .NET 2, głównym problemem nie będzie to, że „kod bajtowy” (CIL) będzie niezgodny (nie będzie), ale aplikacja może się odwoływać i używać typy, które nie były jeszcze dostępne w .NET 2 BCL.
Teraz, gdy powiesz Visual Studio 2010, aby celował w .NET Framework 3.5, upewni się, że nie będziesz używać typów BCL z żadnej późniejszej wersji Framework. Zapewni to również, że kod wyjściowy kompilatora C # nie będzie wymagał funkcji dostępnych tylko w wersji 4 CLR.
Wersja językowa C # ma bardzo niewiele wspólnego z tym wszystkim. Co naprawdę robi kompilator C #, aby pobrać kod źródłowy i przetłumaczyć go na znacznie niższy poziom języka programowania o nazwie CIL (Common Intermediate Language). Niektóre konstrukcje języka C # nie będą już rozpoznawane w CIL: Na przykład yield return
i yield break
nie istnieją w CIL. Są one po prostu tłumaczone na implementacje IEnumerator<T>
interfejsu.
Podsumowując: Wersja językowa w języku C # staje się nieistotna po skompilowaniu kodu. Co jest ważne ...
czy wyjściowy CIL / „bytecode” jest zgodny z docelowym .NET Framework (jeśli celujesz na .NET 3.5, będzie kompatybilny nawet z .NET 2 z wyżej wymienionych powodów); i
czy twój kod odwołuje się do / korzysta z typów dostępnych w ramach docelowych.
Jednym znaczącym wyjątkiem (w tym sensie, że konstrukcja języka C # wymaga określonej wersji frameworka; był to ostatni przypadek, w którym wprowadzono generyczne IIRC), może być słowem kluczowym C # dynamic
. Może być skompilowany do kodu, który wymaga typów z System.Dynamic
przestrzeni nazw, która jest dostępna tylko od .NET 4. Ale nie martw się: Jeśli skonfigurowałeś projekt Visual Studio 2010 do kierowania na .NET 3.5, powinieneś otrzymać błąd kompilatora, jeśli próbujesz użyć rzeczy, które są niedostępne lub zgodne z tą konkretną wersją .NET Framework.
Należy pamiętać, że VS2010 nie jest obsługiwanym środowiskiem IDE dla wersji 9.3. Nie otrzymasz żadnych odniesień do zespołu, pomocy ani integracji szablonu.
Możesz jednak sprawić, by działało: http://forums.arcgis.com/threads/29935-VS2010-with-version-9.3.1