Приложения Office продолжает работать после автоматизации из Visual Studio.NET клиента

Переводы статьи Переводы статьи
Код статьи: 317109 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Проблема

При автоматизации приложения Microsoft Office из Microsoft Visual Basic.NET или Microsoft Visual C#.NET, приложения Office продолжает работать при При вызове Завершить работу метод.

Причина

Когда Visual Studio.NET вызывает объект COM из управляемого код, автоматически создает оболочку вызываемой среды выполнения (RCW). Вызываемая оболочка времени Выполнения Выполняет маршалинг вызовов между.NET и COM-объекта. Отслеживает вызываемой оболочки времени Выполнения счетчик ссылок на COM-объект. Таким образом Если все ссылки не были. выпущены на модуль RCW COM-объект продолжает работать.

Решение

Чтобы убедиться в том, что выход из приложения Microsoft Office, убедитесь, что что код автоматизации отвечает следующим критериям:
  • Каждый объект Объявите новую переменную. Например изменение Следующая строка кода
    oBook = oExcel.Workbooks.Add()
    					
    Чтобы изменить следующим образом:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Использование System.Runtime.InteropServices.Marshal.ReleaseComObject После завершения использования объекта. Это уменьшает счетчика ссылок вызываемой оболочки времени Выполнения.
  • Чтобы освободить ссылку на переменную, значение переменной равно Ничего не -или- Значение 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 основные сборки взаимодействия (PIA). Для получения дополнительных сведений об основных сборок взаимодействия Office XP щелкните следующий номер статьи базы знаний Майкрософт:
      328912Microsoft Office XP основные сборки взаимодействия (PIA) доступны для загрузки
      Для 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, отображение Вывод окна для просмотра сообщений отладки. Нажмите кнопку команды и обратите внимание, что экземпляр Excel.exe появляется в Процессы список.
  10. Экземпляр Excel по-прежнему запускается в списке задач, даже После завершения приложения в спящем режиме. Закройте диалоговое окно и обратите внимание, что Microsoft Excel, больше не отображается в Процессы список.
  11. При реализации мероприятий в разделе «Решение» приложение Office завершает работу после освобождения последней переменной. Замена функция на шаге 5 со следующим кодом:
      Private Sub NAR(ByVal o As Object)
        Try
          System.Runtime.InteropServices.Marshal.ReleaseComObject(o)
        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 
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
    }
    catch {}
    finally 
    {
        o = null;
    }
}

Устранение неполадок

Обратите внимание, что если следовать инструкциям, приведенным в Воспроизвести поведение разделе «», а сервер по-прежнему не завершает вниз, можно использовать СБОРЩИК МУСОРА.Collect() метод и СБОРЩИК МУСОРА.WaitForPendingFinalizers() метод после выпуска последнего объекта. Так как среда выполнения выполняет сборку мусора для вызываемой оболочки времени Выполнения СБОРЩИК МУСОРА.Collect() метод вызывает сборщик мусора для запуска и может освободить любой ссылки, которые по-прежнему имеет RCW. В СБОРЩИК МУСОРА.Collect() метод пытается высвободить максимальный объем памяти, доступной. Обратите внимание, что Это не гарантирует высвобождения всей памяти.

Свойства

Код статьи: 317109 - Последний отзыв: 7 июня 2011 г. - Revision: 4.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 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке: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