어떻게 C\#에서 COM 구성 요 소 를 호출 합 니까?

머리말
COM(Component Object Modele,구성 요소 대상 모델)은 마이크로소프트 가 이전에 추앙 했 던 개발 기술 이기 때문에 현재 마이크로소프트 의 많은 제품 들 이 COM 구성 요소,예 를 들 어 Office,IE 등 을 사용 하고 있다.그러나.NET 플랫폼 의 프로그램 이 COM 구성 요 소 를 방문 하 는 방식 으로 어떤 기능 을 실현 하려 면 어떻게 합 니까?바로 개발 자가 이런 수 요 를 가지 기 때문에 마이크로소프트 는.NET FrameWork 에서 COM 과 위탁 관리 코드 간 의 상호 작용 을 지원 했다.이런 상호 작용 적 인 기술 은 바로 COM Interop 이다.그러나 COM Interop(COm 상호 작용)이라는 기술 은 위탁 관리 코드 에서 COM 대상 을 사용 하 는 것 을 지원 할 뿐만 아니 라 COM 에서 위탁 관리 대상 을 사용 하 는 것 도 지원 한다.본 주 제 는.NET 에서 COM 대상 을 호출 하 는 것 만 을 대상 으로 소개 한다.COM 기술 은 현재 많이 사용 되 지 않 기 때문에 COM 에서 위탁 관리 대상 을 어떻게 사용 하 는 지 는 본 시리즈 에서 소개 하지 않 을 것 이다.필요 한 친구 가 있 으 면 MSDN 관련 링크 를 참조 하 세 요http://msdn.microsoft.com/zh-cn/library/3y76b69k(v=vs.100).aspx
다음은.NET 에서 COM 구성 요 소 를 어떻게 호출 하 는 지 구체 적 인 실례 를 살 펴 보 겠 습 니 다.
2.어떻게 C\#에서 COM 구성 요 소 를 호출 합 니까―Office 상호 작용 대상 에 접근 합 니까?
Office 제품 에 COM 구성 요 소 를 많이 사 용 했 기 때문에 Office 의 COM 대상 을 호출 하여 Word 문 서 를 만 들 고 만 든 문 서 를 파일 디 렉 터 리 에 저장 하 는 예(새 콘 솔 프로그램 에'Microsoft.Office.Interop.Word 14.0.0.0'을 추가 합 니 다.이 참조,14.0.0.0 버 전 은 Office 2010 에 대응 하 는 상호 작용 프로그램 집합 입 니 다.12.0.0.0 버 전 은 Office 2007 에 대응 하 는 상호 작용 프로그램 집합 으로 컴퓨터 에 Office 2007 만 설치 되 어 있 으 면 12.0.0.0 버 전 만 찾 을 수 있 고 Office 2010 이 설치 되 어 있 으 면 이 두 버 전 을 동시에 찾 을 수 있다.)구체 적 인 코드 는 다음 과 같다.

using System;
//          
using Microsoft.Office.Interop.Word;

namespace COM    
{
  class Program
  {
    static void Main(string[] args)
    {
      //   COM     Word  
      CreateWordDocument();
    }

    private static void CreateWordDocument()
    {
      //   Word  Word  
      Application wordApp = new Application() { Visible = true };

      //   Word  
      wordApp.Documents.Add();
      Document wordDoc = wordApp.ActiveDocument;
      Paragraph para = wordDoc.Paragraphs.Add();
      para.Range.Text = "   ,  Learning Hard  ";

      //     
      object filename = @"D:\learninghard.doc";
      wordDoc.SaveAs2(filename);

      //   Word
      wordDoc.Close();
      wordApp.Application.Quit();
    }
  }
}
실행 결 과 는:

이 때 지정 한 파일 디 렉 터 리 에서 방금 만 든 Word 문 서 를 볼 수 있 습 니 다.COM 상호작용 기술 을 통 해 우 리 는 Office 의 자동화 작업 을 할 수 있다.
3.C\#에서 COM 구성 요 소 를 호출 하 는 실현 원리 에 대한 분석
위의 예 를 통 해 알 수 있 듯 이.NET 에서 COM 구성 요 소 를 호출 하 는 것 은 매우 편리 하고 간단 하기 때문에 우 리 는 그 뒤의 원 리 를 전혀 이해 할 수 없다.다음은 위탁 관리 코드 에서 COM 구성 요 소 를 호출 하 는 실현 원리 와 필요 한 절 차 를 소개 한다.
위의 프로그램 을 실행 하려 면 상호 작용 프로그램 집합 인"Microsoft.Office.Interop.Word 14.0.0.0"을 추가 해 야 합 니 다.아래 절 차 를 통 해 이 프로그램 집합 을 추가 할 수 있 습 니 다.
4.567917.'솔 루 션 자원 관리자'에서'인용'폴 더 를 오른쪽 클릭 하고'인용 추가'를 누 르 십시오
  • ".NET"옵션 에서 최신 버 전의 Microsoft.Office.Interop.Word 를 선택 하 십시오.  예 를 들 어'Microsoft.Office.Interop.Excel 14.0.0.0'이다.  "확인"을 누 르 십시오.
  • 위 에 인용 을 추가 하 는 절 차 를 통 해 알 수 있 듯 이 Microsoft.Office.Interop.Word.dll 은 COM 구성 요소 가 아 닌.NET 프로그램 집합 입 니 다.이 럴 때 여러분 은 이러한 의문 이 있 을 것 입 니 다.COM 구성 요 소 를 호출 하 는 것 이 아 닙 니까?어떻게 위탁 관리 코드 에서.NET 프로그램 집합 을 호출 합 니까?이렇게 해서 어떻게.NET 에서 COM 구성 요 소 를 호출 하 는 시연 이 라 고 할 수 있 습 니까?그러나 사실은 Microsoft.Office.Interop.Word.dll 은.NET 프로그램 집합 이 고 COM 구성 요소 의 상호 작용 프로그램 집합 이 라 고도 합 니 다.이 프로그램 은 COM 구성 요소 에서 정의 하 는 유형의 메타 데 이 터 를 집중 적 으로 포함 하고 위탁 관리 코드 는 상호 작용 프로그램 을 통 해 공 개 된 인터페이스 나 대상 을 호출 하여 COM 대상 과 인 터 페 이 스 를 간접 적 으로 호출 합 니 다.위탁 관리 코드 에서 COM 대상 과 인 터 페 이 스 를 직접 사용 할 수 없 기 때문에 위탁 관리 코드 가 COM 대상 에 대한 호출 은 CLR 의 COM Interop 층 을 통 해 대리 로 이 루어 집 니 다.이 대 리 는 RCW(즉,Runtime Callable Wrapper,실행 시 호출 가능 한 포장)이기 때문에 COM 이미지 에 대한 호출 은 모두 RCW 를 통 해 이 루어 집 니 다.RCW 가 하 는 일 은 주로 COM 대상 을 활성화 하고 위탁 관리 코드 와 비 위탁 관리 코드 사이 에서 데이터 봉 송 처 리 를 하 는 것 이다(여기 서 알 수 있 듯 이 RCW 는.NET 플랫폼 과 COM 구성 요소 간 의 대리 이다.마이크로소프트 의 많은 기술 은 모두 대 리 를 사용 했다.예 를 들 어 WCF 기술―우리 가 코드 에서 만 든 대상 은 서비스의 대리 일 뿐이다.대리 대상 을 통 해 진짜 대상 을 방문 하 는 서비스,즉 방법.대리 의 기술 에 대해 말하자면 C\#의 의뢰 도 대리 의 실현 이다.이때 23 개의 디자인 모델 중의-대리 모델 을 생각 했다.그러나 생활 속 에서 도 대리 의 예,전세 중개,대리 서버 등 이 적지 않다.다음은.NET 에서 COM 구성 요 소 를 호출 하 는 원 리 를 그림 으로 보 여 줍 니 다.

    Tlblmp.exe 도 구 를 통 해 서로 조작 하 는 프로그램 집합 으로 태 어 나 는 절차 에 대해 자세히 말씀 드 리 지 않 겠 습 니 다.여러분 은 MSDN 에서 이 도구 의 상세 한 사용 설명 을 참고 하 실 수 있 습 니 다http://msdn.microsoft.com/zh-cn/library/tt0cf3sx(v=VS.80).aspx
    그러나 우 리 는 Visual Studio 에 내 장 된 지원 을 사용 하여 COM 형식 라 이브 러 리 에 상호 작용 프로그램 집합 을 만 드 는 작업 을 수행 할 수 있 습 니 다.우 리 는 VS 에서.NET 프로젝트 에 대응 하 는 COM 구성 요소 의 인용 을 추가 하면 VS 는 COM 형식 라 이브 러 리 의 COM 형식 라 이브 러 리 를 프로그램 집중 의 메타 데이터 로 자동 으로 전환 시 키 고 프로젝트 의 Bin 디 렉 터 리 에서 상호 작용 프로그램 집합 을 생 성 합 니 다.그래서 VS 에 COM 인용 을 추가 합 니 다.사실은 마지막 프로그램 에서 상호 작용 프로그램 집합 을 인용 한 다음 에 RCW 를 통 해 COM 구성 요 소 를 호출 합 니 다.그러나 Office 의 Microsoft.Office.Interop.Wordd.dll 에 대해 서도 이 프로그램 집합 은 상호 작용 프로그램 집합 이지 만 주 상호 작용 프로그램 집합 인 PIA(Primary Interop Assemblies)이기 도 합 니 다.주 상호 작용 프로그램 집합 은 공급 업 체 가 제공 하 는 유일한 프로그램 집합 으로 주 상호 작용 프로그램 집합 을 만 들 기 위해 TlbImp 명령 을 사용 할 수 있 습 니 다./primary 옵션 을 엽 니 다.여기 서 보 니 PIA 와 일반 프로그램 집합 은 어떤 차이 가 있 을 까?차이 점 은 PIA 가 COM 구성 요소 가 정의 하 는 데이터 형식 을 포함 하 는 동시에 공개 키,COM 형식 라 이브 러 리 의 공급 자 등 특수 한 정보 도 포함 하고 있다 는 것 이다.그런데 왜 주 상호작용 프로그램 집합 이 필요 합 니까?이 문제 에 대한 답 은 주 상호작용 프로그램 집합 이 배치 프로그램 을 해결 할 때 상호작용 프로그램 집합 버 전이 일치 하지 않 는 문 제 를 인용 하 는 데 도움 을 줄 수 있다 는 것 이다.만약 에 개발 자가 COM 구성 요소 형식 라 이브 러 리 에 여러 개의 상호작용 프로그램 집합 을 생 성 할 경우 프로젝트 에서 인용 한 상호작용 프로그램 집합 버 전과 배치 할 때의 상호작용 프로그램 집합 버 전이 일치 하지 않 는 문제 가 발생 하면 상호작용 프로그램 집합 이 있 을 때 우 리 는 공식 적 으로 주 상호작용 프로그램 집합 을 제공 하 는 것 을 직접 참조 할 수 있다.)
    오류 처리
     COM 구성 요 소 를 어떻게 호출 하 는 지 알 게 되면 COM 대상 을 호출 하 는 방법 이 실 패 했 을 때 실패 한 정 보 를 어떻게 얻 느 냐 고 물 을 수도 있 습 니 다.이 의문 에 대해 잘못된 처리 방법 은 우리 가 평소에 위탁 관리 코드 에서 처리 하 는 방식 과 같 습 니 다.다음은 잘못된 정 보 를 어떻게 얻 었 는 지 구체 적 으로 보 겠 습 니 다.다음 코드 의 기능 은 기 존의 Word 문 서 를 열 고 해당 하 는 텍스트 를 삽입 하 는 것 입 니 다.지정 한 Word 문서 가 존재 하지 않 을 때.이때 COM 대상 을 호출 하 는 Open 방법 이 실 패 했 습 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.
    
    using System;
    using Microsoft.Office.Interop.Word;
    using System.IO;
    using System.Runtime.InteropServices;
    
    namespace COM         
    {
      class Program
      {
        static void Main(string[] args)
        {
          //            
          string wordPath = @"D:\test.docx";
          OpenWordDocument(wordPath);
          Console.Read();
        }
    
        //          
        private static void OpenWordDocument(string wordPath)
        {
          //   Word     
          Application wordApp = new Application() { Visible = true };
          Document wordDoc=null;
          try
          {
            //         ,      COM       
            //   Word  
            wordDoc = wordApp.Documents.Open(wordPath);
            //  Word     
            Range wordRange = wordDoc.Range(0, 0);
            wordRange.Text = "       ";
    
            //     
            wordDoc.Save();
          }
          catch(Exception ex)
          {     
            //         HRESULT 
            //   COM        HRESULT          
            int HResult = Marshal.GetHRForException(ex);
            //          ,        
            Console.ForegroundColor = ConsoleColor.Red;
            //    HRESULT  16    
            Console.WriteLine("      ,     :{0}, HRESULT= 0x{1:x}", ex.GetType().Name, HResult);
            Console.WriteLine("     :" + ex.Message.Replace('\r', ' '));
          }
          finally
          {
            //      
            if (wordDoc != null)
            {
              wordDoc.Close();
            }
            //   Word  
            wordApp.Quit();
          }
        }
      }
    }
    만약 우리 D 디스크 에 test.docx 문서 가 존재 하지 않 는 다 면 코드 는 catch 블록 에 들 어가 이상 정 보 를 출력 합 니 다.실행 결 과 는 다음 과 같 습 니 다.

    위의 결과 에서 우 리 는 HRESULT 값 을 보 았 는데,이 값 은 정말 COM 코드 에서 되 돌아 온 것 이다.COM 에서 COM 방법 은 HRESULT 로 돌아 가 오 류 를 보고 합 니 다.NET 방법 은 이상 을 일 으 켜 오 류 를 보고 합 니 다.위탁 관리 코드 에서 COM 코드 에 나타 난 오류 와 이상 정 보 를 편리 하 게 얻 기 위해 CLR 은 이들 의 전환 을 제공 합 니 다.오류 가 발생 한 HRESULT 는 모두.NET Framework 에 나타 나 는 이상 류 입 니 다.구체 적 인 매 핑 관 계 는 MSDN 의 글 을 참고 할 수 있 습 니 다http://msdn.microsoft.com/zh-cn/library/9ztbc5s1(VS.80).aspx나 는 구체 적 으로 표 로 열거 하지 않 는 다.HRESULR 이 같은 효 과 를 가 진.NET Framework 이상 클래스 에 매 핑 되 지 않 을 경우,COM Exception 이상 클래스 에 매 핑 됩 니 다.Marshal 류 의 GetHRForException 방법 을 통 해 이상 클래스 에 대응 하 는 HRESULT 값 을 얻 을 수 있 습 니 다.
    소결
    .NET 에서 COM 구성 요 소 를 호출 하 는 것 에 대한 소 개 는 여기까지 입 니 다.비록 우리 가.NET 에서 COM 대상 을 호출 하 는 방법 이 매우 간단 하고 편리 하 더 라 도 CLR 이 우리 뒤에서 완성 하 는 작업 이 어떤 것 인지 이해 하고 위탁 관리 코드 에서 COM 구성 요 소 를 호출 하 는 원 리 를 이해 하 는 것 도 필요 합 니 다.호출 의 원 리 를 이해 한 후에 우리 가 문제 가 생 겼 을 때 바로 해결 방안 을 찾 아 해결 할 수 있 고 손 쓸 길이 없다 고 생각 하지 않 기 때문에 우리 가 문 제 를 해결 하 는 능력 을 제공 하 는 데 도움 을 줄 수 있다.
    이상 은 C\#에서 COM 구성 요 소 를 어떻게 호출 하 는 지 에 대한 상세 한 내용 입 니 다.C\#COM 구성 요 소 를 호출 하 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기