Versione C # per ArcObjects 9.3


10

Posso usare C # 4.0 con il framework di destinazione impostato su .NET 3.5 per sviluppare un'estensione per ArcMap 9.3? O deve essere C # 3.0 o precedente?


Se il framework di destinazione 3.5 allora stai usando C # 2.0 con estensioni. ArcEngine 10 deve essere indirizzato a .NET 3.5 in modo da non perdere alcune chicche 4.0. Volevo usare un controllo calendario WPF nella mia app, ma non potevo perché è 4.0. Quindi ho dovuto usare quello winforms.
patrick,

Stavo usando C # 4.0 per sviluppare un'estensione per ArcMap 10 con il framework di destinazione impostato su 3.5, quindi mi chiedevo se sarebbe stato retrocompatibile fintanto che il framework rimanesse 3.5. Devo cambiare la mia estensione ArcMap 10 in C # 2.0 in modo che possa essere ricompilata con ArcMap 9 senza dover apportare molte modifiche al codice? C # 3.0 funzionerà con ArcMap 9?
Mike Rogers,

Risposte:


13

Risposta breve: Nella mia esperienza, non dovrebbe esserci assolutamente alcun problema nello sviluppo di codice basato su .NET 3.5 per ArcGIS 9.3 in Visual Studio 2010 (con linguaggio C # versione 4), purché si scelga esplicitamente il .NET Framework 3.5. La versione in linguaggio C # è per lo più irrilevante qui.

PS: Questa risposta non va nelle differenze esistenti tra lo sviluppo di un'estensione ArcGIS per le versioni 9.3 e 10. (ESRI ha apportato alcune modifiche importanti al modello di componente aggiuntivo, ma suppongo che tu ne sia consapevole .)

Risposta più lunga: è necessario distinguere tra la versione del linguaggio C # e la versione del framework di destinazione.

Puoi pensare a .NET Framework come costituito da due parti principali: CLR (Common Language Runtime) e BCL (Base Class Library). La prima è la "macchina virtuale", mentre la seconda è la libreria di classi (contenente tutti i tipi che è possibile cercare su MSDN).

.NET Frameworks 2 fino alla 3.5 utilizzano tutti lo stesso CLR (versione 2), ovvero l'ambiente di esecuzione non si è davvero evoluto. Ciò che si è evoluto, tuttavia, è il BCL. Se stai eseguendo un'applicazione .NET 3.5 su una macchina .NET 2, il problema principale non sarà che il "bytecode" (CIL) sarà incompatibile (non lo farà), ma che l'applicazione potrebbe fare riferimento e utilizzare tipi che non erano ancora disponibili in .NET 2 BCL.

Ora, quando dici a Visual Studio 2010 come target di .NET Framework 3.5, ti assicurerai che non utilizzerai i tipi BCL da nessuna versione successiva di Framework. Si assicurerà inoltre che il codice generato dal compilatore C # non richieda funzionalità disponibili solo nella versione 4 di CLR.

La versione in linguaggio C # ha ben poco a che fare con tutto questo. Cosa fa davvero il compilatore C # per prendere il tuo codice sorgente e tradurlo in un linguaggio di programmazione di livello molto basso chiamato CIL (Common Intermediate Language). Alcuni costrutti del linguaggio C # non saranno più riconoscibili in CIL: ad esempio, yield returne yield breaknon esistono in CIL. Sono semplicemente tradotti in implementazioni IEnumerator<T>dell'interfaccia.

Per riassumere: la versione del linguaggio C # diventa irrilevante non appena il codice viene compilato. Ciò che è importante è ...

  • se l'output CIL / "bytecode" è compatibile con .NET Framework di destinazione (se si sceglie .NET 3.5, sarà compatibile anche con .NET 2 per i motivi sopra menzionati); e

  • se il codice fa riferimento / utilizza i tipi disponibili nel framework di destinazione.

Una notevole eccezione (nel senso che un costrutto del linguaggio C # richiede una versione particolare del framework; questo è stato l'ultimo caso in cui sono stati introdotti i generici IIRC) potrebbe essere la parola chiave C # dynamic. Potrebbe essere compilato per codice che richiede tipi dallo System.Dynamicspazio dei nomi, che è disponibile solo da .NET 4. Ma non preoccuparti: se hai impostato il tuo progetto Visual Studio 2010 per targetizzare .NET 3.5, dovresti ottenere un errore del compilatore se si sta tentando di utilizzare elementi non disponibili o compatibili con quella particolare versione di .NET Framework.


1
@SeaJunk, questo non è completamente corretto. Anche se potrebbe non esserci un'estensione SDK ESRI per ArcGIS 9.3 / VS2010, ciò non impedisce di fare riferimento agli assembly ArcGIS e di iniziare a scrivere codice. Cioè, è ancora possibile usare quell'IDE, solo più a disagio. Potrebbero esserci anche altri lavori manuali (registrazione dei componenti ecc.) Ma, di nuovo, è possibile AFAIK.
stakx,

Sì scusa,
ho

Hai fornito una buona spiegazione, ma le relazioni sono un po 'più complesse, poiché le caratteristiche di tutti e tre (CLR, BCL e C #) sono fortemente influenzate l'una dall'altra.
Petr Krebs,

Come nota a margine, ci sono anche alcuni fatti divertenti molto interessanti sull'evoluzione di CLR e C #. Ad esempio, la covarianza e la contraddizione sui parametri di tipo generico sono stati introdotti in CLR 2.0, ma non è stato fino a C # 4 quando ha iniziato a essere supportato dal linguaggio. Un altro, tra l'altro un grande esempio del tuo punto: LINQ, introdotto in C # 3, si basa su metodi di estensione, che possono essere simulati in C # 2 con l'uso di System.Runtime.CompilerServices.ExtensionAttribute.
Petr Krebs,

1
Il blog di Eric Lippert ( blogs.msdn.com/b/ericlippert ) è una risorsa meravigliosa su vari angoli bui di .NET / C # e le decisioni dietro il loro design.
Petr Krebs,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.