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
-
Mulai Visual Studio .NET.
-
Pada menu File, klik Baru, lalu klik Project. Di Visual Basic Proyek, Windows Proyek, lalu klik OK.
Catatan Formulir1 dibuat secara default. -
Menambahkan referensi ke Microsoft Excel Objek. Untuk melakukannya, ikuti langkah-langkah berikut:
-
Pada menu Project, klik Tambahkan Referensi.
-
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
-
Klik OK dalam kotak dialog Tambahkan Referensi untuk menerima pilihan Anda.
-
-
Pada menu Tampilan, klik Kotak Alat, lalu seret kontrol Tombol ke Formulir1.
-
Klik tombol dua kali Tombol1.
Catatan Jendela kode untuk formulir akan muncul. -
Tambahkan kode berikut ke bagian atas Form1.vb:
Imports Microsoft.Office.Interop
-
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
-
Tekan F5 untuk menjalankan aplikasi.
-
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.
-
Contoh Excel masih berjalan dalam daftar tugas bahkan setelah aplikasi selesai tidur. Tutup kotak dialog dan perhatikan bahwa Excel muncul lagi dalam daftar Proses.
-
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)