Como fazer Interop de componentes COM+ 32bits em aplicações .NET 64bits

Olá pessoal! Imagine o seguinte cenário:

Você possui uma aplicação antiga construída em ASP.NET mas que por algum motivo específico ainda usa componentes COM através de Interop.

Este, apesar de não desejado, é um cenário muito comum, em particular em ambientes corporativos: muitas vezes os componentes COM foram construídos em VB6 ou VC++ e encapsulam regras de negócio que não mudaram. Como as áreas de TI nem sempre possuem orçamento para fazer a conversão deste código para uma linguagem .NET como o Visual Basic.NET ou C#, esses componentes costumam ser usados por um logo período de tempo, até que um novo projeto substitua inteiramente a aplicação.

Agora, imagine que a área de TI da empresa resolve evoluir a plataforma Web para as versões mais recentes do Windows Server, só disponíveis em 64-bits. Para este cenário sempre existe a possibilidade de rodar os Application Pools do IIS 7.x (e superior) em modo 32-bits, mas seria desejável que asp aplicações ASP.NET pudessem explorar o máximo da nova plataforma, com o poder total da arquitetura 64-bits. Mas ai, surge o problema dos velhos componentes VB6 32-bits. Por padrão, não é possível carregar uma DLL (Componente COM) 32-bits em um processo (Application Pool) 64-bits. O que fazer???

Uma forma simples de continuar utilizando o código legado desses componentes COM de 32-bits sem custo extra é passar a usá-los no COM+ (Component Services). Basta seguir os seguintes passos:

 

  1. Primeiro, se você tiver registrado a DLL do seu componente no seu Windows x64, você terá que desfazer este processo. Execute o comando “regsvr32 /u <path_e_nome_da_dll>”
  2. Vá no Control Panel / Administrative Tools/ Component Services. Depois, no treeview abra My Computer, e então COM+ Applications. Clique com o botão direito e selecione “New –> Application
  3. Na tela “Welcome to the COM Application Install Wizard” clique em “Next > ”.
  4. Selecione o botão “Create an Empty Application”.
  5. Dê um nome para a sua aplicação (qualquer nome serve, mas é bom colocar algo que lembre o nome do componente que será executado). Depois entre “Library / Server”, selecione o tipo “Server”.
  6. Clique em “Next > ” e depois  “This User” .
  7. Selecione o usuário com o qual o componente será executado. Pode ser um usuário de domínio previamente criado para executar o componente ou um dos usuários de sistema existentes (NOTA: escolha o usuário tentando manter o mais seguro possível; evite LOCAL SYSTEM pois o mesmo tem direitos de administrador no Sistema Operacional, a menos que isso seja um pré-requisito da aplicação).
  8. Depois pressione “Next > ” nas telas seguintes (não altere nada), até concluir a criação da aplicação. image
  9. O próximo passo é adicionar o seu componente a esta aplicação recém-criada. Você encontrará a aplicação em Component Services -> Computers -> My Computer -> COM+ Application . Clique no ícone “+” e você verá um item “Components”. Selecione este item.
  10. Usando o Windows Explorer, arraste a DLL para a janela à direita na tela em “Components”. Com isso o componente será registrado automaticamente no Component Services. Aparecerá um ícone de forma circular e de cor amarelada que representa o Componente recém-instalado.
  11. Em seguida vá em Component Services -> Computers -> My Computer -> COM+ Application e selecione sua aplicação. Clique com o botão direito e abra as propriedades selecionando “Properties” no menu de contexto.
  12. Clique na guia “Security” e em “Authorization” desmarque a opção “Enforce access checks for this application”.
  13. Em “Security Level” marque a opção “Perform access checks only at the process level.”
  14. Também garanta que “Apply restriction policy” está desmarcado.
  15. Configure o “Impersonate Level” para “Anonymous
  16. O último passo será garantir que o usuário que roda o Application Pool poderá utilizar o seu componente. Para isso, em COM+ Application –> <Nome_da_sua_aplicacao> -> Roles -> CreateOwner –> Users você deverá adicionar o usuário do IIS (em geral IUSR) ou o grupo IIS_USRS (para o IIS 7.X/8).
  17. Também garanta que a pasta onde está instalado o componente esteja com permissões NTFS que permitam ao usuário do Application Pool possa ler o arquivo do componente. Em geral é suficiente adicionar a permissão de Execução nesta pasta para o grupo IIS_USRS.

NOTAS:

a) As configurações de segurança do componente (em amarelo acima) podem variar, se o mesmo necessitar personificar o usuário (i.e. rodar sobre o contexto de um outro usuário, por exemplo, para acessar um banco de dados ou outro recurso externo). b) Se estiver usando o Pipeline Classico do IIS 7.x talvez seja necessário adicionar também o usuário IUSR e IWAM quando estiver atribuindo as permissões no Component Services e nas permissões NTFS da pasta.

 

Agora basta testar a sua aplicação. Configure o Application Pool para rodar em modo 64bits e faça o teste: a aplicação, mesmo usando componentes antigos escritos em VB6 deverá executar sem problemas.

 

Até a próxima!

PT

Comments

  • Anonymous
    October 28, 2014
    Paulo. Muito obrigado por compartilhar esta preciosa orientação. Tenho uma aplicação legada em DLL, desenvolvida em VB6, e com suas dicas consegui fazê-la funcionar. Sucesso.