ID do artigo: 317109 - Última revisão: sexta-feira, 3 de setembro de 2004 - Revisão: 4.2

Aplicativo do Office não fecha após a automação de cliente do Visual Studio .NET

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 | Recolher tudo

Sintomas

Quando você automatizar um aplicativo do Microsoft Office do Microsoft Visual Basic .NET ou Microsoft Visual translation from VPE for Csharp .NET, o aplicativo do Office não fecha quando você chama o método Quit .

Causa

Quando o Visual Studio .NET chama um objeto COM do código gerenciado, ele cria automaticamente um RCW (Runtime Callable Wrapper). O RCW empacota chamadas entre o aplicativo .NET e o objeto COM. O RCW mantém uma contagem de referência sobre o objeto COM. Portanto, se todas as referências não foram lançadas no RCW, o objeto COM não fecha.

Resolução

Para certificar-se que o aplicativo do Office fecha, certifique-se que seu código de automação atenda aos seguintes critérios:
  • Declare cada objeto como uma nova variável. Por exemplo, alterar a seguinte linha de código
    oBook = oExcel.Workbooks.Add()
    					
    à seguinte:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Use System.Runtime.InteropServices.Marshal.ReleaseComObject quando terminar de usar um objeto. Este diminui a referência de contagem do RCW.
  • Para liberar a referência à variável, defina a variável igual a Nothing ou Nulo .
  • Use o método Quit do objeto de aplicativo do Office para informar ao servidor a desligar.

Situação

Esse comportamento é por design.

Mais Informações

Etapas para reproduzir o comportamento

  1. Inicie o Visual Studio NET..
  2. No menu arquivo , clique em novo e, em seguida, clique em Project . Em Projetos do Visual Basic , selecione Windows Application e clique em OK . O Form1 é criado por padrão.
  3. Adicione uma referência à Biblioteca de objetos do Microsoft Excel . Para fazer isso, execute as seguintes etapas:
    1. No menu Project , clique em Add Reference .
    2. Na guia COM , localize a biblioteca de objetos para o Excel e, em seguida, clique em Selecionar .

      Para o Microsoft Excel 2002: Microsoft Excel 10.0 Object Library

      Observação Se você ainda não tiver feito isso, é recomendável que você baixe e instale o Microsoft Office XP Primary Interop Assemblies (PIAs). Para obter informações adicionais sobre PIAs do Office XP, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
      328912  (http://support.microsoft.com/kb/328912/ ) Microsoft Office XP módulos de interoperabilidade primários (PIAs) estão disponíveis para download
      Para o Microsoft Office Excel 2003: Biblioteca de objetos do Microsoft Excel 11.0
    3. Clique em OK na caixa de diálogo Add References para aceitar as seleções.
  4. No menu Exibir , clique em caixa de ferramentas e, em seguida, arraste um controle Button para Form1.
  5. Clique duas vezes em Button1 . A janela de código para o formulário é exibida.
  6. Adicione o seguinte código à parte superior do Form1.vb:
    Imports Microsoft.Office.Interop
    					
  7. Substitua o código a seguir 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. Pressione F5 para executar o aplicativo.
  9. Abra o Gerenciador de tarefas do Windows. No Visual Studio, exiba a janela saída para ver as mensagens de depuração. Clique o botão de comando e observe que uma instância do Excel.exe é exibido na lista de processos .
  10. A instância do Excel ainda é executado na lista de tarefas até mesmo após o aplicativo ter sido concluído em suspensão. Fechar a caixa de diálogo e observe que o Excel não aparece na lista de processos .
  11. Ao implementar as etapas na seção "Resolução", o aplicativo do Office fecha depois de liberar a última variável. Substituir a função na etapa 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 você estiver usando Visual translation from VPE for Csharp. NET, o código para a função NAR() referência:
private void NAR(object o)
{
    try 
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
    }
    catch {}
    finally 
    {
        o = null;
    }
}

Solução de problemas

Observe que se execute as etapas descritas na seção "Passos para reproduzir o problema" e o servidor ainda não for desligado, você pode usar o método GC.Collect () e o método GC.WaitForPendingFinalizers() após você soltar o último objeto. Como o runtime realiza a coleta de lixo no RCW, o método GC.Collect () força o coletor de lixo para executar e pode liberar quaisquer referências ainda tem o RCW. O método GC.Collect () tenta recuperar a máxima de memória que está disponível. Observe que isso não garante que toda a memória será 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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/ )