Visual Studio.net 클라이언트에서 자동화 후 office 응용 프로그램이 종료 되지 않습니다.

기술 자료 번역 기술 자료 번역
기술 자료: 317109 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

현상

Microsoft Office 응용 프로그램을 자동화할 때 Microsoft Visual Basic.net 또는 Microsoft Visual C#.net, Office 응용 프로그램의 경우 종료 되지 않습니다. Quit 메서드를 호출 합니다.

원인

.Net Visual Studio 호출을 COM에서 개체 경우 관리 코드는 런타임 호출 가능 래퍼 (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 구성 요소 해제 확인 횟수는 CLR 다시 입력 했습니다.
  • 참조 변수를 해제 하려면 변수를 설정 합니다. 같음 아무 것도 또는 Null.
  • 사용 된 종료 서버에 알리려면 Office 응용 프로그램 개체 메서드 종료 합니다.

현재 상태

이 으로 설계 된 동작이입니다.

추가 정보

동작을 재현 하는 방법

  1. Visual Studio.net을 시작 합니다.
  2. 파일 메뉴에서 새로 만들기 를 클릭 한 다음 프로젝트를 클릭 합니다. Visual Basic 프로젝트, Windows 응용 프로그램 을 선택 하 고 확인을 클릭 합니다. Form1이 기본적으로 만들어집니다.
  3. Microsoft Excel 개체 라이브러리에 참조를 추가 합니다. 이렇게 하려면 다음과이 같이 하십시오.
    1. 프로젝트 메뉴에서 참조 추가클릭 합니다.
    2. COM 탭에서 Excel에 대 한 개체 라이브러리를 찾아 다음 선택을 클릭 합니다.

      Microsoft Excel 10.0 개체 라이브러리 대 한 Microsoft Excel 2002:

      참고 이미 수행 하는 경우 권장 되는 사용자 다운로드 및 Microsoft Office XP 기본 Interop 어셈블리 (Pia)를 설치 합니다. Office XP Pia에 대 한 자세한 내용은 Microsoft 기술 자료의 다음 문서 번호를 클릭 합니다.
      328912Microsoft Office XP 기본 interop 어셈블리 (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의 인스턴스가 여전히 작업 목록에도 실행 응용 프로그램이 종료 된 후. 대화 상자를 닫고는 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() 메서드는 마지막 개체를 해제 한 후. 때문에 런타임 GC RCW에서 가비지 수집을 수행합니다.Collect () 메서드는 가비지 수집기를 실행 하 고 하나를 해제할 수 있습니다 여전히 RCW에 있는 참조. Gc입니다.Collect () 메서드를 사용할 수 있는 최대 메모리를 회수 하려고 합니다. Note는 이 모든 메모리를 회수를 보장 하지는 않습니다.

속성

기술 자료: 317109 - 마지막 검토: 2012년 8월 3일 금요일 - 수정: 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 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 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