Belirtiler
Microsoft Microsoft Office .NET Visual Basic Microsoft Visual C# .NET'den bir Office uygulamasını otomatik hale gelirsiniz, Çıkış yöntemi çağrılsa bile Office uygulaması çıkışı olmaz.
Neden
.NET Visual Studio yönetilen koddan bir COM nesnesini çağırsa, otomatik olarak Runtime Çağırılabilir Paketlayıcı (RCW) oluşturur. RCW , .NET uygulamasıyla COM nesnesi arasındaki çağrıları onaylar. RCW, COM nesne üzerinde bir başvuru sayımı tutar. Bu nedenle, RCW'de tüm başvurular yayınlanmazsa COM nesnesi çıkar olmaz.
Çözüm
Uygulamanın çıkışını Office için, otomasyon kodunuzun aşağıdaki ölçütlere uygun olup olmadığını seçin:
-
Her nesneyi yeni değişken olarak bildirebilirsiniz. Örneğin, aşağıdaki kod çizgisini değiştirebilirsiniz:
oBook = oExcel.Workbooks.Add()
Bunu aşağıdakiyle değiştirebilirsiniz:
dim oBooks as Excel.Workbooks oBooks = oExcel.Workbooks oBook = oBooks.Add()
-
Bir nesne kullanmayı bitirdikten sonra 0 döndürene kadar System.Runtime.InteropServices.Cog.ReleaseComObject'i döngüde kullanın. System.Runtime.InteropServices.Cog.ReleaseComObject, RCW'nin başvuru sayısını belirtir ve döngü, CLR'ye kaç kez yeniden girmiş olursa olsun temel COM bileşeninin yayınlanır.
-
Değişkenin başvurularını serbest bırakmak için, değişkeni Hiçbir şey veya Null değerine eşit olarak ayarlayın.
-
Office uygulama nesnesinin Çık yöntemini kullanarak sunucuyu kapatmasını söyleyin.
Durum
Bu davranış tasarımdan kaynaklanır.
Daha Fazla Bilgi
Davranışı yeniden oluşturma adımları
-
.NET Visual Studio'i başlatma.
-
Dosya menüsünde Yeni'ye tıklayın ve sonra da Tamam'a Project. Proje Visual Basic altında Uygulama Ekle Windows i seçin ve Tamam'a tıklayın.
Not Form1 varsayılan olarak oluşturulur. -
Nesne Kitaplığı'nın Microsoft Excel ekleyin. Bunu yapmak için şu adımları izleyin:
-
Ekle Project Başvuru Ekle'ye tıklayın.
-
COM sekmesinde, dosyanın Nesne Kitaplığı'Excel seç'e tıklayın.
Microsoft Excel 2002 için: Microsoft Excel 10.0 Nesne KitaplığıNote
Bunu henüz yapmadısanız Microsoft Office XP Birincil Birlikte Çalışma Derlemeleri'ne (PIA) indirip yüklemenizi öneririz.
XP PIA'ları Office daha fazla bilgi için aşağıdaki Microsoft Bilgi Bankası makalesine bakın:328912 Microsoft Office XP birincil birlikte çalışma derlemeleri (PIA) indirilebilir
2003 Microsoft Office Excel için: Microsoft Excel 11.0 Nesne Kitaplığı -
Seçimlerinizi kabul etmek için Başvuru Ekle iletişim kutusunda Tamam'a tıklayın.
-
-
Görünüm menüsünde Araç Kutusu'ne tıklayın ve bir Düğme denetimi öğesini Form1'e sürükleyin.
-
Düğme1'e çift tıklayın.
Not Formun kod penceresi görüntülenir. -
Form1.vb'nin en üstüne aşağıdaki kodu ekleyin:
Imports Microsoft.Office.Interop
-
Kod 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 Sub
Aşağıdaki kodu yerine kullanın:
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
-
Uygulamayı çalıştırmak için F5 tuşuna basın.
-
Görev Windows'ni açın. Hata Visual Studio ayıklama iletilerini görmek için Çıkış penceresini görüntüleme. Komut düğmesine tıklayın. İşlemler listesinde bir Excel.exe örneğinin göründüğüne dikkat.
-
Örneğin Excel uyku Excel bitirdikten sonra bile görev listesinde yine çalışır. İletişim kutusunu kapatın ve İşlemler listesinde Excel liste olmadığını fark ettiyebilirsiniz.
-
"Çözüm" bölümündeki adımları uygulayınca, Office son değişkeni çıkarktan sonra uygulamadan çıkar. 5. Adımda işlevi aşağıdaki kodu kullanarak 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 bakın:
private void NAR(object o)
{
try
{
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
}
catch {}
finally
{
o = null;
}
}
Not .NET Framework 2.0'dan başlayarak, aynı sonucu elde etmek için System.Runtime.InteropServices.Cog.FinalReleaseComObject döngü yerine System.Runtime.InteropServices.Cog.ReleaseComObject'i kullanabilirsiniz.
Sorun giderme
Yükleme dosyasının doğru sürümü ve sağlaması olduğunda Algıla ve Onar bu dosyanın üzerine kopyalamaz. "Davranışı Yeniden Oluşturma Adımları" bölümünde açıklanan adımları izlersiniz ve sunucu yine de kapanmazsa, GC kullanabilirsiniz. Collect() yöntemi ve OB (GC). Son nesneyi çıkardikten sonra WaitForPendingFinalizers() yöntemi. Çalışma zamanı RCW'de çöp koleksiyonu gerçekleştirdiği için GC. Collect() yöntemi çöp toplayıcıyı çalıştıracak şekilde güçler ve RCW'nin hala sahip olduğu başvuruları serbest bırakın. OB (OB). Collect() yöntemi, kullanılabilen en yüksek belleği geri almaya çalışır. Bunun, tüm belleğin geri tanınacaklarını garanti etmez.
Uygulandığı öğe
Bu makale aşağıdakiler 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)