VB6 - Acessando os recursos do .NET Framework 2.0


Muitos programadores VB6 pensam que não conseguem ter acesso ao vasto mundo de recursos disponíveis no VB .NET (leia-se aqui .NET Framework). Ledo Engano...

Este artigo vai mostrar como acessar recursos disponíveis no .NET Framework 2.0 (VB 2005) a partir do código feito no Visual Basic 6.

A migração de um projeto feito no VB6 para a plataforma .NET é afetada por diversos fatores dentre os quais a complexidade do código e maneira como o código foi escrito no VB6.  Se juntarmos um projeto complexo escrito de forma desleixada e sem as boas regras de programação o esforço pode ser tremendo.

Por isso antes de migrar o correto é você verificar o seu código VB6 e procurar adequá-lo as boas práticas de forma que a migração seja a menos traumática possível.

Se você esta começando eu não vejo razão para começar com o VB6 se você tem a sua disposição as versões Express com um conjunto de recursos que supera em muito o oferecido no VB6. Se pretende começar comece com o Visual Basic 2005/2008 Express.

Agora, se você é daqueles que vai continuar a usar o VB6 mas tem inveja dos recursos da plataforma .NET, não se inquiete : você pode continuar com o seu VB6 e chamar os recursos na .NET Framework quando precisar. Não é o cenário mais aconselhável mas ele é viável e eu vou mostrar como você pode conseguir esta 'façanha'...

Eu vou me ater unicamente a versão 2.0 da plataforma .NET, logo, para versões anteriores e para a nova versão 3.5, eu não posso garantir que tudo vá funcionar corretamente, a princípio, não há diferenças significativas.

Você vai precisar dos seguintes itens instalados:

Acessando os recursos do .NET Framework 2.0

A esta altura você deve estar pensando :

 "O VB6 pertence ao mundo COM, logo, como eu vou acessar as classes existentes no .NET Framework, visto que elas não são objetos COM, e a rigor, não podem ser chamadas diretamente do VB 6 ?

Boa pergunta garoto !!!!

Não dá mesmo para chamar de forma direta uma classe da plataforma .NET a partir do VB 6, mas , para tudo há um jeito, e , ele se chama : invólucro ou wrapper.

Se eu não posso chamar diretamente, eu devo criar um invólucro na plataforma .NET que vai fazer o papel de um objeto COM, fazendo assim a ligação entre o mundo COM do VB6 e o mundo gerenciado da plataforma .NET

E como você criar um invólucro COM na plataforma .NET ?

Elementar: Você cria um projeto usando o template do tipo classe COM chamado de COM class.

O template COM Class já esta presente no Visual Studio 2005. Veja:

Se você estiver usando o Visual Basic Express Edition não vai encontrar este template. Para incluir o template faça o download do arquivo comClass.zip e copie o arquivo zipado comClass.zip para a pasta : \Meus Documentos\Visual Studio 2005\Templates\ItemTemplates\Visual Basic.

Feito isso pode abrir o VB 2005 Express e verificar o template já instalado:

A figura abaixo mostra um esquema simplificado da atuação dos invólucros (wrappers) ligando as duas plataformas:

Criando um invólucro (Wrapper) no VB 2005 Express

Vamos então criar um invólucro no VB 2005 Express que irá permitir acessar um recurso da plataforma .NET com uma chamada COM feita através de uma aplicação VB 6.

Agora só falta escolher qual recursos desejamos usar.

Que tal executar um arquivo de áudio padrão .wav no VB6 usando o recurso My do VB 2005. Embora bem simples este exemplo ilustra bem os passos que você deve seguir para acessar a .NET Framework a partir do VB6.

- Inicie o Visual Basic 2005 Express (ou o VS 2005) e crie um novo projeto do tipo Class Library com o nome audioWrapper (o nome fica a seu critério);

Para facilitar vamos criar o projeto em na pasta c:\audiowrapper;

A seguir selecione no menu Project a opção Add New Item e na janela selecione o Template COM Class informando o nome AudioWrapperCOM.vb;

Vamos digitar o código que irá acessar o recurso My.Computer.Audio.Play para tocar o arquivo .wav. Crie uma rotina chama PlayWav conforme abaixo:

Public Sub PlayWav(ByVal fileWavName As String)

        If Not fileWavName = String.Empty Then
            Dim filename As String = fileWavName.ToLower()
            Dim isAudioWav As Boolean = filename.EndsWith("wav")
            If isAudioWav Then
                My.Computer.Audio.Play(fileWavName)
            End If

        End If

End Sub

O seu projeto deverá exibir o seguinte leiaute:

O recurso My.Computer.Audio.Play executa arquivos WAV do tipo Pulse Code Modulação (PCM).

Salve e execute um Build no projeto.

Temos agora que efetuar o registro da DLL gerada para que possamos referenciá-la no nosso projeto VB6. Fazemos isso incluindo a dll gerada no GAC usando os utilitários gacutil.

O Global Assembly Cache nada mais é do que um pasta de disco especial onde todos os assemblys compartilhados deverão ser colocados. No Windows XP ele esta localizado na pasta : <drive>:\Windows\assembly , conforme figura abaixo.
Novamente podemos fazer uma comparação com o modelo COM de registro de componentes.

Se o componente não é encontrado no mesmo diretório da aplicação, a aplicação procura-o no GAC, do mesmo modo com o COM pesquisa o registro.

Nota:os componentes .NET não precisam ser registrados no registro do WIndows como no modelo COM.
 

Antes de efetuar o registro devemos assinar o nosso assembly para isso devemos gerar uma chave e em seguida referência o arquivo de chave no assembly.info

Como assinar o arquivo DLL/EXE ?

Antes de colocar o assembly no GAC você precisa assiná-lo usando as chaves geradas. Você referencia a informação da assinatura em arquivo especial chamado AssemblyInfo.vb Você deve acrescentar uma linha que se pareça com a seguinte :

<Assembly : AssemblyKeyFile("c:\KeyFiles\MeuArquivoDeChaves.snk") >

Na próxima vez que você compilar o projeto , as informações de chave serão incluídas no grupo.

Como instalar o assembly no GAC ?

Existem diversas formas de você instalar o assembly no GAC. Você pode usar o utilitário GACUtil.exe ( procure na pasta X:\Arquivos de programas\Microsoft Visual Studio .NET\FrameworkSDK\Bin ) ou pode arrastar e soltar o assembly usando o plug-in WIndows Explorer. A estrutura especial de diretório é criada automaticamente para você e seu assembly deverá aparecer na lista do GAC.

A vantagem de colocar assemblies no GAC é que o desempenho fica otimizado pois o runtime os localiza de forma mais rápida sem ter que verificar a segurança a cada carga do assembly.

E vou ficando por aqui. Espero que esta pequena introdução o ajude a compreender melhor os assemblies.

Vamos abrir um prompt de comando do Visual Studio e usar o utilitário sn.exe para gerar uma arquivo .snk que será o nosso arquivo de chave para o assembly. Através do comando sn -k c:\audiowrapper\chave.snk iremos gerar este arquivo;

Se você der uma espiada na pasta audiowrapper verá o arquivo chave conforme a figura abaixo.(Eu vou copiar o arquivo para a pasta bin;)

Volte ao projeto e  em My Project selecione Open e na aba Signing marque a opção Sign the Assembly para assinar o assembly e em seguida localize e arquivo chave.snk gerado;

Agora vamos efetuar os passos para efetivamente registrar o nosso invólucro COM no GAC para torná-lo acessível ao nosso projeto Visual Basic 6. Os comandos que vamos usar são:

regasm "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\system.windows.forms.dll"

gacutil -u audioWrapper
regasm /u "c:\audioWrapper\audioWrapper\bin\Release\audioWrapper.dll"

regasm /tlb "c:\audioWrapper\audioWrapper\bin\Release\audioWrapper.dll"
gacutil -i "c:\audioWrapper\audioWrapper\bin\Release\audioWrapper.dll"

Os primeiros comandos cuidam do ambiente e cancelam o registro para a dll audioWrapper.dll se ele já existir.

Os comandos destacados em negrito é que registram o invólucro COM no GAC. A seguir temos o resultado da execução de cada um deles.

Agora temos tudo pronto e já podemos criar o nosso projeto Visual Basic 6.

Abra o VB 6 e crie um projeto do tipo STANDARD EXE e com o nome de WavNetCOM e no formulário padrão inclua um TextBox dois CommandButton e um CommonDialog conforme o leiaute abaixo;

A seguir digite o código abaixo no evento click do botão ao lado do TextBox. Ele irá abrir uma caixa de diálogo para procurar os arquivos .wav.

Private Sub cmdSearchWav_Click()
' Define o titulo
CommonDialog1.DialogTitle = "Abrir Arquivo"
' Define a lista de arquivos
CommonDialog1.Filter = "Audio Files (*.wav)|*.wav"
' O arquivo precisa existir
CommonDialog1.Flags = cdlOFNFileMustExist + cdlOFNHideReadOnly
' define uma estrategia para erros
CommonDialog1.CancelError = True
' habilita o tratamento de erro para cancelamentos
On Error Resume Next
' exibe a janela
CommonDialog1.ShowOpen
If Err Then
    ' Se cancelou ...
    MsgBox "Cancelado."
    Exit Sub
End If
txtWavFile.Text = CommonDialog1.FileName
End Sub

Agora vamos referenciar no projeto VB6 o arquivo .DLL que geramos no VB 2005. No menu Project selecione References e clique no botão Browse , localize o arquivo gerado e selecione o arquivo .tlb.

Agora no evento Click do botão Ouvir vamos coloca o código abaixo;

Private Sub cmdPlayWav_Click()
On Error GoTo terro
Dim audio As audioWrapper.AudioWrapperCOM
Set audio = New audioWrapper.AudioWrapperCOM
If txtWavFile.Text <> "" Then
     audio.PlayWav (txtWavFile.Text)
End If
Exit Sub
terro:
MsgBox Err.Description
End Sub

No código eu estou usando a rotina AudioWrapperCom da dll audioWrapper gerada para tocar arquivos .wav. Lembrando que este recurso somente toca arquivos .wav padrão PCM.

Pulse Code Modulation. Esta é a forma mais primitiva de armazenamento de áudio em formato digital, desenvolvido pela Sony e Philips no início da década de 70. No PCM o áudio é transformado numa série de amostras, cada uma com uma amplitude. No CD por exemplo temos 44100 amostras por segundo (44.1 KHz) com uma amplitude de 16 bits ou seja, 65 mil valores diferentes. Apesar da qualidade ser muito boa, o PCM não prevê o uso de nenhum tipo de compressão, é por isso que um CD pode armazenar apenas 74 minutos de música em PCM, enquanto a mesma mídia pode gravar mais de 10 horas em arquivos MP3 ou Ogg.

Apesar do uso mais famoso ser o CD, existem várias outras aplicações para o PCM, o formato com taxa de amostragem de 8 KHz com 8 bits de resolução é usado no sistema telefônico, onde o sinal de voz é digitalizado pela central telefônica no formato PCM e transmitido no formato digital entre as centrais, sendo novamente convertido em sinal analógico ao chegar na central telefônica do destinatário.

Abaixo temos o resultado da execução do projeto VB6:

Resumindo:

Para você usar um recurso da plataforma .NET no seu projeto VB6:

  1. Crie uma DLL do tipo COM class no VB. NET ou Visual Studio;
  2. Defina o código acessando os recursos desejados;
  3. Registre a DLL no GAC;
  4. Crie o seu projeto VB6;
  5. Referencia a DLL criada no VB .NET;
  6. Acesse os recursos a partir do VB6.

Pegue os projetos completos aqui: :    VB6 - WavNetCOM.zip    e    VB .NET 2005 - audioWrapper.zip

Eu sei é apenas o velho e bom Visual Basic mas eu gosto...

Referências :


José Carlos Macoratti