Aplicación de Office no puede salir después de la automatización desde el cliente de Visual Studio

Seleccione idioma Seleccione idioma
Id. de artículo: 317109 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando automatiza una aplicación de Microsoft Office de .NET Visual Basic de Microsoft o Microsoft Visual C#. NET, la aplicación de Office no puede salir cuando Llame al método Quit .

Causa

Al realizar llamadas de Visual Studio .net de COM de objetos de managed código, se crea automáticamente un Runtime Callable Wrapper (RCW). El RCW calcula las referencias de las llamadas entre el objeto COM y de la aplicación. El RCW mantiene una recuento de referencia en el objeto COM. Por lo tanto, si no han sido todas las referencias publicado en el RCW, el objeto COM no se cierra.

Solución

Para asegurarse de que se cierra la aplicación de Office, asegúrese de que que el código de automatización cumple los criterios siguientes:
  • Declare cada objeto como una nueva variable. Por ejemplo, cambiar la siguiente línea de código
    oBook = oExcel.Workbooks.Add()
    					
    a la siguiente:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Uso System.Runtime.InteropServices.Marshal.ReleaseComObject en un bucle hasta que se devuelve 0 cuando haya terminado de utilizar un objeto. El System.Runtime.InteropServices.Marshal.ReleaseComObject disminuye el recuento de referencias de RCW y el bucle se asegurará de que se libera el componente COM subyacente independientemente de cómo muchas veces ha volver a introducir el CLR.
  • Para liberar la referencia a la variable, establezca la variable igual a No hay nada o Null.
  • Utilice el Salir método del objeto de aplicación de Office para indicar al servidor que apagar el sistema.

Estado

Esto comportamiento es por diseño.

Más información

Pasos para reproducir el comportamiento

  1. Iniciar Visual Studio .net.
  2. En el menú archivo , haga clic en nuevo y, a continuación, haga clic en proyecto. En Proyectos de Visual Basic, seleccione Aplicación para Windows y haga clic en Aceptar. De forma predeterminada, se crea Form1.
  3. Agregue una referencia a la Biblioteca de objetos de Microsoft Excel. Para ello, siga estos pasos:
    1. En el menú proyecto , haga clic en Agregar referencia.
    2. En la ficha COM , busque la biblioteca de objetos de Excel y, a continuación, haga clic en Seleccionar.

      Microsoft Excel 2002: biblioteca de objetos de Microsoft Excel 10.0

      Nota Si no lo ha hecho ya, se recomienda que usted Descargue e instale a Microsoft Office XP Primary Interop Assemblies (PIA). Para obtener información adicional acerca de los PIA de Office XP, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
      328912Ensamblados de interoperabilidad primarios (PIA) de Microsoft Office XP están disponibles para descarga
      Para Microsoft Office de Excel 2003: biblioteca de objetos de Microsoft Excel 11.0
    3. Haga clic en Aceptar en el cuadro de diálogo Agregar referencias para aceptar sus selecciones.
  4. En el menú Ver , haga clic en el cuadro de herramientasy, a continuación, arrastre un control Button a Form1.
  5. Haga doble clic en Button1. Aparecerá la ventana de código para el formulario.
  6. Agregue el código siguiente al principio de Form1.vb:
    Imports Microsoft.Office.Interop
    					
  7. Reemplace el código siguiente en la ventana de código
        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    					
    con los siguientes:
    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. Presione F5 para ejecutar la aplicación.
  9. Abra el Administrador de tareas de Windows. En Visual Studio, muestre la Ventana de resultados para ver los mensajes de depuración. Haga clic en el botón de comando y tenga en cuenta que una instancia de Excel.exe aparece en la lista de procesos .
  10. La instancia de Excel sigue ejecutándose en la lista de tareas incluso Cuando termine la aplicación en modo de suspensión. Cierre el cuadro de diálogo y tenga en cuenta que Excel ya no aparece en la lista de procesos .
  11. Cuando implemente los pasos en la sección "Resolución", la aplicación de Office se cierra después de liberar la última variable. Reemplazar la función en el paso 5 con el siguiente 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
    					
Si está utilizando Visual C# .net, referencia el código de la función NAR() :
private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}
Nota: A partir de.NET Framework 2.0, puede utilizar System.Runtime.InteropServices.Marshal.FinalReleaseComObject en lugar de while bucle llamada System.Runtime.InteropServices.Marshal.ReleaseComObject para lograr el mismo resultado.

Solución de problemas

Tenga en cuenta que si sigue los pasos que se describen en el Sección "Pasos para reproducir el comportamiento" y el servidor aún no se cierra hacia abajo, puede utilizar el catálogo global de .Collect() método y el GC de .WaitForPendingFinalizers() método después de soltar el último objeto. Debido a que el tiempo de ejecución realiza la recolección en el RCW, el GC de .Collect() método obliga a ejecutar el recolector de elementos y pueden liberar cualquiera referencias que todavía tiene el RCW. El GC .Collect() método intenta reclamar la memoria máxima disponible. Tenga en cuenta que Esto no garantiza que se reclamará toda la memoria.

Propiedades

Id. de artículo: 317109 - Última revisión: viernes, 03 de agosto de 2012 - Versión: 1.0
La información de este artículo se refiere 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
Palabras clave: 
kbautomation kbprb kbmt KB317109 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 317109

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com