C # -Version für ArcObjects 9.3

10

Kann ich C # 4.0 mit dem auf .NET 3.5 festgelegten Zielframework verwenden, um eine Erweiterung für ArcMap 9.3 zu entwickeln? Oder muss es C # 3.0 oder früher sein?

Mike Rogers
quelle
Wenn das Ziel-Framework 3.5, verwenden Sie C # 2.0 mit Erweiterungen. ArcEngine 10 muss auf .NET 3.5 abzielen, damit Sie einige 4.0-Extras verpassen. Ich wollte ein wpf-Kalendersteuerelement in meiner App verwenden, konnte es aber nicht, da dies 4.0 ist. Also musste ich die Winforms eins verwenden.
Patrick
Ich habe C # 4.0 verwendet, um eine Erweiterung für ArcMap 10 mit dem Zielframework auf 3.5 zu entwickeln. Daher habe ich mich gefragt, ob es abwärtskompatibel ist, solange das Framework 3.5 bleibt. Sollte ich meine ArcMap 10-Erweiterung auf C # 2.0 ändern, damit sie mit ArcMap 9 neu kompiliert werden kann, ohne dass viele Codeänderungen vorgenommen werden müssen? Funktioniert C # 3.0 mit ArcMap 9?
Mike Rogers

Antworten:

13

Kurze Antwort: Nach meiner Erfahrung sollte es absolut kein Problem geben, .NET 3.5-basierten Code für ArcGIS 9.3 in Visual Studio 2010 (mit C # -Sprachenversion 4) zu entwickeln, solange Sie explizit auf .NET Framework 3.5 abzielen. Die C # -Sprachenversion ist hier meist irrelevant.

PS: Diese Antwort geht nicht auf die Unterschiede ein, die zwischen der Entwicklung einer ArcGIS-Erweiterung für die Versionen 9.3 und 10 bestehen. (ESRI hat einige wichtige Änderungen am Add-In-Modell vorgenommen, aber ich gehe davon aus, dass Sie sich dessen bewusst sind .)

Längere Antwort: Sie müssen zwischen der C # -Sprachenversion und der Ziel-Framework-Version unterscheiden.

Sie können sich vorstellen, dass .NET Framework aus zwei Hauptteilen besteht: der CLR (Common Language Runtime) und der BCL (Base Class Library). Ersteres ist die "virtuelle Maschine", während letzteres die Klassenbibliothek ist (die alle Typen enthält, die Sie in MSDN nachschlagen können).

.NET Frameworks 2 bis 3.5 verwenden alle dieselbe CLR (Version 2), dh die Ausführungsumgebung hat sich nicht wirklich weiterentwickelt. Was sich jedoch weiterentwickelt hat, ist die BCL. Wenn Sie eine .NET 3.5-Anwendung auf einem .NET 2-Computer ausführen, besteht das Hauptproblem nicht darin, dass der "Bytecode" (CIL) nicht kompatibel ist (dies ist nicht der Fall), sondern dass die Anwendung möglicherweise darauf verweist und diese verwendet Typen, die in der .NET 2 BCL noch nicht verfügbar waren.

Wenn Sie Visual Studio 2010 jetzt anweisen, auf .NET Framework 3.5 abzuzielen, wird sichergestellt, dass Sie keine BCL-Typen aus einer späteren Framework-Version verwenden. Außerdem wird sichergestellt, dass für den vom C # -Compiler ausgegebenen Code keine Funktionen erforderlich sind, die nur in der CLR-Version 4 verfügbar sind.

Die C # -Sprachenversion hat damit sehr wenig zu tun. Was der C # -Compiler wirklich tut, um Ihren Quellcode in eine viel niedrigere Programmiersprache namens CIL (Common Intermediate Language) zu übersetzen. Bestimmte C # -Sprachenkonstrukte sind in CIL nicht mehr erkennbar: Zum Beispiel yield returnund yield breakin CIL nicht vorhanden. Sie werden einfach in Implementierungen der IEnumerator<T>Schnittstelle übersetzt.

Um dies zusammenzufassen: Die C # -Sprachenversion wird irrelevant, sobald Ihr Code kompiliert wird. Was ist wichtig ist ...

  • ob die Ausgabe-CIL / "Bytecode" mit dem Ziel-.NET Framework kompatibel ist (wenn Sie auf .NET 3.5 abzielen, ist es aus den oben genannten Gründen auch mit .NET 2 kompatibel); und

  • ob Ihr Code auf Typen verweist / diese verwendet, die im Zielframework verfügbar sind.

Eine bemerkenswerte Ausnahme (in dem Sinne, dass ein C # -Sprachenkonstrukt eine bestimmte Version des Frameworks erfordert; dies war zuletzt der Fall, als Generika IIRC eingeführt wurden) könnte das C # -Schlüsselwort sein dynamic. Es kann zu Code kompiliert werden, der Typen aus dem System.DynamicNamespace erfordert , der erst seit .NET 4 verfügbar ist. Aber keine Sorge: Wenn Sie Ihr Visual Studio 2010-Projekt so eingerichtet haben, dass es auf .NET 3.5 abzielt, sollten Sie einen erhalten Compilerfehler, wenn Sie versuchen, Inhalte zu verwenden, die für diese bestimmte .NET Framework-Version nicht verfügbar oder mit dieser kompatibel sind.

stakx
quelle
1
@ SeaJunk, das ist nicht ganz richtig. Selbst wenn es möglicherweise keine ESRI SDK-Erweiterung für ArcGIS 9.3 / VS2010 gibt, hindert dies Sie nicht daran, auf ArcGIS-Assemblys zu verweisen und Code zu schreiben. Das heißt, es ist immer noch möglich, diese IDE zu verwenden, nur unangenehmer. Möglicherweise sind auch weitere manuelle Arbeiten erforderlich (Registrierung von Komponenten usw.), aber auch hier ist AFAIK machbar.
Stakx
Yep sorry, habe das gerade nachgeschlagen :)
SeaJunk
Sie haben eine gute Erklärung geliefert, aber die Beziehungen sind etwas komplexer, da die Merkmale aller drei (CLR, BCL und C #) stark voneinander beeinflusst werden.
Petr Krebs
Als Randnotiz gibt es auch einige sehr interessante interessante Fakten über die Entwicklung von CLR und C #. Zum Beispiel wurde Kovarianz und Kontravarianz bei generischen Typparametern in CLR 2.0 eingeführt, aber erst in C # 4 wurde es von der Sprache unterstützt. Ein anderes, übrigens ein gutes Beispiel für Ihren Standpunkt: LINQ, das in C # 3 eingeführt wurde, basiert auf Erweiterungsmethoden, die in C # 2 mithilfe von System.Runtime.CompilerServices.ExtensionAttribute simuliert werden können.
Petr Krebs
1
Eric Lipperts Blog ( blogs.msdn.com/b/ericlippert ) ist eine wunderbare Ressource für verschiedene dunkle Ecken von .NET / C # und Entscheidungen hinter deren Design.
Petr Krebs