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'AnnaA 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:
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...”:
Figura 2: Add reference
Você pode escolher entre diversos tipos de referências. Estamos interessados em “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:
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”:
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.