Este artigo foi traduzido por máquina.

Instintos básicos

Criando aplicativos Visual Basic multiplataforma no Visual Studio 2010

Spotty Bowles

Antes para o Visual Studio 2008, escrever aplicativos direcionados a diferentes versões do Microsoft .NET Framework necessária a instalação de versões diferentes do ambiente de desenvolvimento do Visual Studio. Cada instalação do Visual Studio oferecida uma experiência de desenvolvedor diferente e usado o espaço em disco significativa. Além disso, o formato de arquivo de projeto alterado entre cada versão do Visual Studio. Como resultado, você poderia acabar com várias versões de um projeto ou solução durante o desenvolvimento de um componente para uso em projetos destinados a diferentes versões do .NET Framework.

O Visual Studio 2008 foi a primeira versão para suportar totalmente multi-direcionamento dentro de um único IDE, que permitia que os desenvolvedores escrevam aplicativos destinados a diferentes versões do .NET Framework (2. 0, 3. 0 e 3. 5) usando uma única instalação do Visual Studio. O resultado? Uma experiência de desenvolvedor único, consistente com os requisitos de redução de espaço em disco.

Multi-direcionamento no Visual Studio 2008 trabalhou por cada uma das estruturas de disponíveis usado o mesmo CLR de base 2. 0. Além disso, cada versão do framework foi desenvolvido com a base do .NET Framework 2. 0, fornecendo funcionalidade adicional através do uso de referência de módulos (assemblies). Enfim, todas as usadas o compilador do Visual Basic .NET Framework 3. 5 da linha de comando (vbc.exe).

Neste artigo abordo os compiladores 3. 5 e 4, referindo-se para os compiladores instalados como parte das instalações de 4 e o respectivo .NET Framework 3. 5. O compilador 3. 5 é a versão que acompanha o Visual Studio 2008 e do Visual Basic 9, enquanto o compilador 4 é a versão fornecida com o Visual Studio 2010 e 10 do Visual Basic.

Assim, let’s levar uma olhada como multi-direcionamento funciona no Visual Studio hoje em dia e a maneira como você aborda multi-direcionamento em seus projetos.

Multi-direcionamento no Visual Studio

No Visual Studio 2008, a alteração da estrutura de destino desejado foi tão simples como selecionar o destino de uma lista drop-down nas propriedades do projeto, conforme mostrado no do Figura 1. Isso adicionado ou removido referências específicas necessárias para cada versão da estrutura e feito estruturas variáveis simples.

image: Changing the Desired Target Framework in Visual Studio 2008
Figura 1 de alterar a estrutura de destino desejada no Visual Studio 2008

Era simplesmente uma questão de alterar os assemblies de referência usados para a linha de comando de compilação.

Alguns grandes alterações vem com o Visual Studio 2010, no entanto. O .NET Framework 4 nova traz uma nova versão do CLR. Isso significa que a abordagem utilizada no Visual Studio 2008 não é prática no Visual Studio 2010. Como resultado, o Visual Studio 2010 usa o compilador versão 4 para todos os multi-targeting, mesmo quando as versões anteriores do .NET Framework de destino. Isso permite que muitos dos novos recursos de idioma a ser usado para direcionamento de busca e fornece uma experiência de desenvolvimento simplificado de muito.

No entanto, uma desvantagem de poder usar os recursos do Visual Studio 2010 para alvos de nível inferior é que os arquivos de origem podem não ser compatível com o tempo de design se usados com versões anteriores do Visual Studio. Isso pode ser um problema se você estiver compartilhando o código-fonte para projetos criados em versões diferentes do Visual Studio e destinados a diferentes versões do .NET Framework.

Se você mantiver os projetos dentro do Visual Studio 2010 para todo o trabalho de tempo de design, você terá uma melhor experiência. Você poderá gerar assemblies de direcionamento do .NET Framework 2. 0 para cima usando apenas o Visual Studio 2010 e o .NET Framework 3. 5 SP1.

Compatibilidade de tempo de design

Agora let’s dar uma olhada em um exemplo de um problema de compatibilidade de tempo de design. Do Figura 2 o código usa a continuação de linha implícito e o recurso de auto-implementada propriedade, ambos introduzido no Visual Studio 2010. Esse código pode ser compilado para o destino qualquer estrutura de 2. 0 em diante, quando compilado usando o Visual Studio 2010. Portanto, o assembly gerado é compatível com o tempo de execução.

image: Using New Language Features That Will Work in Down-Level Targets
De usando novos recursos de linguagem de trabalho que serão, em destinos de nível inferior, a Figura 2

No entanto, assumir esse mesmo arquivo de código de origem e tente compilar usando as versões 3. 5 ou 2. 0 do compilador, você gerará erros mostrados no do Figura 3.

image: Source Code from Visual Studio 2010 Is Not Design-Time Compatible with Visual Studio 2008
A Figura 3 código-fonte do Visual Studio 2010 não é o tempo de criação compatíveis com o Visual Studio 2008

Isso ocorre porque as versões anteriores do compilador sabem nada sobre esses recursos e tratam isso como código inválido. Portanto, os arquivos de origem não são compatíveis com o tempo de design. Para tornar esse tempo de design compatível, você teria que usar apenas os recursos disponíveis no compilador 3,5.

Compatibilidade de tempo de design tem implicações para os projetos da Web também. Para muitos projetos da Web, compilação é feita no servidor e o servidor, é claro que, compila as páginas usando o compilador do framework de destino instalado no servidor. Assim, se você tiver uma página da Web escrita em Visual Basic como destino o compilador de 3,5, a página deve ser compilada no servidor usando a versão 3. 5 do compilador do Visual Basic (vbc.exe). Qualquer uso de novos recursos de linguagem do Visual Studio 2010 falhará pois o compilador de 3,5 sabe nada sobre eles.

Para o código desenvolvido no Visual Studio 2010, que usa o compilador versão 4, você precisa de uma maneira de identificar esse requisito em tempo de compilação para evitar erros inesperados, quando a página da Web é implantada no servidor. Você pode fazer isso com a opção /langversion, que é usada durante o desenvolvimento de projetos da Web para gerar erros sobre novos recursos de sintaxe de linguagem não compila no compilador da estrutura anterior. Ao criar tipos de projeto do asp.net, essa opção é usada internamente para gerar erros, se seu código utiliza os novos recursos do Visual Studio 2010, mas o direcionamento de versões anteriores do framework.

Embora a opção /langversion não seja usada por padrão para qualquer um dos tipos de projeto, pode ser útil se você quiser verificar se o seu código-fonte é compatível com o tempo de design com as versões anteriores do Visual Studio.

Multi-direcionamento no IDE do Visual Studio 2010

O usuário de multi-direcionamento experiência no IDE do Visual Studio 2010 é quase idêntica do Visual Studio 2008. Ainda é controlada de dentro de propriedades do projeto, mas em uma instalação padrão talvez não veja as estruturas de destino anteriores. Para reduzir o tamanho de instalação, a equipe do Visual Studio decidido não são fornecidos a estrutura de 3,5 na instalação padrão do Visual Studio 2010. Essa alteração significa que você não verá essas opções de estrutura que aparecem no Target framework lista suspensa ou caixa de diálogo New Project.

Para adicionar essas estruturas adicionais, você precisa instalar o .NET Framework 3. 5 SP1. Você pode fazer esse direito a partir do IDE. Na parte superior da caixa de diálogo New Project, você verá um menu drop-down para a escolha da estrutura de destino. Se apenas o .NET Framework 4 estiver instalado, o menu contém um link para baixar mais informações. Se você instalar outros, entretanto, você verá apenas o .NET Framework 3. 5 SP1 no menu drop-down porque o Visual Studio reconhece apenas a instalação do .NET Framework 3. 5 SP1 aqui.

Outra alteração tem a ver com os perfis de cliente. Eles foram introduzidos no .NET Framework 3. 5 SP1 e permitem que aplicativos usam uma versão leve da estrutura, que pode melhorar as implantações por não exigir a inclusão do lado do servidor de partes da estrutura, como o asp.net. Esses perfis estão disponíveis para os destinos de framework 3. 5 e 4.

Como resultado, o perfil padrão para os vários tipos de projeto foi alterado. Os tipos de projeto do cliente — os aplicativos de console, no Windows, Office e Windows Presentation Foundation (WPF) — será o padrão para o perfil do cliente. No entanto, para aplicativos da Web o perfil padrão será “ completo ” por causa de referências a bibliotecas que não são implantadas com o perfil do cliente, como System. Web.

Bibliotecas de classes também como padrão o perfil completo, mas podem ser facilmente alteradas novamente para um perfil de cliente se você estiver dependendo somente referências implantadas com o perfil do cliente. Se sua biblioteca de classe é definida como perfil completo e, em seguida, é usada em um projeto com um perfil de cliente, ele ainda funcionará, desde que a biblioteca não depende de referências que não fazem parte dos assemblies de estrutura de cliente.

Por padrão, nenhuma das referências adicionadas ao tipo de projeto de biblioteca de classe requer um perfil completo. No entanto, porque eles são implantados com um aplicativo, o perfil de implantação do aplicativo é a configuração importante para garantir a funcionalidade completa do aplicativo. Se sua biblioteca varia de acordo com as referências fora do escopo do cliente, a biblioteca e o aplicativo que utiliza precisam empregar o perfil completo.

Multi-direcionamento usando o compilador de linha de comando

O compilador versão 4 tem inúmeras opções de linha de comando, infelizmente, nenhuma delas, controla a estrutura de destino, então é importante entender um pouco sobre cada um dos switches e como eles funcionam.

Se o .NET Framework 4 estiver instalado, é possível criar aplicativos usando vbc.exe que versões anteriores do framework de destino sem ter o Visual Studio instalado na máquina de compilação. Scripts de compilação ligue diretamente para o compilador de linha de comando são freqüentemente usados em ambientes de desenvolvimento maiores. Se o direcionamento de versões anteriores da linha de comando, isso requer arquivos instalados com a versão anterior do framework que está direcionando, portanto, o melhor plano é para que o .NET Framework 3. 5 SP1 e no .NET Framework 4 instalado no computador.

Com isso em mente, algumas das opções possíveis para multi-direcionamento são detalhadas no do Figura 4.

De compilação de linha de comando alterna para o controle Multi-direcionamento, a Figura 4

Switch Descrição
langversion Fornece os erros de código-fonte usando os recursos que Don atendam a versão de idioma específico. (9. 0 está relacionado aos destinos para o .NET Framework 3. 5, 10 está relacionado aos destinos do .NET Framework 4.) Isso não realmente determina a estrutura de destino ou CLR que está sendo usado, mas ele permite que os projetos da Web identificar os recursos do Visual Studio 2010 usados em cenários de destino da busca.
vbruntime Embora haja uma versão diferente da Microsoft. VisualBasic do .NET Framework 4, simplesmente tentar especificar a versão 2. 0 do Microsoft.VisualBasic.dll não funciona e resulta em um assembly depende da versão 4 NetFX.
nostdlib Impede que a referência padrão para System. dll, sejam adicionados ao conjunto de módulos. Embora seja possível usar esta opção junto com uma referência para a versão do System. dll no framework 2. 0, o resultado ainda é um assembly de versão 4.
sdkpath Opção de chave que especifica qual versão do MSCorLib.dll e Microsoft.VisualBasic.dll a ser usado se a opção vbruntime não especifica que será usado. No entanto, isso não é uma referência explícita em geral, você verá na lista de referências. Em vez disso, o compilador inclui isso suas referências padrão. Adicionando-a é parte da solução para multi-direcionamento, quando você deseja que a versão 2. 0 MSCorLib, não a versão 4.
noconfig Faz com que o compilador evitar adicionar referências padrão, importações e switches contidas no arquivo de vbc.rsp, caso contrário, poderia ser usado.

Esta tabela fornece uma rápida descrição de cada opção, mas para criar, na verdade, uma compilação de baixo-alvo, você precisará usar uma combinação — não há nenhuma opção de única para vários destinos. Para um destino de versão 3. 5, a opção mais importante é sdkpath, que pode ser usada para especificar a versão 2. 0 de MSCorlib. Em seguida, certifique-se que as referências de apontar para as versões corretas de System. dll, System.core.dll e outros assemblies de estrutura de destino anterior. (Isso podem ser encontrados na pasta %programfiles%\Reference Assemblies\Microsoft\Framework\v3.5.)

Você precisa especificar a opção noconfig evitar usar as opções padrão na versão 4 do vbc.rsp, que contém as configurações padrão de compilação. Sem adicionar essa opção fundamental, o compilador adicione essas referências padrão 4, as importações e assim por diante.

Linha de comando de compilação multi-alvo melhor é demonstrada pelo exemplo. Aqui eu simplesmente sou compilação de um arquivo de origem simples, nomeado test.vb, para o destino do .NET Framework 3. 5:

vbc.exe /noconfig /sdkpath:D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 /r:"D:\Program Files\ReferenceAssemblies\Microsoft\Framework\v3.5\System.Core.dll" d:\school\test.vb  /out:\school\test.exe

Quando você compreender as opções para compilar um assembly de 3,5, direcionamento 2. 0 em vez disso, simplesmente envolve remover algumas das referências, como o system.core.dll, que são necessárias para o framework 3. 5. Os switches sdkpath e noconfig permanecem os mesmos:

vbc.exe /noconfig /sdkpath:D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 d:\school\test.vb /out:\school\test.exe

Depois de ter o binário compilado, você pode empregar uma ferramenta como o Desassemblador do MSIL (ILDASM. exe) ou o .NET Reflector para examinar as versões de referências que está sendo usadas. Isso lhe permite determinar se um executável será executada em uma estrutura de destino desejado.

Soluções de perfil do cliente e o destino misto

Anteriormente neste artigo, eu mencionei que os perfis do cliente foram o padrão para a maioria dos tipos de projeto. Quando esses aplicativos são implantados, ocorre uma instalação do framework espaço menor. Como parte desta implantação, você pode observar que o compilador de linha de comando será implantado. Esta é a mesma versão do compilador, que é implantado com a estrutura completa, mas não há um problema potencial durante a tentativa de compilar um aplicativo simples em um perfil de cliente.

Usando este comando em uma máquina de estrutura de cliente falhará porque as estruturas de cliente não são fornecidos com um vbc.rsp que contém as referências padrão:

vbc.exe test.vb /out: test.exe

Você teria que especificar todas as referências e arquivos de instruções imports, que normalmente estaria contidas no vbc.rsp ou criar seus próprios.

As opções de mínimas básico necessárias para compilar um aplicativo Visual Basic em uma estrutura de instalação do cliente são:

/r:System.dll/imports:System/imports:Microsoft.VisualBasic

Com a inclusão dessas opções, você pode compilar um aplicativo Visual Basic básico. No entanto, você deve compilar aplicativos em uma máquina 
that tem o framework completo instalado.

Soluções de destino mista — criadas com o .NET Framework 3. 5 usado com um aplicativo cliente como destino do .NET framework 4 de bibliotecas de classe — são suportados, mas com algumas advertências. No Visual Studio 2010 IDE, se você estiver usando referências de projeto e está acostumados a experiência que eles oferecem, você ainda poderá obter essa experiência se as estruturas de destino nas referências de projeto usem a mesma versão de MSCorlib. A Figura 5 mostra as versões de MSCorlib e estrutura de versões com suporte.

De MSCorlib e compatibilidade de versão do Framework, a Figura 5

Versão de MSCorlib Estruturas de suporte Perfis
2.0 2.0, 3.0, 3.5 Cliente e o total de perfis
4.0 4 Cliente e o total de perfis

Portanto, se você estiver usando uma biblioteca de classes direcionamento MSCorlib 2. 0 no aplicativo do .NET Framework 3. 5, você está ainda pode usar referências de projeto. Da mesma forma, uma biblioteca de classes de perfil completo do .NET Framework 4 referenciada por um aplicativo do Windows do .NET Framework 4 perfil do cliente pode ter uma referência de projeto para a biblioteca.

No entanto, se você usar uma referência de projeto a projeto em que uma versão diferente do MSCorlib é usada, a referência de projeto será convertida em uma referência de arquivo. Isso significa que você precisará recriar manualmente a solução ao corrigir erros. A experiência será familiar Se você já trabalhou com soluções que tem vários projetos referenciados escritos em c# e Visual Basic. Você perderá alguns dos recursos disponíveis com referências de projeto, como, por exemplo, renomeação em compilação automática em segundo plano e de projetos convenientes.

O IDE protege um pouco do que acontece nos bastidores durante compilação, mas nem todas as pessoas se baseia a partir do IDE. A referência de arquivo será alterado automaticamente para uma referência de projeto se as estruturas de destino são alteradas para que ambos usam estruturas com uma versão comum de MSCorlib — portanto, não é uma referência de arquivo real.

O que acontece se você usar uma biblioteca de classe (3,5) de destino da busca em um aplicativo de versão 4? A biblioteca de classes confrontará, na verdade, o .NET Framework 4. Testando considerável ocorreu para garantir que esse cenário funcione em tempo de execução com alguns problemas. No entanto, a tentativa de usar uma biblioteca de classes do framework 4. 0 em um aplicativo do framework 3. 5 não é suportada e resultará em um erro em tempo de compilação se criando com o Visual Studio ou do MSBuild. Para usar bibliotecas de classes do framework 4. 0 em um aplicativo de alvo de estrutura de 3,5, no entanto, você precisaria para a biblioteca de classes .NET Framework 3. 5-destino da busca.

Tenha em mente, no entanto, se a capacidade de usar os recursos de linguagem do Visual Studio 2010 em cenários de destino da busca, direcionamento de biblioteca de classes do .NET Framework 3. 5 não deve ser um grande problema. Figura 6 resume os novos recursos, que você pode esperar para trabalhar em projetos de destino da busca.

Figura 6 do Studio Visual novos recursos nos cenários de destino para baixo

Recursos de idioma Works em cenários de destino para baixo
Inicializadores de coleção Sim
Inicializadores de matriz Sim
Propriedades implementadas automaticamente Sim
Continuação de linha implícita Sim
Instrução lambdas Sim
Não há PIA Não
Interoperabilidade dinâmica Não
Co/contravariance Parcialmente

PIAs e interoperabilidade

Usando o .NET Framework para programar o modelo de objeto do Microsoft Office requer o uso de assemblies de interoperabilidade primários (PIAs), que deve ser implantado para a máquina do usuário. Esses assemblies são geralmente muito grandes e implantá-los pode ser um incômodo.

O novo recurso do tipo de incorporação de objetos permite que esses aplicativos a serem implantados, sem a necessidade de PIAs na máquina do usuário. Ele faz isso por meio da geração de tipos de interoperabilidade incorporados que realizam as chamadas interop para a biblioteca COM diretamente. Esses tipos são anotados pelo compilador de tal forma que o CLR trata incorporado todas as instâncias do tipo de interoperabilidade como equivalente. O compilador não copiará todos os tipos em que o PIA em seu assembly, apenas os que você realmente usa. Para obter mais informações, consulte “ tipo equivalência e Embedded Interop tipos ” na biblioteca do MSDN (msdn.microsoft.com/library/dd997297(VS.100)).

Não há suporte para a funcionalidade desse recurso para cenários de destino da busca abaixo do .NET Framework 4. Usando a IDE do Visual Studio, isso não seria imediatamente óbvio como definir a referência incorporado interop propriedade como true em resultados de um cenário de destino da busca nas referências normais que está sendo usados. A experiência do usuário para o recurso no IDE é que o conjunto continuará a criar, mas poderia reverter para o comportamento das referências padrão, o que exigiria PIAs a serem implantados.

Na linha de comando, as referências normalmente são adicionadas usando a opção /reference. Para incorporar, a opção /link será usada. Tentando usar a opção /link para resultados de cenários de destino da busca de erros de compilação.

Aqui está um exemplo de uma linha de comando, a incorporação de tipos do assembly de interoperabilidade do Word:

D:\Windows\Microsoft.NET\Framework\v4.0.30128\Vbc.exe /imports:Microsoft.VisualBasic,System /link:"D:\Program Files\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Word.dll" /reference:"D:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\System.Core.dll","D:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\System.dll" /out:ConsoleApplication16.exe /target:exe Module1.vb

Esse comportamento é importante porque, por padrão, adicionadas a um projeto do Visual Studio 2010 de referências COM definido a propriedade Interop incorporar como true. Portanto, a alteração da estrutura de destino não deve resultar em erros adicionais, mas deve fornecer o benefício dos tipos de interoperabilidade incorporados sempre que possível.

Outro recurso novo no Visual Studio 2010 não oferece suporte a cenários de destino da busca é dinâmica de interoperabilidade porque, anteriores ao Visual Studio 2010, o DLR (Dynamic Language Runtime) não existe.

Outros problemas

A covariância e contravariance são suportados para uso com interfaces definidas pelo usuário. No entanto, interfaces de BCL (Base Class Library) para os destinos de nível inferior não são alteradas e, portanto, usar o recurso com essas classes de base não é suportado. Para obter mais informações sobre a covariância e contravariance, consulte a coluna Instintos básicos na edição de março de 2010 do de MSDN Magazine (de msdn.microsoft.com/magazine/ee336029).

Se você tiver um projeto ou solução criado em uma versão anterior do Visual Studio que você abrir no Visual Studio 2010, você verá a caixa de diálogo de atualização padrão. O Visual Studio irá fazer as alterações necessárias para os arquivos de projeto ou solução para trabalhar com o Visual Studio 2010. No entanto, há duas ações diferentes envolvidos na atualização dos arquivos que podem afetar a multi-direcionamento.

Se você tiver o .NET Framework 3. 5 SP1 instalado, a caixa de diálogo upgrade permitirá que os arquivos de projeto ou solução a ser atualizado para o Visual Studio 2010, mas as estruturas de destino especificadas para o projeto permanecerá inalteradas. Assim, se você estiver atualizando um aplicativo direcionado ao .NET Framework 3. 5, após a atualização ele deve ainda direcionar o framework 3. 5.

Se você não tiver o .NET Framework 3. 5 SP1 instalado, você não pode criar multi-targets corretamente porque você precisa da versão 2. 0 de MSCorlib e os assemblies de referência. A caixa de diálogo oferecerá a opção para alterar o destino para uma estrutura de versão 4 ou não atualizar o projeto. Nesse caso, o melhor é cancelar a atualização, instale o .NET Framework 3. 5 SP1 e execute através do processo para atualizar o projeto novamente.

Ao entender um pouco mais de detalhes da implementação do Visual Basic multi-direcionamento no Visual Studio 2010, será possível escrever código que produz módulos (assemblies) que pode ser implantado em versões anteriores do framework usando a linha de comando ou IDE, mas ainda assim aproveitar alguns dos novos recursos do Visual Studio 2010. Embora o multi-direcionamento tem algumas limitações, você poderá manter a capacidade de desenvolver e implantar aplicativos que não podem ser atualizados imediatamente para usar o .NET Framework 4.

Adrian Spotty Bowles  desenvolveu usando todas as versões do Visual Basic e conseguiu encontrar seu caminho para Redmond, Wash., onde trabalha na equipe de produto do Visual Basic como um testador de engenharia de design de software com foco no compilador do Visual Basic. Ele é ainda apaixonado pelo Visual Basic e pode ser encontrado com freqüência respondendo perguntas nos fóruns do MSDN Visual Basic. Você pode entrar Bowles em do abowles@microsoft.com.

Graças aos seguintes especialistas técnicos para revisar este artigo: Kevin Halverson e Beth Massi