Consumindo Biblioteca C# no Visual Basic 6 com Component Object Model(COM)
Recentemente recebi uma demanda de alteração em uma aplicação legada escrita em Visual Basic 6. A necessidade visava acessar uma API de terceiros via internet a fim de realizar algumas transações de Consulta e Update de dados utilizando estas APIs. Como o sistema estava passando por algumas melhorias (reescrita em linguagens mais modernas), após algumas análises percebi que poderia ser mais eficiente construir um componente(COM) que realizasse a tarefa de comunicação entre o VB6 e a API externa.
Após uma pesquisa rápida de como realizar a criação deste componente encontrei 2 links que foram bem úteis (incluirei eles no final deste artigo) e este artigo é basicamente a união deles, porém quando eu tentei seguir os passos individuais de cada um deles, não obtive o resultado esperado. O Visual Basic não conseguia identificar o método exposto via Interface Pública do C# e foi por este motivo que resolvi escrever este passo a passo.
Escolhi o C# como linguagem, Visual Studio 2019 e depois de ter algumas pedras no caminho, cheguei a solução abaixo.
Criando o Component Object Model(COM)
Para que uma aplicação consumidora (VB6 por exemplo) consiga acessar os métodos de um componente escrito em C# é necessário seguir algumas etapas.
Primeiro criei um projeto como Class Library com o nome de ComponenteExemplo:
Optei também por escolher o .Net Framework 4.7.2.
Com o projeto criado, foi necessário alterar a propriedade ComVisible do AssemblyInfo.cs para TRUE.
Após isso é criei uma Interface pública que seria utilizada para aplicações consumidoras acessarem os métodos disponíveis, com isso criei uma interface chamada IServico.
Ao criar a interface e definir os métodos, é necessário anotar a classe com um GUID e também com InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]. A Interface Ficou da seguinte maneira:
Este GUID você pode gerar no próprio Visual Studio em Tools -> Create GUID:
Opção 5:
Agora é necessário implementar esta Interface e para isso criei a classe Servico conforme abaixo:
Foi necessário também registrar durante o build o projeto como um componente COM(“Botão direito no projeto -> Properties -> Build”).
Gerei um “Strong Name Key” para que fosse possível registrar o componente tanto no Global Assembly Cache (.NET) quanto no Registry por meio do regasm.exe (“Botão direito no projeto -> Properties -> Signing”).
Pronto, o componente está pronto para as etapas de build e registro.
Registro do componente na máquina:
Agora que o componente está pronto, é necessário registrá-lo no Windows e para isso, utilizei os comandos abaixo que foram incluídos na sessão de Pós- Build do Visual Studio 2019(“Botão direito no projeto -> Properties -> Build Events -> Post-build event command line:”).
Desta forma, o Visual Studio irá se encarregar de utilizar o gacutil e regasm compatíveis com as versões do .net utilizados na construção do componente.
É possível também executar os comandos de registro posteriormente, manualmente depois de compilar o projeto. Neste caso se você tiver alguns .Net Framework instalado será necessário identificar qual é o compatível com seu componente. No meu caso os comandos ficaram assim:
cd C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools
VsDevCmd.bat
cd C:\..\ComponenteExemplo\ComponenteExemplo\bin\Release
gacutil /i ComponenteExemplo.dll
regasm ComponenteExemplo.dll /tlb
Agora basta realizar o build da aplicação.
Obs: Foi necessário abrir o Visual Studio como Administrador, visto que os registros que serão realizados dependem deste privilégio.
Consumindo o componente no Visual Basic 6
Criei um projeto Standard EXE conforme imagem abaixo:
Registrei o componente em “Projects -> References -> Browse”
Obs: Utilizei o arquivo .tlb para isso:
Para este Exemplo eu criei apenas um botão que realizará a chamada ao componente e exibirá o resultado em um MsgBox:
Com o seguinte código:
E o resultado após executar o projeto e Clicar no Botão Teste:
A partir deste ponto, bastou eu escrever a lógica de conexão com APIs e consumir no VB6 em qualquer ponto da aplicação que necessitasse.
Links utilizados como referência:
https://docs.microsoft.com/pt-br/windows/win32/com/component-object-model--com--portal
https://docs.microsoft.com/pt-br/dotnet/csharp/programming-guide/interop/example-com-class
http://www.linhadecodigo.com.br/artigo/2864/o-component-object-model.aspx