We couldn’t sign you in
Select the account you want to use.

Lihat produk lain yang berlaku untuk artikel ini.

Gejala

Saat Anda mengotomatisasi Microsoft Office dari Microsoft Visual Basic .NET atau Microsoft Visual C# .NET, aplikasi Office tidak keluar saat Anda menghubungi metode Keluar.

Penyebab

Saat Visual Studio .NET memanggil objek COM dari kode terkelola, objek secara otomatis membuat Runtime Callable Wrapper (RCW). Panggilan darurat RCW antara aplikasi .NET dan objek COM. RCW mempertahankan hitungan referensi pada objek COM. Oleh karena itu, jika semua referensi belum dirilis dalam RCW, objek COM tidak akan berhenti.

Pemecahan Masalah

Untuk memastikan bahwa Office keluar aplikasi, tentukan apakah kode otomatisasi Anda memenuhi kriteria berikut ini:

  • Deklarasikan setiap objek sebagai variabel baru. Misalnya, ubah baris kode berikut ini:

    oBook = oExcel.Workbooks.Add()
    

    Ubah ini menjadi yang berikut:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    
  • Gunakan System.Runtime.InteropServices.ReleaseComObject secara berulang hingga mengembalikan 0 ketika Anda selesai menggunakan objek. System.Runtime.InteropServices.Runtime.ReleaseComObject akan membuat jumlah referensi RCW, dan pengulangan memastikan bahwa komponen COM yang mendasarinya dirilis terlepas dari berapa kali CLR dimasukkan kembali.

  • Untuk merilis referensi ke variabel, atur variabel yang sama dengan Kosong atau Null.

  • Gunakan metode Keluar dari Office aplikasi untuk memberi tahu server agar mematikan.

Status

Perilaku ini merupakan bagian dari rancangan program.

Informasi Selengkapnya

Langkah-langkah untuk mereproduksi perilaku

  1. Mulai Visual Studio .NET.

  2. Pada menu File, klik Baru, lalu klik Project. Di Visual Basic Proyek, Windows Proyek, lalu klik OK.

    Catatan Formulir1 dibuat secara default.

  3. Menambahkan referensi ke Microsoft Excel Objek. Untuk melakukannya, ikuti langkah-langkah berikut:

    1. Pada menu Project, klik Tambahkan Referensi.

    2. Pada tab COM, temukan Pustaka Objek untuk Excel, lalu klik Pilih.

      For Microsoft Excel 2002: Microsoft Excel 10.0 Object LibraryNote

      If you have not already done this, we recommend that you download and install the Microsoft Office XP Primary Interop Assemblies (PIAs).

      Untuk informasi selengkapnya tentang Office XP, masuk ke artikel Basis Pengetahuan Microsoft berikut:

      328912 Microsoft Office xp utama interop assemblies (PIA) tersedia untuk diunduh
        Untuk Microsoft Office Excel 2003: Microsoft Excel 11.0 Pustaka Objek

    3. Klik OK dalam kotak dialog Tambahkan Referensi untuk menerima pilihan Anda.

  4. Pada menu Tampilan, klik Kotak Alat, lalu seret kontrol Tombol ke Formulir1.

  5. Klik tombol dua kali Tombol1.

    Catatan Jendela kode untuk formulir akan muncul.

  6. Tambahkan kode berikut ke bagian atas Form1.vb:

    Imports Microsoft.Office.Interop
    
  7. Ganti kode berikut ini di jendela kode:

        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    

    Ganti kode berikut:

    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. Tekan F5 untuk menjalankan aplikasi.

  9. Buka Windows Manajer Tugas. Dalam Visual Studio, tampilkan jendela Output untuk melihat pesan debug. Klik tombol perintah. Perhatikan bahwa contoh Excel.exe muncul dalam daftar Proses.

  10. Contoh Excel masih berjalan dalam daftar tugas bahkan setelah aplikasi selesai tidur. Tutup kotak dialog dan perhatikan bahwa Excel muncul lagi dalam daftar Proses.

  11. Saat Anda melakukan langkah-langkah di bagian "Resolusi", Office waktu aplikasi keluar setelah merilis variabel terakhir. Ganti fungsi di Langkah 5 dengan menggunakan kode berikut:

      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
    

Jika Anda menggunakan Visual C# .NET, referensikan kode untuk fungsi NAR():

private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}

Catatan Mulai dari .NET Framework 2.0, Anda dapat menggunakan System.Runtime.InteropServices.Administrator.FinalReleaseComObject dan bukannya mengulang panggilan System.Runtime.InteropServices.Runtime.ReleaseComObject untuk mendapatkan hasil yang sama.
 

Pemecahan masalah

Note Jika Anda mengikuti langkah-langkah yang diuraikan di bagian "Langkah-langkah untuk Mereproduksi Perilaku", dan server masih tidak mematikan, Anda bisa menggunakan GC. Metode Collect() dan GC. Metode WaitForPendingFinalizers() setelah Anda melepaskan objek terakhir. Karena runtime menjalankan kumpulan sampah di RCW, GC. Metode Collect() memaksa kontainer sampah untuk dijalankan dan mungkin merilis referensi apa pun yang masih memiliki RCW. The GC. Metode Collect() mencoba mengklaim kembali memori maksimum yang tersedia. Perhatikan bahwa hal ini tidak menjamin bahwa semua memori akan diklaim ulang.

Berlaku untuk

Artikel ini juga berlaku untuk:

  • Microsoft Visual Basic .NET (semua edisi)

  • Microsoft Visual C# .NET (semua edisi)

  • Microsoft Office 2016 (semua edisi)

  • Microsoft Office 2013 (semua edisi)

Perlu bantuan lainnya?

Kembangkan keterampilan Anda
Jelajahi pelatihan
Dapatkan fitur baru terlebih dahulu
Gabung Microsoft Insider

Apakah informasi ini bermanfaat?

Seberapa puaskah Anda dengan kualitas bahasanya?
Apa yang memengaruhi pengalaman Anda?

Terima kasih atas umpan balik Anda!

×