Desenvolvendo componentes COM+ com .NET


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 2017 mas o processo é bem similar nas outras versões.

Para a criação do componente, utilizei um projeto do tipo Class Library:

Vamos adicionar a referência System.EnterpriseServices:

Vamos alterar as propriedades do Assemblie do projeto:

Marcando a opção de deixar o assemblie disponível para COM:

Por último vamos criar uma assinatura "Nome forte / strong name". 
Para isso, ainda nas configurações do projeto, selecione a aba "Signing" e marque a opção "Sign the assembly":

Neste combo que aparece, selecione a opção "<New...>".
Defina um nome para chave e uma senha:

E clique em OK e salve todas as configurações ctrl + s.

Feito as configurações do projeto, agora vamos ao que interessa.
Alterei o nome da class para "Calculadora" e herdei a classe do "ServicedComponent", ficando dessa forma:

using System.EnterpriseServices;

namespace CalculadoraComPlus
{
    public class Calculadora : ServicedComponent
    {
        
    }
}

Agora basta criar os métodos desejados, neste exemplo vou fazer apenas o método somar:

public int Somar(int A, int B)
{
    return A + B;
}

A classe inteira ficou dessa forma:

using System.EnterpriseServices;

namespace CalculadoraComPlus
{
    public class Calculadora : ServicedComponent
    {
        public int Somar(int A, int B)
        {
            return A + B;
        }
    }
}
Compile a aplicação (atenção na versão da arquitetura, se o legado que vai consumir seu COM+ for 32bit sua aplicação também deverá ser 32bit, e o mesmo caso seja 64bit).
No meu caso a aplicação legado será em 32bit, portanto vamos definir como padrão a arquitetura x86 para nossa dll:

Agora vamos instalar no COM+ do windows:
Existem duas formas de instalar, a primeira é via linha de comando e a segunda é via interface visual.
Vou deixar o comando para rodar no dos, porém eu utilizei a interface visual para instalar esse exemplo.

Via linha de comando: vamos utilizar 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)

Via interface visual:

Clique no menu Start -> Programs -> Administrative Tools -> Components Services

Expanda as pastas até a opção “Aplicativos COM+”.
Clique com o botão direito e selecione a opção “Novo -> Aplicativo”.

Clique em Avançar e em seguida selecione a opção “Criar um aplicativo vazio”.

Na próxima tela digite um nome para seu aplicativo (no meu caso será Calculadora) e certifique-se que a opção "Aplicativo de servidor" esteja selecionada:
 

Clique em avançar e selecione uma opção de login (no meu caso deixei o default):

Clique em avançar -> avançar -> avançar -> concluir.
Clique com o botão direito em cima do aplicativo "Calculadora" que apareceu na lista e selecione a opção propriedades:

Na aba "Segurança" certifique que a opção "Aplicar verificações de acesso ao aplicativo" esteja selecionada.

Clique em "OK".

Agora vamos finalmente instalar nosso componente. Para isso expanda as opções do aplicativo "Calculadora" e com o botão direito selecione Componentes -> Novo -> Componente: