Wersja C # dla ArcObjects 9.3


10

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?


Jeśli docelowy framework 3.5 używasz C # 2.0 z rozszerzeniami. ArcEngine 10 musi być ukierunkowany na .NET 3.5, abyś mógł przegapić niektóre gadżety 4.0. Chciałem użyć kontrolki kalendarza wpf w mojej aplikacji, ale nie mogłem, bo to 4.0. Musiałem więc użyć winforms.
Patrick

Użyłem C # 4.0 do opracowania rozszerzenia dla ArcMap 10 z docelowym frameworkiem ustawionym na 3.5, więc zastanawiałem się, czy będzie on kompatybilny wstecz, o ile framework pozostanie 3.5. Czy powinienem zmienić rozszerzenie ArcMap 10 na C # 2.0, aby można je było ponownie skompilować za pomocą ArcMap 9 bez konieczności wprowadzania wielu zmian kodu? Czy C # 3.0 będzie działać z ArcMap 9?
Mike Rogers

Odpowiedzi:


13

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 returni yield breaknie 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.Dynamicprzestrzeni 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.


1
@SeaJunk, nie jest to w pełni poprawne. Nawet jeśli może nie być rozszerzenia ESRI SDK dla ArcGIS 9.3 / VS2010, nie powstrzyma Cię to od odwoływania się do zestawów ArcGIS i rozpoczęcia pisania kodu. Oznacza to, że nadal można używać tego IDE, tylko bardziej niewygodne. Może być również wymagana dodatkowa praca ręczna (rejestracja komponentów itp.), Ale znowu, jest to wykonalne AFAIK.
stakx

Tak przepraszam, właśnie to sprawdziłem :)
SeaJunk

Podałeś dobre wytłumaczenie, ale relacje są nieco bardziej złożone, ponieważ cechy wszystkich trzech (CLR, BCL i C #) są pod silnym wzajemnym wpływem.
Petr Krebs

Na marginesie, istnieje również kilka bardzo interesujących zabawnych faktów na temat ewolucji CLR i C #. Na przykład kowariancja i kontrawariancja ogólnych parametrów typu została wprowadzona w CLR 2.0, ale dopiero w C # 4, kiedy zaczął być obsługiwany przez język. Kolejny, nawiasem mówiąc, świetny przykład twojego punktu: LINQ, wprowadzony w C # 3, opiera się na metodach rozszerzenia, które można symulować w C # 2 za pomocą System.Runtime.CompilerServices.ExtensionAttribute.
Petr Krebs

1
Blog Erica Lipperta ( blogs.msdn.com/b/ericlippert ) jest wspaniałym źródłem informacji o różnych ciemnych zakątkach .NET / C # i decyzjach dotyczących ich projektu.
Petr Krebs

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.