PRB: Visual Basic .NET이나 Visual C# .NET에서 WithEvents 또는 Delegates를 사용하여 Excel 이벤트를 처리하는 동안 오류 발생

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

현상

응용 프로그램에서 WithEvents(Visual Basic .NET) 또는 Delegates(Visual Basic .NET 또는 Visual C# .NET)를 사용하여 Excel 이벤트를 처리하려고 하면 다음과 같은 오류 메시지가 나타날 수 있습니다.
처리되지 않은 'System.InvalidCastException' 형식의 예외가 interop.excel.dll에서 발생했습니다.

추가 정보: 해당 인터페이스를 지원하지 않습니다.

원인

Excel에 대해 생성된 interop 어셈블리의 이벤트 래퍼 클래스는 상당히 엄격한 액세스 권한을 갖습니다. 이러한 래퍼 클래스는 Private으로 표시되어 있기 때문에 범용 런타임이 래퍼 클래스에 대한 IUnknown::QueryInterface 호출을 허용하지 않고 E_NOINTERFACE를 반환합니다. 이에 따라 "현상" 절에서 설명하는 예외 오류가 나타납니다.

해결 방법

이 문제를 해결하려면 Excel에 대해 생성된 interop 어셈블리를 수동으로 수정하여 이벤트 래퍼 클래스에 대한 액세스 권한을 완화하면 됩니다. 이렇게 하려면 다음과 같이 하십시오.
  1. Visual Studio .NET 프로젝트를 저장한 후 닫습니다.
  2. Visual Studio .NET 명령 프롬프트를 열고 디렉터리를 프로젝트의 출력 디렉터리로 변경합니다(예: Visual Basic 프로젝트의 경우 project name\bin, C# 프로젝트의 경우 project name\bin\release).
  3. 다음과 같이 Ildasm.exe를 사용하여 Excel interop 어셈블리에서 중간 언어를 추출합니다.
    ildasm.exe /source Interop.Excel.dll /output=Interop.Excel.il
    					
  4. 워드패드와 같은 텍스트 편집기에서 Interop.Excel.il을 열고 "_SinkHelper"를 검색합니다. _SinkHelper 클래스의 액세스 권한을 Private에서 Public으로 변경한 다음 Interop.Excel.il을 저장하고 닫습니다.
  5. Visual Studio .NET 명령 프롬프트에서 다음과 같이 Ilasm.exe와 /dll 스위치를 사용하여 중간 언어 파일을 interop 어셈블리로 다시 컴파일합니다.
    ilasm.exe /dll Interop.Excel.il /output=Interop.Excel.dll
    					
  6. Visual Studio .NET에서 프로젝트를 엽니다.
  7. 5단계에서 만든 Interop.Excel.dll에 대한 참조를 추가합니다. 이렇게 하려면 다음과 같이 하십시오.

    중요: 이 단계는 필수입니다. 새로운 interop 어셈블리에 참조를 설정하지 않으면 프로젝트를 컴파일하거나 설치 패키지를 만들 때 Visual Studio .NET이 interop 어셈블리를 다시 생성합니다.
    1. Visual Studio .NET 솔루션 탐색기의 프로젝트 참조 목록에서 Excel을 마우스 오른쪽 단추로 누른 다음 제거를 누릅니다.
    2. 프로젝트 메뉴에서 참조 추가를 누릅니다.
    3. .NET 탭에서 찾아보기를 누르고 프로젝트의 출력 디렉터리에서 Interop.Excel.dll 파일을 찾은 다음 열기를 누릅니다.
    4. 참조 추가 대화 상자에서 확인을 눌러 선택한 내용을 적용합니다.
  8. 수정된 interop 어셈블리를 사용하여 프로그램을 다시 테스트합니다. 이렇게 하려면 다음과 같이 하십시오.
    1. F5 키를 눌러 프로그램을 다시 빌드하고 실행합니다.
    2. Form1이 나타나면 Button1을 눌러 Excel을 시작합니다.
    3. 새 통합 문서를 시작한 다음 아무 셀에나 데이터를 입력합니다.
    4. Visual Studio .NET의 보기 메뉴에서 다른 창을 누른 다음 출력을 누릅니다. 출력 창에 프로그램이 해당 이벤트를 처리했음을 확인하는 "Change Event Triggered" 메시지가 나타납니다.

추가 정보

문제를 재현하는 방법

  1. Visual Studio .NET을 시작합니다.
  2. 파일 메뉴에서 새로 만들기를 누른 다음 프로젝트를 누릅니다.
  3. Visual Basic 프로젝트에서 Windows 응용 프로그램을 누른 다음 확인을 누릅니다. 기본적으로 Form1이 만들어집니다.
  4. Microsoft Excel Object Library에 대한 참조를 추가합니다. 이렇게 하려면 다음과 같이 하십시오.
    1. 프로젝트 메뉴에서 참조 추가를 누릅니다.
    2. COM 탭에서 Microsoft Excel Object Library를 찾아 선택을 누릅니다.

      참고: Excel 개체 라이브러리에는 버전 번호가 포함되어 있습니다. Excel 2000의 버전은 9.0이고 Excel 2002의 버전은 10.0입니다.
    3. 참조 추가 대화 상자에서 확인을 눌러 선택한 내용을 적용합니다. 선택한 라이브러리에 대해 래퍼를 생성할 것인지 묻는 메시지가 표시되면 를 누릅니다.
  5. Form1에 명령 단추를 추가합니다.
  6. Button1을 두 번 눌러 Click 이벤트 처리기를 편집합니다.
  7. 다음 코드를
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
        End Sub
    					
    아래와 같이 바꿉니다.
        Dim WithEvents oXL As Excel.Application
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            oXL = New Excel.Application()
            oXL.Visible = True
            oXL.UserControl = True
        End Sub
    
        Private Sub oXL_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range) Handles oXL.SheetChange
            Debug.WriteLine("Change Event Triggered")
        End Sub
    					
  8. F5 키를 눌러 프로그램을 빌드하고 실행합니다.
  9. Form1을 로드한 후에 Button1을 누릅니다. 다음 줄에 오류 메시지가 나타납니다.
    oXL = New Excel.Application()
    					

참조

Excel의 이벤트 처리에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
302814 HOWTO: Visual Basic .NET을 사용하여 Excel 이벤트 처리
302815 HOWTO: Visual C# .NET을 사용하여 Excel 이벤트 처리




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 316653 - 마지막 검토: 2006년 9월 7일 목요일 - 수정: 4.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Visual Studio .NET 2002 Professional Edition
키워드:?
kberrmsg kbautomation kbprb KB316653

피드백 보내기

 

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