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?


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.