Quando você automatizar um aplicativo Microsoft Office
Microsoft Visual Basic .net ou Visual de Microsoft C# .net, o aplicativo do Office não fecha quando
chamar o método
Quit .
Quando chamadas Visual Studio .net uma COM objeto de gerenciados
código, ele cria automaticamente um Runtime Callable Wrapper (RCW). O RCW
empacota chamadas entre o aplicativo .net e o objeto COM. O RCW mantém um
Contagem de referência no objeto COM. Portanto, se todas as referências não foram
lançado no RCW, o objeto COM não sair.
Para certificar-se de que fecha o aplicativo do Office, certifique-se
Se o seu código de automação atende 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()
para o seguinte:
dim oBooks as Excel.Workbooks
oBooks = oExcel.Workbooks
oBook = oBooks.Add()
- Use System.Runtime.InteropServices.Marshal.ReleaseComObject em um loop até que ela retorna 0 quando terminar de usar um objeto. O System.Runtime.InteropServices.Marshal.ReleaseComObject diminui a contagem de referência do RCW e o loop irá garantir que o componente COM subjacente é lançado independentemente de como muitas vezes tem reinseridos no CLR.
- Para liberar a referência à variável, definir a variável
igual a Nada ou Nulo.
- Use o Sair método do objeto de aplicativo do Office para informar o servidor
desligar.
Isso
comportamento é por design.
Etapas para reproduzir o comportamento
- Inicie Visual Studio .net.
- No menu arquivo , clique em novo e clique em projeto. Em Projetos de Visual Basic, selecione Windows Application e clique em OK. Form1 é criado por padrão.
- Adicione uma referência à Biblioteca de objetos do Microsoft Excel. Para fazer isso, execute estas etapas:
- No menu Project , clique em Adicionar referência.
- Na guia COM , localize a biblioteca de objeto do Excel e clique em Selecionar.
Para o Microsoft Excel 2002: Microsoft Excel 10.0 Object Library
Observação Se você 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/
)
Assemblies de interoperabilidade primários (PIAs) de Microsoft Office XP estão disponíveis para download
Para Microsoft Office do Excel 2003: Microsoft Excel 11.0 Object Library - Clique em OK na caixa de diálogo Add References para aceitar as seleções.
- No menu Exibir , clique em Ferramentase, em seguida, arraste um controle Button para Form1.
- Clique duas vezes em Button1. Aparece a janela de código para o formulário.
- Adicione o seguinte código na parte superior do Form1:
Imports Microsoft.Office.Interop
- 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
- Pressione F5 para executar o aplicativo.
- Abra o Gerenciador de tarefas do Windows. Visual Studio, exibir o
Janela de saída para ver as mensagens de depuração. Clique no botão de comando e observe que
uma instância do Excel. exe aparece na lista de processos .
- A instância do Excel ainda é executado na lista de tarefas ainda
Após o aplicativo dormindo. Feche a caixa de diálogo e observe que
Excel não aparece mais na lista de processos .
- Ao implementar as etapas na seção "Resolução",
Encerra o aplicativo do Office depois de liberar a última variável. Substituir o
função na etapa 5 com o seguinte código:
Private Sub NAR(ByVal o As Object)
Try
While (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0)
End While
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 C# .net, consulte o código da função
NAR() :
private void NAR(object o)
{
try
{
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
}
catch {}
finally
{
o = null;
}
}
Observação: Começando com o.NET Framework 2.0, você pode usar
System.Runtime.InteropServices.Marshal.FinalReleaseComObject em vez de while loop chamada
System.Runtime.InteropServices.Marshal.ReleaseComObject para obter o mesmo resultado.
Solução de problemas
Observe que se você seguir as etapas descritas na
A seção "Passos para reproduzir o comportamento" e o servidor ainda não desligar
para baixo, você pode usar o
GC.Collect () método e o GC
.WaitForPendingFinalizers() método depois de liberar o último objeto. Porque o tempo de execução
realiza a coleta de lixo em RCW, o GC
.Collect () método força o coletor de lixo para executar e pode liberar qualquer
referências que ainda tem o RCW. GC
.Collect () método tenta recuperar a memória máxima disponível. Observe que
Isso não garante que toda a memória será recuperada.
ID do artigo: 317109 - Última revisão: sexta-feira, 3 de agosto de 2012 - Revisão: 1.0
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
| kbautomation kbprb kbmt KB317109 KbMtpt |
Tradução automáticaIMPORTANTE: 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/
)