Artigo: 317109 - Última revisão: sexta-feira, 3 de Setembro de 2004 - Revisão: 4.2

Aplicação do Office não é terminado após a automatização do Visual Studio .NET cliente

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Quando uma aplicação do Microsoft Office a partir do Microsoft Visual Basic .NET ou Microsoft Visual C# .NET é automatizar, a aplicação do Office não é terminado quando chamar o método de Sair .

Causa

Quando o Visual Studio .NET chama um objecto COM a partir de código gerido, cria automaticamente um Runtime Callable Wrapper (RCW). O RCW marshals chamadas entre aplicações .NET e o objecto COM. O RCW mantém uma contagem de referência no objecto COM. Por conseguinte, se não foram lançadas todas as referências no RCW, o objecto COM não é terminado.

Resolução

Para se certificar de que fecha a aplicação do Office, certifique-se que o código de automatização cumpre os seguintes critérios:
  • Declare cada objecto como uma nova variável de ambiente. Por exemplo, altere a seguinte linha de código
    oBook = oExcel.Workbooks.Add()
    					
    à seguinte:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Utilize System.Runtime.InteropServices.Marshal.ReleaseComObject quando tiver terminado de utilizar um objecto. Esta contagem de referência do RCW diminui.
  • Para libertar a referência à variável, defina a variável igual para Nothing ou Nulo .
  • Utilize o método quit do objecto de aplicação do Office para indicar o servidor para encerrar.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Passos para reproduzir o comportamento

  1. Inicie o Visual Studio NET..
  2. No menu ficheiro , clique em Novo e em seguida, clique em projecto . Em Projectos do Visual Basic , seleccione a Aplicação do Windows e clique em OK . É criado o Form1 por predefinição.
  3. Adicione uma referência para o Microsoft Excel Object Library . Para o fazer, siga estes passos:
    1. No menu projecto , clique em Add Reference .
    2. No separador COM , localizar a biblioteca de objectos do Excel e, em seguida, clique em Seleccionar .

      Para o Microsoft Excel 2002: Microsoft Excel 10.0 Object Library

      Nota Se tiver não o fez, recomenda-se que transfira e instale o Microsoft Office XP Primary Interop Assemblies (PIAs). Para obter informações adicionais sobre PIAs do Office XP, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
      328912  (http://support.microsoft.com/kb/328912/ ) Microsoft Office XP principais interop assemblies (PIAs) estão disponíveis para transferência
      Para o Microsoft Office Excel 2003: Microsoft Excel 11.0 Object Library
    3. Clique em OK na caixa de diálogo Adicionar referências para aceitar as selecções.
  4. No menu Ver , faça clique sobre caixa de ferramentas e, em seguida, arraste um controlo de botão Form1.
  5. Faça duplo clique em Button1 . Aparece a janela código para o formulário.
  6. Adicione o seguinte código para a parte superior do Form1.VB:
    Imports Microsoft.Office.Interop
    					
  7. Substitua o seguinte código na janela de código
        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    					
    com o seguinte:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim oApp As New Excel.Application()
        Dim oBook As Excel.Workbook = oApp.Workbooks.Add
        Dim oSheet As Excel.Worksheet = oApp.ActiveSheet
    
        oSheet = Nothing
        oBook.Close(False)
        oBook = Nothing
        oApp.Quit()
        oApp = Nothing
    
        Debug.WriteLine("Sleeping...")
        System.Threading.Thread.Sleep(5000)
        Debug.WriteLine("End Excel")
    End Sub
    					
  8. Prima F5 para executar a aplicação.
  9. Abra o Gestor de tarefas do Windows. No Visual Studio, visualize a janela de saída para ver as mensagens de depuração. Clique no botão de comando e note que uma instância do Excel.exe aparece na lista de processos .
  10. A instância do Excel ainda é executado na lista de tarefas, mesmo após a aplicação foi concluída no modo de suspensão. Feche a caixa de diálogo e tenha em atenção que Excel já não aparece na lista de processos .
  11. Quando implementar os passos na secção "Resolução", a aplicação do Office é encerrado depois que liberta a variável última. Substituir a função no passo 5 com o seguinte código:
      Private Sub NAR(ByVal o As Object)
        Try
          System.Runtime.InteropServices.Marshal.ReleaseComObject(o)
        Catch
        Finally
          o = Nothing
        End Try
      End Sub
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim oApp As New Excel.Application()
        Dim oBooks As Excel.Workbooks = oApp.Workbooks
        Dim oBook As Excel.Workbook = oBooks.Add
        Dim oSheet As Excel.Worksheet = oApp.ActiveSheet
    
        NAR(oSheet)
        oBook.Close(False)
        NAR(oBook)
        NAR(oBooks)
        oApp.Quit()
        NAR(oApp)
    
        Debug.WriteLine("Sleeping...")
        System.Threading.Thread.Sleep(5000)
        Debug.WriteLine("End Excel")
    End Sub
    					
Se estiver a utilizar Visual C#. NET, referencia o código para a função NAR() :
private void NAR(object o)
{
    try 
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
    }
    catch {}
    finally 
    {
        o = null;
    }
}

Resolução de problemas

Note que se seguir os passos descritos na secção "Passos para reproduzir o comportamento" e o servidor ainda não for encerrado, pode utilizar o método GC.Collect() e o método GC.WaitForPendingFinalizers() quando libertar o último objecto. Uma vez que o tempo de execução executa recolha no RCW, o método de GC.Collect() força o recolector de lixo para executar e poderá libertar todas as referências a RCW ainda tem. O método GC.Collect() tenta recuperar a memória máxima que está disponível. Note que isto não garante que toda a memória vai ser recuperada.

A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbautomation kbprb KB317109 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 317109  (http://support.microsoft.com/kb/317109/en-us/ )