Office uygulamasından sonra Visual Studio .net istemciden Otomasyon sonlandırılmaz

Makale çevirileri Makale çevirileri
Makale numarası: 317109 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

Ne zaman bir Microsoft Office uygulamasından otomatikleştirme Microsoft Visual Basic .net veya Microsoft Visual C# .net, Office uygulaması ne zaman sonlandırılmaz Quit yöntemini çağırın.

Neden

Yönetilen zaman gelen Visual Studio .net çağrıları bir com nesnesi kod, bir çalışma zamanı Callable Wrapper (rcw) otomatik olarak oluşturur. rcw .net uygulaması ve com nesnesi arasındaki aramaları s?ralar. rcw sürekli bir com nesnesi üzerinde başvuru sayısı. Bu nedenle, tüm başvurular yok olmuş, com nesnesi üzerinde RCW'yu serbest bırakılmış, sonlandırılmaz.

Çözüm

Office uygulaması çıkıyor emin olmak için emin olun Otomasyon kodunun aşağıdaki ölçütleri karşıladığından emin:
  • Her nesneyi yeni bir değişken olarak bildirir. Örneğin, değiştirme Aşağıdaki kod satırı
    oBook = oExcel.Workbooks.Add()
    					
    şu şekilde:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Kullan System.Runtime.InteropServices.Marshal.ReleaseComObject döngü, bir nesnenin i?iniz bitti?inde, 0 değerini döndürür oluncaya kadar. , System.Runtime.InteropServices.Marshal.ReleaseComObject rcw ve döngünün başvuru sayısı sağlamak temel alınan com bileşeni ne olursa olsun nasıl yayımlanır azaltır birçok kez clr Harfleriniz.
  • Değişkenin başvurusu serbest bırakmak için değişken ayarlayın. eşit Hiçbir şey veya Null.
  • Kullan Çıkın sunucuya iletmeleri için Office uygulama nesnesinin yöntemi bilgisayarı kapatın.

Durum

Bu davranış tasarım gereğidir.

Daha fazla bilgi

Davranışı yeniden oluşturma adımları

  1. Visual Studio .net başlatın.
  2. Dosya menüsünde Yeni'yi tıklatın ve Proje'yitıklatın. Visual Basic projelerialtında Windows Application ' ı seçin ve Tamam' ı tıklatın. Form1, varsayılan olarak oluşturulur.
  3. Microsoft Excel Nesne kitaplığınabir başvuru ekleyin. Bunu yapmak için şu adımları izleyin:
    1. Project menüsünde Add Referencekomutunu tıklayın.
    2. com sekmesinde Excel için Nesne Kitaplığı bulun ve Seç' i tıklatın.

      Microsoft Excel 2002: Microsoft Excel 10.0 Nesne Kitaplığı

      Not Henüz bunu yapmadıysanız, önerilen, sizin karşıdan yükleyip Microsoft Office xp Primary Interop Assemblies (PIA). Office xp PIA'ları hakkında ek bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
      328912Microsoft Office xp primary Interop assemblies (PIA) karşıdan yüklenebilir
      Microsoft Office Excel 2003: Microsoft Excel 11.0 Nesne Kitaplığı
    3. Seçimlerinizi kabul Başvurularını Ekle iletişim kutusunda, Tamam ' ı tıklatın.
  4. View menüsünden Toolbox' ı ve sonra Form1'in bir Button denetimi sürükleyin.
  5. Button1' i çift tıklatın. Formun kod penceresi görüntülenir.
  6. Form1.vb dosyasının üstüne aşağıdaki kodu ekleyin:
    Imports Microsoft.Office.Interop
    					
  7. Kod penceresinde aşağıdaki kodu Değiştir
        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    					
    aşağıdakileri içeren:
    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. Uygulamayı çalıştırmak için F5 tuşuna basın.
  9. Windows Görev Yöneticisi'ni açın. Visual Studio'da görüntülemek Output penceresi, hata ayıklama iletilerini görmek için. Komut düğmesini tıklatın ve dikkat edin Excel.exe örneği işlemler listesinde görüntülenir.
  10. Hatta, hala çalışır görev listesinde Excel örneği sleeping uygulama tamamlandıktan sonra. İletişim kutusunu kapatmak ve dikkat edin Excel artık işlemler listesinde görünür.
  11. Ne zaman "Çözüm" bölümündeki adımları uygulamak, Office uygulaması son değişken yayımlandıktan sonra çıkar. Değiştir Adım 5'te işlevini aşağıdaki kodu kullanarak:
      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şlev kodu başvurusu:
private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}
Not: .net Framework 2.0 ile başlayarak, System.Runtime.InteropServices.Marshal.FinalReleaseComObject while kullanabilirsiniz aynı sonucu elde etmek için arama System.Runtime.InteropServices.Marshal.ReleaseComObject döner.

Sorun giderme

Açıklanan adımları kullanarak unutmayın "Davranış Reproduce için adımlar" bölümüne ve sunucunun hala değil Kapat aşağı, gc kullanabilirsiniz.Collect() yöntemi ve gc .WaitForPendingFinalizers() son nesne yayımlandıktan sonra yöntemi. Çünkü çalışma zamanı çöp toplama gc RCW'yu üzerinde gerçekleştirir.Collect() yöntemini çalıştırmak için çöp toplayıcı zorlar ve herhangi bir sürüm başvurular RCW'yu hala vardır. gc.Collect() yöntemi kullanılabilir en büyük bellek geri kazanmak çalışır. Dikkat edin Bu tüm bellek iadesi olduğunu garanti etmez.

Özellikler

Makale numarası: 317109 - Last Review: 3 Ağustos 2012 Cuma - Gözden geçirme: 1.0
Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbautomation kbprb kbmt KB317109 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir: 317109

Geri Bildirim Ver

 

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