Bu makalenin geçerli olduğu diğer ürünlere göz atın.
Belirtiler
Bir Microsoft Office uygulamasını Microsoft Visual Basic .NET veya Microsoft Visual C# .NET'ten otomatikleştirdiğinizde, Quit yöntemini çağırdığınızda Office uygulamasından çıkılmaz.
Neden
Visual Studio .NET yönetilen koddan bir COM nesnesi çağırdığında, otomatik olarak Çalışma Zamanı Çağrılabilir Sarmalayıcı (RCW) oluşturur. RCW, .NET uygulaması ile COM nesnesi arasındaki çağrıları sıralar. RCW, COM nesnesi üzerinde bir başvuru sayısı tutar. Bu nedenle, RCW'de tüm başvurular serbest bırakılmamışsa, COM nesnesinden çıkılmaz.
Çözüm
Office uygulamasından çıkıldığından emin olmak için, otomasyon kodunuzun aşağıdaki ölçütleri karşılayıp karşılamadığını belirleyin:
Her nesneyi yeni bir değişken olarak bildirin. Örneğin, aşağıdaki kod satırını değiştirin:
oBook = oExcel.Workbooks.Add()Bunu şununla değiştirin:
dim oBooks as Excel.Workbooks oBooks = oExcel.Workbooks oBook = oBooks.Add()System.Runtime.InteropServices.Marshal.ReleaseComObject'i, nesne kullanmayı bitirdiğinizde 0 döndürene kadar döngüde kullanın. System.Runtime.InteropServices.Marshal.ReleaseComObject, RCW'nin başvuru sayısını azaltır ve döngü, temel alınan COM bileşeninin CLR'ye kaç kez yeniden girdiğine bakılmaksızın serbest bırakılmasını sağlar.
Değişkenin başvurusunu serbest bırakmak için değişkeni Nothing veya Null değerine ayarlayın.
Sunucuya kapanmasını söylemek için Office uygulama nesnesinin Quit yöntemini kullanın.
Durum
Bu davranış tasarım gereğidir.
Daha Fazla Bilgi
Davranışı yeniden oluşturma adımları
Visual Studio .NET'i başlatın.
Dosya menüsünde, Yeni'yi tıklatın ve ardından Proje'yi tıklatın. Visual Basic Projeleri'nin altında Windows Uygulaması'nı seçin ve Tamam'a tıklayın.
Notlar Form1 varsayılan olarak oluşturulur.
Microsoft Excel Nesne Kitaplığı'na başvuru ekleyin. Bunu yapmak için aşağıdaki adımları izleyin:
Project menüsünde Başvuru Ekle'ye tıklayın.
COM sekmesinde Excel için Nesne Kitaplığı'nı bulun ve Seç'e tıklayın.
Microsoft Excel 2002 için: Microsoft Excel 10.0 Nesne Kitaplığı
Notlar Bunu henüz yapmadıysanız, Microsoft Office XP Birincil Birlikte Çalışma Derlemelerini (PIA) indirip yüklemenizi öneririz.
Office XP PIA'lar hakkında daha fazla bilgi için, aşağıdaki Microsoft Bilgi Bankası makalesine gidin:
328912 Microsoft Office XP birincil birlikte çalışma derlemeleri (PIA'lar) indirilebilir
Microsoft Office Excel 2003 için: Microsoft Excel 11.0 Nesne KitaplığıSeçimlerinizi kabul etmek için Başvuru Ekle iletişim kutusunda Tamam'ı tıklatın.
Görünüm menüsünde Araç Kutusu'na tıklayın ve ardından bir Düğme denetimini Form1'e sürükleyin.
Button1'e çift tıklayın.
Notlar Formun kod penceresi görüntülenir.
Form1.vb en üstüne aşağıdaki kodu ekleyin:
Imports Microsoft.Office.InteropKod penceresinde aşağıdaki kodu değiştirin:
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click End SubAşağıdaki kodu değiştirin:
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 SubUygulamayı çalıştırmak için F5 tuşuna basın.
Windows Görev Yöneticisi'ni açın. Visual Studio'da hata ayıklama iletilerini görmek için Çıkış penceresini görüntüleyin. Komut düğmesine tıklayın. İşlemler listesinde Excel.exe örneğinin görüntülendiğine dikkat edin.
Uygulama uyku modunu tamamladıktan sonra bile Excel örneği görev listesinde çalışmaya devam eder. İletişim kutusunu kapatın ve Excel'in artık İşlemler listesinde gösterilmediğine dikkat edin.
"Çözüm" bölümündeki adımları uyguladığınızda, Office uygulaması son değişkeni serbest bıraktıktan sonra çıkar. Aşağıdaki kodu kullanarak 5. Adımdaki işlevi değiştirin:
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
Visual C# .NET kullanıyorsanız, NAR() işlevinin koduna başvurun:
private void NAR(object o)
{
try
{
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
}
catch {}
finally
{
o = null;
}
}
Not: T.NET Framework.NET Framework 2.0'dan başlayarak, aynı sonucu elde etmek için while döngüsü System.Runtime.InteropServices.Marshal.ReleaseComObject yerine System.Runtime.InteropServices.Marshal.ReleaseComObject kullanabilirsiniz.
Sorun giderme
Notlar "Davranışı Yeniden Oluşturma Adımları" bölümünde açıklanan adımları izlerseniz ve sunucu hala kapanmazsa, GC'yi kullanabilirsiniz. Collect() yöntemi ve GC. Son nesneyi bıraktıktan sonra WaitForPendingFinalizers() yöntemi. Çalışma zamanı RCW'de çöp toplama işlemi gerçekleştirdiğinden, GC. Collect() yöntemi, çöp toplayıcıyı çalışmaya zorlar ve RCW'nin hala sahip olduğu tüm başvuruları serbest bırakabilir. ÖİB. Collect() yöntemi, kullanılabilir maksimum belleği geri kazanmaya çalışır. Bu işlemin, tüm belleğin geri kazanılacağını garanti etmediğine dikkat edin.
Şunun için geçerlidir:
Bu makale şu sürümler için de geçerlidir:
- Microsoft Visual Basic .NET (tüm sürümler)
- Microsoft Visual C# .NET (tüm sürümler)
- Microsoft Office 2016 (tüm sürümler)
- Microsoft Office 2013 (tüm sürümler)