Застосунок Microsoft Office не піти після автоматизації з Visual Studio .net клієнта

Переклади статей Переклади статей
Номер статті: 317109 - Показ продуктів, яких стосується ця стаття.
Розгорнути все | Згорнути все

На цій сторінці

Ознаки

Коли ви автоматизувати додатка Microsoft Office від Microsoft Visual Basic .net або Microsoft Visual C# .net, додаток Office не вийти коли ви називаєте метод вийти .

причина

Коли Visual Studio .net дзвінки на COM об'єкт з вдалося код, автоматично створює на виконання Callable оболонка (RCW). На RCW маршалів дзвінки між .net застосування і COM-об'єкт. На RCW тримає на кількість посилань на об'єкт COM. Таким чином, якщо всі посилання не були випущений в RCW, об'єкт COM не піти.

Розв'язанн

Щоб переконатися, що додаток Office завершує роботу, переконайтеся, що що автоматизації код відповідає таким критеріям:
  • Оголосити кожний об'єкт як нову змінну. Наприклад, зміна наступний рядок коду
    oBook = oExcel.Workbooks.Add()
    					
    в нижче:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • сценарій виконання System.Runtime.InteropServices.Marshal.ReleaseComObject у циклі поки вона повертає значення 0, після завершення сценарій виконання об'єкта. На System.Runtime.InteropServices.Marshal.ReleaseComObject зменшує кількість посилань, з RCW, і цикл гарантує, що основного компонента COM випущений незалежно від того, як багато разів вона має повернувся до загальномовне середовище виконання.
  • Звільнити посилання на змінну, встановити змінну дорівнює Нічого або Null.
  • сценарій виконання у вийти метод об'єкта додатка Office щоб дізнатися сервер вимкнути.

Стан

Це ситуація передбачена.

Додаткові відомості

Відтворити поведінку

  1. Почати Visual Studio .net.
  2. У меню файл виберіть команду Створити та пункт проект. Під Проектів Visual Basicвиділіть Застосунок Windows і натисніть кнопку ОК. Форма Form1 створюється за промовчанням.
  3. Додати посилання на Бібліотеку об'єктів Microsoft Excel. Для цього виконайте такі дії:
    1. Проект меню натисніть кнопку Додати посилання.
    2. На вкладці " COM " Знайдіть бібліотеку об'єктів для Excel і натисніть кнопку вибрати.

      Для Microsoft Excel 2002: бібліотека об'єктів Microsoft Excel 10.0

      Примітка Якщо ви ще не зробили цього, він рекомендував, що ви Завантажити та встановити у Microsoft Office XP базовий комплект (PIAs). Щоб отримати додаткові відомості про Office XP PIAs клацніть номер статті в базі знань Microsoft Knowledge Base:
      328912Для завантаження доступні Microsoft Office XP загальномовному (PIAs)
      Для Microsoft Office Excel 2003: Microsoft Excel 11,0 бібліотека об'єктів
    3. Натисніть кнопку ОК у діалоговому вікні Додати посилання , щоб зберегти свій вибір.
  4. У меню Вигляд виберіть пункт панелі інструментіві натисніть кнопку керування перетягується Form1.
  5. Двічі клацніть Button1. Відображається вікно код» для форми.
  6. Додати наступний код у верхній частині Form1.vb:
    Imports Microsoft.Office.Interop
    					
  7. Замінити наступний код в вікно коду
        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        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 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. Натисніть клавішу F5, щоб запустити застосунок.
  9. Відкрийте диспетчер завдань Windows. В Visual Studio, відображення в Вивід вікна, щоб переглядати протокол IMAP налагодження. Натисніть кнопку та зверніть увагу, що екземпляр Excel. exe з'являється у списку процесів .
  10. Екземпляр Excel все ще працює у списку завдання навіть Після застосування закінчила спить. Закрийте діалогове вікно та зверніть увагу, що Excel більше не відображається у списку процесів .
  11. Коли здійснювати інтерактивні елементи, описані в розділі "Заходи усунення" застосунок Office завершує роботу після того, як він випускає останній змінної. Замінити на функції у кроці 5 з наступний код:
      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, посилання код для NAR() функції:
private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}
Примітка: Починаючи з .NET Framework 2.0, ви можете використовувати System.Runtime.InteropServices.Marshal.FinalReleaseComObject на Вільний час, замість петлю виклику System.Runtime.InteropServices.Marshal.ReleaseComObject для досягнення того ж результату.

Виправлення неполадок

Зауважте, що якщо ви виконайте інтерактивні елементи, описані в регіоні «Сходи до відтворити поведінку» розділ і сервер ще не закрили вниз ви можете використовувати GC.Collect() метод і GC.WaitForPendingFinalizers() метод після випуску останнього об'єкта. Тому що виконання виконує прибирання сміття на RCW, GC.Collect() методом сили до запуску, збирач сміття і може звільнити будь-якого посилання на RCW до сих пір. GC.Collect() метод намагається відновити максимальний об'єм пам'яті, яка доступна. Зверніть увагу, що Це не гарантує, що всі пам'яті знову звільняється.

Властивості

Номер статті: 317109 - Востаннє переглянуто: 3 серпня 2012 р. - Редакція: 1.0
Застосовується до:
  • 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
Ключові слова: 
kbautomation kbprb kbmt KB317109 KbMtuk
Машинний переклад
УВАГА! Цю статтю переклала програма машинного перекладу Microsoft, а не людина. Корпорація Microsoft пропонує вам як машинні переклади, так і переклади фахівців, щоб Ви мали доступ до всіх статей бази знань рідною мовою. Проте стаття, яку переклав комп’ютер, не завжди бездоганна. Вона може містити лексичні, синтаксичні або граматичні помилки. Так само помиляється іноземець, спілкуючись вашою рідною мовою. Корпорація Microsoft не несе відповідальність за жодні неточності, помилки або шкоду, завдану неправильним перекладом змісту або його використанням з боку користувачів. Крім того, корпорація Microsoft часто оновлює програму машинного перекладу.
Клацніть тут, щоб переглянути цю статтю англійською мовою: 317109

Надіслати відгук

 

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