Versão C # para ArcObjects 9.3

10

Posso usar o C # 4.0 com a estrutura de destino definida como .NET 3.5 para desenvolver uma extensão para o ArcMap 9.3? Ou precisa ser C # 3.0 ou anterior?

Mike Rogers
fonte
Se a estrutura de destino 3.5, você está usando o C # 2.0 com extensões. O ArcEngine 10 precisa ter como alvo o .NET 3.5, para que você perca algumas vantagens de 4.0. Eu queria usar um controle de calendário wpf no meu aplicativo, mas não consegui, porque é 4,0. Então eu tive que usar o winforms.
Patrick
Eu estava usando o C # 4.0 para desenvolver uma extensão para o ArcMap 10 com a estrutura de destino definida como 3.5, e fiquei imaginando se seria compatível com a versão anterior, desde que a estrutura permanecesse 3.5. Devo alterar minha extensão do ArcMap 10 para C # 2.0 para que possa ser recompilada com o ArcMap 9 sem precisar fazer muitas edições de código? O C # 3.0 funcionará com o ArcMap 9?
Mike Rogers

Respostas:

13

Resposta curta: Na minha experiência, não deve haver absolutamente nenhum problema no desenvolvimento de código baseado no .NET 3.5 para ArcGIS 9.3 no Visual Studio 2010 (com linguagem C # versão 4), desde que você tenha como alvo explícito o .NET Framework 3.5. A versão da linguagem C # é principalmente irrelevante aqui.

PS: Esta resposta não entra nas diferenças existentes entre o desenvolvimento de uma extensão do ArcGIS para as versões 9.3 e 10. (A ESRI fez algumas mudanças importantes no modelo de suplemento, mas presumo que você esteja ciente disso). .)

Resposta mais longa: você precisa distinguir entre a versão do idioma C # e a versão do Framework direcionada.

Você pode pensar no .NET Framework como sendo composto de duas partes principais: o CLR (Common Language Runtime) e o BCL (Base Class Library). A primeira é a "máquina virtual", enquanto a segunda é a biblioteca de classes (contendo todos os tipos que você pode procurar no MSDN).

Todos os .NET Frameworks 2 até 3.5 usam o mesmo CLR (versão 2), ou seja, o ambiente de execução realmente não evoluiu. O que evoluiu, no entanto, é o BCL. Se você estiver executando um aplicativo .NET 3.5 em uma máquina .NET 2, o principal problema não será que o "bytecode" (CIL) seja incompatível (não será), mas que o aplicativo poderá se referir e usar tipos que ainda não estavam disponíveis no .NET 2 BCL.

Agora, quando você instruir o Visual Studio 2010 a direcionar para o .NET Framework 3.5, ele garantirá que você não use tipos de BCL de nenhuma versão posterior do Framework. Ele também garantirá que o código gerado pelo compilador C # não exija recursos disponíveis apenas na versão 4 do CLR.

A versão da linguagem C # tem muito pouco a ver com tudo isso. O que o compilador C # realmente faz para pegar seu código-fonte e traduzi-lo para uma linguagem de programação de nível muito mais baixo chamada CIL (Common Intermediate Language). Determinadas construções de linguagem C # não serão mais reconhecíveis no CIL: por exemplo, yield returne yield breaknão existem no CIL. Eles são simplesmente traduzidos para implementações da IEnumerator<T>interface.

Para resumir: A versão da linguagem C # se torna irrelevante assim que seu código é compilado. O que é importante é ...

  • se a saída CIL / "bytecode" é compatível com o .NET Framework de destino (se você direcionar o .NET 3.5, será compatível mesmo com o .NET 2 pelos motivos mencionados acima); e

  • se o seu código se refere / faz uso dos tipos disponíveis na estrutura de destino.

Uma exceção notável (no sentido de que uma construção da linguagem C # requer uma versão específica da estrutura; esse foi o último caso em que os genéricos foram introduzidos no IIRC) pode ser a palavra-chave C # dynamic. Pode ser compilado para código que requer tipos do System.Dynamicnamespace, disponível apenas desde o .NET 4. Mas não se preocupe: se você configurou seu projeto do Visual Studio 2010 para direcionar o .NET 3.5, você deve obter um erro do compilador se você estiver tentando usar coisas que não estão disponíveis ou são compatíveis com essa versão específica do .NET Framework.

stakx
fonte
1
@ SeaJunk, isso não está totalmente correto. Mesmo se não houver extensão ESRI SDK para o ArcGIS 9.3 / VS2010, isso não impedirá que você faça referência a montagens do ArcGIS e comece a escrever código. Ou seja, ainda é possível usar esse IDE, apenas mais desconfortável. Também pode haver mais trabalho manual envolvido (registrando componentes etc.), mas, novamente, é possível o AFAIK.
stakx
Yep muito, apenas olhou que se :)
SeaJunk
Você forneceu uma boa explicação, mas os relacionamentos são um pouco mais complexos, pois os recursos dos três (CLR, BCL e C #) são fortemente influenciados um pelo outro.
Petr Krebs
Como uma observação lateral, também existem alguns fatos interessantes muito interessantes sobre a evolução do CLR e C #. Por exemplo, covariância e contravariância em parâmetros de tipo genérico foram introduzidas no CLR 2.0, mas não foi até o C # 4 quando começou a ser suportado pelo idioma. Outro, aliás, um ótimo exemplo de seu argumento: o LINQ, introduzido no C # 3, conta com métodos de extensão, que podem ser simulados no C # 2 com o uso de System.Runtime.CompilerServices.ExtensionAttribute.
Petr Krebs
1
O blog de Eric Lippert ( blogs.msdn.com/b/ericlippert ) é um recurso maravilhoso em vários cantos escuros do .NET / C # e nas decisões por trás de seu design.
Petr Krebs