어떻게 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.'솔 루 션 자원 관리자'에서'인용'폴 더 를 오른쪽 클릭 하고'인용 추가'를 누 르 십시오
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 구성 요 소 를 호출 하 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.