Aplikacja pakietu Office nie jest zamykany po automatyzacji z klienta programu Visual Studio .net

Tłumaczenia artykułów Tłumaczenia artykułów
Numer ID artykułu: 317109 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Rozwiń wszystko | Zwiń wszystko

Na tej stronie

Symptomy

Podczas automatyzowania aplikacji pakietu Microsoft Office z Microsoft Visual Basic .net lub Microsoft Visual C# .net aplikacji pakietu Office nie jest zamykany podczas wywołania metody Quit .

Przyczyna

Kiedy obiekt programu Visual Studio .net wywołania COM z zarządzanych kod, tworzy on automatycznie otoki Runtime wpłacone otoki (RCW). Otoki RCW marshals połączeń między aplikacji .net i obiekt COM. Śledzi otoki RCW liczbę odwołań do obiektu COM. Dlatego jeśli nie zostały wszystkie odwołania wydany otoki RCW, obiekt COM nie jest zamykany.

Rozwiązanie

Upewnij się, aby upewnić się, że aplikacja pakietu Office jest zamykany, że kodu automatyzacji spełnia następujące kryteria:
  • Każdy obiekt należy zadeklarować jako nowej zmiennej. Na przykład zmiana następujący wiersz kodu
    oBook = oExcel.Workbooks.Add()
    					
    do następujących:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Użyj System.Runtime.InteropServices.Marshal.ReleaseComObject w pętli till zwraca 0, po zakończeniu korzystania z obiektu. W System.Runtime.InteropServices.Marshal.ReleaseComObject zmniejsza liczbę odwołań otoki RCW i pętli zapewni, że podstawowy składnik modelu COM jest zwalniane, niezależnie od tego, jak wiele razy go została ponownie CLR.
  • Aby zwolnić odwołanie do zmiennej, należy ustawić zmienną równe Nic lub Wartość NULL.
  • Użyj Zamknij metody obiektu aplikacji pakietu Office server, aby stwierdzić zamknięty.

Stan

To zachowanie jest zgodne z projektem.

Więcej informacji

Kroki prowadzące do odtworzenia problemu

  1. Uruchom program Visual Studio .net.
  2. W menu plik kliknij polecenie Nowy , a następnie kliknij Projekt. W ramach Projektów Visual Basicwybierz Aplikacji systemu Windows i kliknij OK. Domyślnie utworzony zostanie formularz Form1.
  3. Dodaj odwołanie do Biblioteki obiektów programu Microsoft Excel. Aby to zrobić, wykonaj następujące kroki:
    1. W menu Projekt kliknij przycisk Dodaj odwołanie.
    2. Na karcie COM zlokalizować biblioteki obiektów dla programu Excel, a następnie kliknij Wybierz.

      Program Microsoft Excel 2002: biblioteki obiektów Microsoft Excel 10.0

      Uwaga Jeśli jeszcze tego nie zrobiono, zaleca się że Pobierz i zainstaluj program Microsoft Office XP podstawowego Interop zestawów Międzyoperacyjnych (). Aby uzyskać dodatkowe informacje dotyczące pakietu Office XP PIAs kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
      328912Podstawowe zestawy międzyoperacyjne programu Microsoft Office XP (PIAs) są dostępne do pobrania
      Microsoft Office Excel 2003: biblioteki obiektów Microsoft Excel 11.0
    3. Kliknij przycisk OK w oknie dialogowym Dodawanie odwołania , aby zaakceptować wybór.
  4. W menu Widok kliknij w przyborniku, a następnie przeciągnij formant przycisku na formularzu Form1.
  5. Kliknij dwukrotnie Button1. Zostanie wyświetlone okno kodu dla formularza.
  6. Dodaj następujący kod do góry Form1.vb:
    Imports Microsoft.Office.Interop
    					
  7. Następujący kod w oknie kodu Zamień
        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    					
    z następujących czynności:
    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. Naciśnij klawisz F5, aby uruchomić aplikację.
  9. Otwórz Menedżera zadań Windows. W programie Visual Studio, wyświetlanie Okno wyjściowe wyświetlanie komunikatów debugowania. Kliknij przycisk polecenia i Zauważ, że wystąpienie Excel.exe pojawia się na liście procesów .
  10. Nadal uruchamia się wystąpienia programu Excel na liście zadania dotyczące nawet Po zakończeniu działania aplikacji w stanie uśpienia. Zamknij okno dialogowe i Zauważ, że Program Excel pojawia się już na liście procesów .
  11. Podczas implementacji kroki opisane w sekcji "Rozwiązanie" aplikacja pakietu Office zamknięty po zwalnia ostatniego zmiennej. Zamień Funkcja w kroku 5 następujący kod:
      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
    					
Jeśli używasz programu Visual C# .net referencyjny kod funkcji NAR() :
private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}
Uwaga: Począwszy od.NET Framework 2.0, można użyć System.Runtime.InteropServices.Marshal.FinalReleaseComObject zamiast while pętli wywołujący System.Runtime.InteropServices.Marshal.ReleaseComObject do osiągnięcia tego samego rezultatu.

Rozwiązywanie problemów

Należy zauważyć, że jeśli wykonaj kroki opisane w Sekcję "Kroki Aby odtworzyć zachowanie" i serwer nadal nie wyłączają w dół można użyć GC.Collect() metody i GC.WaitForPendingFinalizers() metody po zwolnieniu ostatniego obiektu. Ponieważ środowisko wykonawcze wykonuje bezużytecznych otoki RCW, GC.Collect() metoda wymusza garbage collector uruchomić i może zwolnić żadnego odwołania, które jeszcze otoki RCW. GC.Collect() próbuje odzyskania pamięci maksymalnej dostępnej metody. Należy zauważyć, że gwarantuje to, zostaną odzyskane wszystkie pamięci.

Właściwości

Numer ID artykułu: 317109 - Ostatnia weryfikacja: 3 sierpnia 2012 - Weryfikacja: 1.0
Informacje zawarte w tym artykule dotyczą:
  • 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
Słowa kluczowe: 
kbautomation kbprb kbmt KB317109 KbMtpl
Przetłumaczone maszynowo
WAŻNE: Ten artykuł nie został przetłumaczony przez człowieka, tylko przez oprogramowanie do tłumaczenia maszynowego firmy Microsoft. Firma Microsoft oferuje zarówno artykuły tłumaczone przez ludzi, jak i artykuły tłumaczone maszynowo, dzięki czemu każdy użytkownik może uzyskać dostęp do całej zawartości bazy wiedzy Knowledge Base we własnym języku. Prosimy jednak pamiętać, że artykuły przetłumaczone maszynowo nie zawsze są doskonałe. Mogą zawierać błędy słownictwa, składni i gramatyki, przypominające błędy robione przez osoby, dla których język użytkownika nie jest językiem ojczystym. Firma Microsoft nie odpowiada za wszelkie nieścisłości, błędy lub szkody spowodowane nieprawidłowym tłumaczeniem zawartości oraz za wykorzystanie tej zawartości przez klientów. Oprogramowanie do tłumaczenia maszynowego jest często aktualizowane przez firmę Microsoft.
Anglojęzyczna wersja tego artykułu to: 317109

Przekaż opinię

 

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