Consumindo Biblioteca C# no Visual Basic 6 com Component Object Model(COM)

Icaro Machado Claro
5 min readApr 4, 2022

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

--

--