domingo, 3 de junho de 2007

Acessando uma classe .Net via COM

A frequência de atualização desse blog tem sido baixa, mas ele ainda vive...rs. Vou tentar atualizá-lo com mais frequência. Dica: Para você saber quando há uma atualização, utilize um leitor RSS, como o FeedReader: http://www.feedreader.com/

Agora ao artigo.

Quem já trabalhou com ASP ou VB (os antigos, não-.Net), provavelmente já usou um comando como esse:
set obj = CreateObject("Dundas.Upload")
Deixando erros de sintaxe de lado (Escrevi só como exemplo, vai), esse comando permite criar objetos COM para acessar em sua aplicação. Você sabia que é possível chamar uma classe .NET dessa forma?

A vantagem é que com isso é possível acessar uma dll em .Net de uma aplicação ASP tradicional, VB 6 ou qualquer outra plataforma que suporte COM. Isso pode facilitar a transição parcial de um sistema para a plataforma .Net.

Passarei aqui as instruções para o Visual Studio 2005, mas isso também é possível no 2003. Em primeiro lugar é necessário adicionar uma strong name key ao seu projeto. Caso não saiba como fazer isso, procure por Strong Name Key no google que deve achar bastante coisa sobre o assunto. Também é necessário que todas as DLLs às quais a sua faça referência tenham um strong name key. Agora é só compilar e registrar a DLL.

Para registrá-la, use o utilitário de linha de comando Regasm.exe , com a seguinte sintaxe :
RegAsm.exe NomeDoArquivo.dll /tlb /codebase
Não sei te dizer exatamente o que fazem os parâmetro /tlb e /codebase, mas sei que sem eles não funciona :P (Quem souber e quiser explicar, fique a vontade e poste um comentário. ;) ). Como qualquer outro utilitário do .Net, o RegAsm.exe está na pasta do framework (e pode ser acessado diretamente se utilizado o atalho para o prompt de comando criado pelo visual studio no menu iniciar).

Após registrada a DLL, é só acessá-la do ASP ou VB como se fosse um objeto COM. Na string de identificação da classe, use o namespace seguido do nome da classe. No exemplo abaixo , está sendo chamada a classe TesteCOM do namespace Br1.Library.Teste:
set obj = CreateObject("Br1.Library.Teste.TesteCOM").

Algumas observações importantes:
  • Isso obviamente não elimina a necessidade do Framework, ele deve estar instalado na máquina onde o objeto COM for executado.
  • A DLL chamará as outras como qualquer objeto .Net, então as dlls às quais ela faz referência devem estar ou no mesmo diretório ou no GAC.
  • Só consegui fazer funcionar a DLL com tipos primitivos nos parâmetros e retorno. Internamente podem ser usadas classes e structs sem problema, mas a função que será chamada externamente só poder receber e retornar tipos primitivos, como string ou int.
  • Como qualquer objeto COM, depois da primeira chamada, a DLL vai estar carregada na memória. Portanto, para substituir a DLL pode ser necessário reiniciar o ISS. Sugiro registrar a DLL de outro local, para não dar erro quando o VS não conseguir compilá-la devido à dll em bin\debug estar em uso. Sugiro criar um .BAT para a atualização, com os seguintes passos:
  1. Reiniciar o iis (use o iisreset.exe)
  2. Desregistrar a DLL com o comando : Regasm.exe NomeDoArquivo.dll /unregister
  3. Excluir os arquivos .DLL e .PDB do diretório de registro.
  4. Copiar os arquivos .DLL e .PDB do diretório bin\debug (ou bin\release, se preferir)
  5. Registrar a DLL novamente com o comando que já passei.

Essa abordagem pode ser bem interessante para ir convertendo aos poucos um sistema para .Net, ou então para incrementar um sistema já existente.

2 comentários:

Denis Caggiano disse...

E ai Márlon,
Olha só este link:
http://msdn2.microsoft.com/en-us/library/tzat5yw6(VS.80).aspx

Talvez ajude a entender melhor o Regasm e seus parâmetros.

Abs.

Guilherme disse...

Procurando sobre strong name, achei seu post, que pode me ajudar com um outro sistema, em ASP 3.0.
Boa! Abraços!