Implantar componentes COM o ClickOnce

A implantação de componentes COM herdados tem sido tradicionalmente uma tarefa difícil. Os componentes precisam ser registrados globalmente e, portanto, podem causar efeitos colaterais indesejáveis entre aplicativos sobrepostos. Essa situação geralmente não é um problema em aplicativos .NET Framework porque os componentes são completamente isolados para um aplicativo ou são compatíveis lado a lado. O Visual Studio permite implantar componentes COM isolados no sistema operacional Windows XP.

O ClickOnce fornece um mecanismo fácil e seguro para implantar seus aplicativos .NET. No entanto, se seus aplicativos usarem componentes COM herdados, você precisará executar etapas adicionais para implantá-los. Este tópico descreve como implantar componentes COM isolados e referenciar componentes nativos (por exemplo, do Visual Basic 6.0 ou do Visual C++).

Para mais informações sobre como implantar componentes COM isolados, consulte Simplificar a implantação de aplicativos com ClickOnce e COM sem registro.

COM sem registro

O COM sem registro é uma nova tecnologia para implantar e ativar componentes COM isolados. Ele funciona colocando todas as informações de registro e biblioteca de tipos do componente que normalmente são instaladas no registro do sistema em um arquivo XML chamado manifesto, armazenado na mesma pasta que o aplicativo.

Isolar um componente COM requer que ele seja registrado no computador do desenvolvedor, mas ele não precisa ser registrado no computador do usuário final. Para isolar um componente COM, tudo o que você precisa fazer é definir a propriedade Isolada para Verdadeiro. Por padrão, essa propriedade é definida como Falso, indicando que ela deve ser tratada como uma referência COM registrada. Se essa propriedade for Verdadeiro, ela fará com que um manifesto seja gerado para esse componente no momento da compilação. Isso também faz com que os arquivos correspondentes sejam copiados para a pasta do aplicativo durante a instalação.

Quando o gerador de manifesto encontra uma referência COM isolada, ele enumera todas as CoClass entradas na biblioteca de tipos do componente, correspondendo a cada entrada com seus dados de registro correspondentes e gerando definições de manifesto para todas as classes COM no arquivo de biblioteca de tipos.

Implantar componentes COM sem registro usando o ClickOnce

A tecnologia de implantação clickOnce é adequada para implantar componentes COM isolados, pois tanto o ClickOnce quanto o COM sem registro exigem que um componente tenha um manifesto para ser implantado.

Normalmente, o autor do componente deve fornecer um manifesto. Caso contrário, no entanto, o Visual Studio é capaz de gerar um manifesto automaticamente para um componente COM. A geração de manifesto é executada durante o processo de Publicação do ClickOnce; para obter mais informações, consulte Publicando aplicativos ClickOnce. Esse recurso também permite que você aproveite os componentes herdados criados em ambientes de desenvolvimento anteriores, como o Visual Basic 6.0.

Há duas maneiras de o ClickOnce implantar componentes COM:

  • Use o bootstrapper para implantar seus componentes COM; isso funciona em todas as plataformas com suporte.

  • Use a implantação de isolamento de componente nativo (também conhecida como COM sem registro).

Exemplo de isolamento e implantação de um componente COM simples

Para demonstrar a implantação de componente COM sem registro, este exemplo criará um aplicativo baseado no Windows no Visual Basic que referencia um componente COM nativo isolado criado usando o Visual Basic 6.0 e o implantará usando o ClickOnce.

Primeiro, você precisará criar o componente COM nativo:

Para criar um componente COM nativo
  1. Usando o Visual Basic 6.0, no menu Arquivo, clique em Novoe, em seguida , no Projeto.

  2. Na caixa de diálogo Novo Projeto, selecione o nó do Visual Basic e selecione um projeto DLL ActiveX. Na caixa Nome, digite VB6Hello.

    Observação

    Há suporte apenas para tipos de projeto de Controle ActiveX e DLL ActiveX com COM sem registro; Não há suporte para os tipos de projeto ActiveX EXE e ActiveX Document.

  3. No Gerenciador de Soluções, clique duas vezes em Class1.vb para abrir o editor de texto.

  4. Em Class1.vb, adicione o seguinte código após o código gerado para o New método:

    Public Sub SayHello()
       MsgBox "Message from the VB6Hello COM component"
    End Sub
    
  5. Compile o componente. No menu Compilar, clique em Solução de Compilação.

Observação

O COM sem registro dá suporte apenas a DLLs e tipos de projeto de controles COM. Você não pode usar EXEs com COM sem registro.

Agora você pode criar um aplicativo baseado no Windows e adicionar uma referência ao componente COM a ele.

Para criar um aplicativo baseado no Windows usando um componente COM
  1. Usando o Visual Basic, no menu Arquivo, clique em Novoe em Projeto.

  2. Na caixa de diálogo Novo Projeto, clique no nó do Visual Basic e clique no Aplicativo do Windows. Na caixa Nome, digite RegFreeComDemo.

  3. No Gerenciador de Soluções, clique no botão Mostrar Todos os Arquivos para exibir as referências do projeto.

  4. Clique com o botão direito do mouse no nó Referências e clique em Adicionar Referência no menu de contexto.

  5. Na caixa de diálogo Adicionar Referência, clique na guia Procurar, navegue até VB6Hello.dll e selecione-a.

    Uma referência VB6Hello aparece na lista de referências.

  6. Aponte para a Caixa de Ferramentas, clique em um botão de Controle e arraste-o para o formulário Form1.

  7. Na janela Propriedades, defina a propriedade Texto do botão como Hello.

  8. Clique duas vezes no botão para adicionar o código do manipulador e, no arquivo de código, adicione código para que o manipulador leia da seguinte maneira:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim VbObj As New VB6Hello.Class1
        VbObj.SayHello()
    End Sub
    
  9. Executar o aplicativo. No menu Depurar, clique em Iniciar Depuração.

    Em seguida, você precisa isolar o controle. Cada componente COM que seu aplicativo usa é representado em seu projeto como uma referência COM. Essas referências são visíveis no nó Referências na janela do Gerenciador de Soluções. (Observe que você pode adicionar referências diretamente usando o Adicione o comando Referência no menu Projeto ou indiretamente arrastando um controle ActiveX para seu formulário.)

    As etapas a seguir mostram como isolar o componente COM e publicar o aplicativo atualizado que contém o controle isolado:

Para isolar um componente COM
  1. No Gerenciador de Soluções, no nó Referências, selecione a referência VB6Hello.

  2. Na janela Propriedades, altere o valor da propriedade Isolada de Falso para Verdadeiro.

  3. No menu Compilar, clique em Solução de Compilação.

    Agora, quando você pressiona F5, o aplicativo funciona conforme o esperado, mas agora está em execução em COM sem registro. Para provar isso, tente cancelar o registro do componente VB6Hello.dll e executar RegFreeComDemo1.exe fora do IDE do Visual Studio. Desta vez, quando o botão é clicado, ele ainda funciona. Se você renomear temporariamente o manifesto do aplicativo, ele falhará novamente.

Observação

Você pode simular a ausência de um componente COM cancelando temporariamente o registro. Abra um prompt de comando, vá para a pasta do sistema digitando cd /d %windir%\system32e cancele o registro do componente digitandoregsvr32 /u VB6Hello.dll. Você pode registrá-lo novamente digitando regsvr32 VB6Hello.dll.

A etapa final é publicar o aplicativo usando ClickOnce:

Para publicar uma atualização de aplicativo com um componente COM isolado
  1. No menu Compilar, clique em Publicar RegFreeComDemo.

    O Assistente de Publicação será exibido.

  2. No Assistente de Publicação, especifique um local no disco do computador local onde você pode acessar e examinar os arquivos publicados.

  3. Clique em Concluir para publicar o aplicativo.

    Se você examinar os arquivos publicados, observará que o arquivo sysmon.ocx está incluído. O controle é totalmente isolado para este aplicativo, o que significa que, se o computador do usuário final tiver outro aplicativo usando uma versão diferente do controle, ele não poderá interferir nesse aplicativo.

Fazer referência a assemblies nativos

O Visual Studio dá suporte a referências a assemblies nativos do Visual Basic 6.0 ou C++; essas referências são chamadas de referências nativas. Você pode dizer se uma referência é nativa verificando se sua propriedade Tipo de Arquivo está definida como Nativo ou ActiveX.

Para adicionar uma referência nativa, use o comando Adicionar Referência e navegue até o manifesto. Alguns componentes colocam o manifesto dentro da DLL. Nesse caso, você pode simplesmente escolher a DLL em si e o Visual Studio a adicionará como uma referência nativa se detectar que o componente contém um manifesto inserido. O Visual Studio também incluirá automaticamente todos os arquivos ou assemblies dependentes listados no manifesto se eles estiverem na mesma pasta que o componente referenciado.

O isolamento do controle COM facilita a implantação de componentes COM que ainda não têm manifestos. No entanto, se um componente for fornecido com um manifesto, você poderá referenciar o manifesto diretamente. Na verdade, você sempre deve usar o manifesto fornecido pelo autor do componente sempre que possível, em vez de usar a propriedade Isolada.

Limitações da implantação de componente COM sem registro

O COM sem registro oferece vantagens claras em relação às técnicas de implantação tradicionais.

Nem todos os componentes são candidatos adequados para COM sem registro. Um componente não será adequado se qualquer um dos seguintes valores for verdadeiro:

  • O componente é um servidor fora de processo. Não há suporte para servidores EXE; há suporte apenas para DLLs.

  • O componente faz parte do sistema operacional ou é um componente do sistema, como XML, Internet Explorer ou Microsoft Data Access Components (MDAC). Você deve seguir a política de redistribuição do autor do componente; verifique com seu fornecedor.

  • O componente faz parte de um aplicativo, como o Microsoft Office. Por exemplo, você não deve tentar isolar o Modelo de Objeto do Microsoft Excel. Isso faz parte do Office e só pode ser usado em um computador com o produto completo do Office instalado.

  • O componente destina-se a ser usado como um suplemento ou um snap-in, por exemplo, um suplemento do Office ou um controle em um navegador da Web. Esses componentes normalmente exigem algum tipo de esquema de registro definido pelo ambiente de hospedagem que está além do escopo do próprio manifesto.

  • O componente gerencia um dispositivo físico ou virtual para o sistema, por exemplo, um driver de dispositivo para um spooler de impressão.

  • O componente é um redistribuível do Acesso a Dados. Os aplicativos de dados geralmente exigem que um redistribuível de Acesso a Dados separado seja instalado antes que eles possam ser executados. Você não deve tentar isolar componentes como o Controle de Dados de ADO da Microsoft, o Microsoft OLE DB ou o Microsoft Data Access Components (MDAC). Em vez disso, se seu aplicativo usa MDAC ou SQL Server Express, você deve defini-los como pré-requisitos; ver como: instalar pré-requisitos com um aplicativo ClickOnce.

    Em alguns casos, pode ser possível para o desenvolvedor do componente reprojetá-lo para COM sem registro. Se isso não for possível, você ainda poderá criar e publicar aplicativos que dependem deles por meio do esquema de registro padrão usando o Bootstrapper. Para obter mais informações, consulte Criando pacotes bootstrapper.

    Um componente COM só pode ser isolado uma vez por aplicativo. Por exemplo, você não pode isolar o mesmo componente COM de dois projetos diferentes da Biblioteca de Classes que fazem parte do mesmo aplicativo. Isso resultará em um aviso de compilação e o aplicativo falhará ao carregar em tempo de execução. Para evitar esse problema, a Microsoft recomenda que você encapsule componentes COM em uma única biblioteca de classes.

    Há vários cenários em que o registro COM é necessário no computador do desenvolvedor, embora a implantação do aplicativo não exija registro. A Isolated propriedade requer que o componente COM seja registrado no computador do desenvolvedor para gerar automaticamente o manifesto durante a compilação. Não há recursos de captura de registro que invoquem o auto-registro durante a compilação. Além disso, as classes não definidas explicitamente na biblioteca de tipos não serão refletidas no manifesto. Ao usar um componente COM com um manifesto pré-existente, como uma referência nativa, o componente pode não precisar ser registrado no momento do desenvolvimento. No entanto, o registro será necessário se o componente for um controle ActiveX e você quiser incluí-lo na Caixa de Ferramentas e no designer do Windows Forms.