Quando se trabalha com .NET em sistemas mistos com plataformas legadas, como ASP Classic, VB, VBScript, Delphi ou até mesmo Ole Automation do SQL Server, o .NET ainda permite interoperabilidade com estes sistemas por meio de componentes COM+, seja o .NET consumindo COM+ ou a plataforma legada consumindo um COM+ desenvolvido em .NET.
Como existem poucos artigos em português para explicar como desenvolver COM+ com .NET, procurei a demonstrar a criação de componente simples com C# no Visual Studio 2010.
Para a criação do componente, utilizei um projeto do tipo Class Library:
A este projeto adicionei referência à System.EnterpriseServices:
Nas propriedades do projeto, editei a “Assembly Information”,
especificando o Assembly como COM-Visible:
De acordo com a plataforma do sistema legado (x64, x86) que o COM+ irá trabalhar, defini esta em Plataform target:
Obs.: Esta opção é muito importante, pois é muito comum criar um componente em x64 e este não ser visível para uma aplicação VB x86, assim como tentar criar componentes x86 para tentar acessar por um VBScript que será executado em uma plataforma x64.
Por fim, criei uma chave “strong name” para o projeto:
Para uma classe .NET ser considerada componente, ela deverá ser herdada de System.EnterpriseServices.ServicedComponent, conforme abaixo, onde temos uma classe simples cujo o seu único método retorna um texto:
using System.EnterpriseServices; namespace DemoCom { public class Objeto : ServicedComponent { public string Teste() { return "Demo COM+ //By SQL From Hell"; } } }
Após realizar o build do projeto, utilizei o regsvcs de acordo com a plataforma x86/x64 e versão da .NET Framework do projeto, informando o caminho do seu assembly (DLL) onde esta “$(TargetPath)”.
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regsvcs.exe $(TargetPath)
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regsvcs.exe $(TargetPath)
Após a instalação do componente, este será visível na relação de COM+ Applications no Component Services:
Para testar o COM+, utilizarei um VBScript simples:
Dim obj Set obj = CreateObject("DemoCom.Objeto") MsgBox obj.Teste
Também sendo possível por Ole Automation do SQL Server:
DECLARE @obj INT DECLARE @return INT, @text NVARCHAR(4000) -- Criando a 'instância' do componentes EXEC @return = sp_OACreate 'DemoCom.Objeto', @obj OUT -- Verificando se a chamada obteve sucesso. IF @return = 0 PRINT 'COM: OK' -- Chamando o método Teste EXEC @return = sp_OAMethod @obj, 'Teste', @text OUT IF @return = 0 PRINT 'Teste: OK' PRINT 'Resultado: ' + @text
E por fim, para desinstalar o componente, bastará utilizar o mesmo regsvcs informando “/u”.
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regsvcs.exe /u $(TargetPath)
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regsvcs.exe /u $(TargetPath)
Artigos relacionados:
Acessando dados de Web Service com Ole Automation Procedures