Desenvolvimento - C#

Chamando Objetos COM

A arquitetura .NET define um modelo de “objeto executável” completamente novo e bastante diferente do padrão anterior da Microsoft, o COM - Common Object Model. O novo padrão assemelha-se muito mais aos “runtime packages” do Delphi do que com o próprio COM. O novo modelo tem várias vantagens...

por Mauro Sant'Anna



A arquitetura .NET define um modelo de “objeto executável” completamente novo e bastante diferente do padrão anterior da Microsoft, o COM - Common Object Model. O novo padrão assemelha-se muito mais aos “runtime packages” do Delphi do que com o próprio COM. O novo modelo tem várias vantagens:

  • É “OOP puro”, com suporte a herança e polimorfismo de maneira tradicional;
  • Não depende do registro dos objetos para seu uso. Na verdade, o registro simplesmente não existe;
  • Não existem mais “GUID”, “CLASSID” e assemelhados. Nós usamos os objetos baseados apenas em seus nomes;
  • O código e a descrição dos tipos que o código implementa, também chamada de “metadata”, estão sempre no mesmo arquivo EXE ou DLL. No Delphi seria o correspondente a ter o arquivo BPL e DCP juntos;
  • Os conceitos de propriedades e eventos são suportados diretamente.

O novo modelo de objetos substitui com vantagens o COM, tornando-o obsoleto. No entanto, os programas .NET podem precisar chamar objetos COM para obter alguma funcionalidade ainda não presente no “.NET puro”, como por exemplo:

  • Chamar aplicativos como Internet Explorer ou Word via “automation”;
  • Interagir com COM+/MTS/Application Center, já que estes aplicativos ainda não suportam objetos .NET nativos;
  • Chamar objetos de negócio já existentes;

É importante notar que o código COM é “non-managed” e o ambiente de execução não pode garantir a integridade e segurança do sistema. Por esta razão, caso o seu programa use objetos COM, ele será “marcado” e necessitará um privilégio de segurança especial.

Como os objetos COM rodam um mundo “não-managed”, existem componentes da arquitetura .NET que traduzem as chamadas entre o mundo “gerenciado” e “não-gerenciado”, conforme o esquema a seguinte:

Esquema de chamada ao COM

Figura 1: Esquema de chamada ao COM

É perfeitamente possível chamar objetos COM tanto com “late biding” como “early biding”.

Late Biding

Nesta modalidade, resolveremos as pendências em tempo de execução, incluindo:

  • Nome da classe;
  • Nome dos métodos;
  • Quantidade e tipo dos parâmetros.

Estaremos usando as rotinas que fazem parte do suporte a “reflections” do .NET. Por esta razão, o código é um pouco rebuscado.

Veja a seqüência a seguir para chamar o Internet Explorer:

Listagem 1: Chamando o Internet Explorer

// Pega o tipo do objeto COM (CLSID, basicamente)
Type IETipo = Type.GetTypeFromProgID("InternetExplorer.Application");
// Cria o objeto COM (IDispatch)
Object IEX = Activator.CreateInstance(IETipo);
// Monta array com parâmetros
object[] Par = new object[1];
// Torna visível
Par[0] = true;
IETipo.InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty, null, IEX, Par);
// Inicializa parâmetros
Par[0] = @"http://www.cnn.com";
// Chama o métoddo
IETipo.InvokeMember("Navigate", System.Reflection.BindingFlags.InvokeMethod, null, IEX, Par);

Early Biding

Nesta modalidade, estamos resolvendo os nomes em tempo de compilação. Para isto, devemos criar uma “classe .NET proxy” que irá conter os mesmos tipos, métodos, propriedades e eventos da classe COM associada.

Para criar a classe, podemos usar tanto o Visual Studio como um utilitário de linha de comando. Para criar a classe no Visual Studio, vá até o “Solution Explorer” em um projeto aberto, clique com o botão direito sobre o nome do projeto e peça “Add Reference...”:

Add reference

Figura 2: Add reference

Você pode escolher entre diversos tipos de referências. Estamos interessados em “COM”:

Adicionando referência ao COM

Figura 3: Adicionando referência ao COM

Selecione a classe COM registrada correspondente à funcionalidade desejada e clique em “Select”. No exemplo acima estamos escolhendo as classes do Microsoft Word 2000. O Visual Studio irá criar um “assembly” já compilado (DLL) com a classe “proxy”. O “Solution Explorer” vai mostrar a referência:

Referências do projeto

Figura 4: Referências do projeto

Depois de criada a classe “proxy”, podemos usá-la como se fosse uma classe “.NET” (que ela realmente é). Na verdade, ela passará os comandos para o objeto COM associado.

Veja um exemplo:

Listagem 2: Abrindo uma aplicação Word

protected void button4_Click(object sender, System.EventArgs e)
{
Word.Application WW = new Word.Application();
WW.Visible = true;
}

A DLL com as classes .NET encontram-se no diretório “\Application Data\Microsoft\VisualStudio\RCW”. Você pode visualizar os tipos criados usando o “IL Dissasembler” que vem com o “.NET SDK”:

Métodos do projeto

Figura 5: Métodos do projeto

Conclusão

A integração do legado .COM na nova arquitetura .NET é bastante simples, permitindo uma fácil migração para a nova plataforma.

Mauro Sant'Anna

Mauro Sant'Anna - Mauro tem mais de 20 anos de experiência no desenvolvimento de software, com produtos publicados no Brasil, Portugal e Estados Unidos, além de extensa experiência em treinamento e consultoria no desenvolvimento de software, tanto criando material como ministrando cursos.
Mauro é um "Microsoft Most Valuable Professional" (MVP - www.microsoft.com/mvp), “Microsoft Regional Director” (RD - www.microsoft.com/rd), membro do INETA Speaker’s Bureau (www.ineta.org) e possui as certificações MCP, MCSA (Windows 2000/2003), MCAD (C# e VB), MCDBA, MCSE (Windows 2000/2003).
Sua empresa, a M. A. S Informática (www.mas.com.br), treinou centenas de turmas em desenvolvimento de software nos últimos anos.