안녕하세요.
현재 진행중인 프로젝트에서 ActiveX 컨트롤을 동적으로 로드하여 사용해야하는데
구글링(현재 COM 관련 지식이 전무한 상태)해봐도 적절한 해결책을 찾을 수 없어 질문드립니다.
최종 구현 목표
1. .Net 환경에서 동적(n개 ocx를 사용자 선택에 따라)으로 OCX를 로드하여 윈폼에 올림
2. 스크립트(현재는 ClearScript)에서 로드한 OCX 객체의 Property, Method, Event 접근하여 관련 작업을 수행
ex) axHost.NextDay(); // 스크립트에서 이와 같이 접근하여 사용
step1
아래와 같이 AxHost 상속하여 OCX 로드
class AxHostEx : AxHost
{
public AxHostEx(string strCLSID)
: base(strCLSID)
{
}
// 아무런 추가 구현 없음
}
결과 : 로드되고 폼에 올려지며 정상 동작하나 해당 OCX 고유의 Property, Method, Event에 .Net 인터페이스로 접근 불가
(해보기 전까진 어떤 형태로든 '.Net 님이 다 알아서 해주실꺼야'라고 생각하고 있었습니다)
상태 : 이후 조사해 본바로는 AxHost를 상속받은 클래스에 COM객체와 직접 통신는 코드(기계적?)를 작성하여 해당 멤버들을 직접 구현해야 한다는 것을 알게되었습니다(제대로 이해한 것이 맞다면).
COM 관련 지식이 전무한 상태라 관련 내용을 살펴봐도 잘 이해가되지 않고
무엇보다 코드를 직접 구현하고 컴파일해야하는 정적인 방식이라 최종 구현 목표에 부합되지 않아 보류
step2
AxImp.exe 사용 COM Interop 어셈블리와 COM 프록시 어셈블리를 생성하여 어셈블리 로드
결과 : 완전하지 않지만 구현 목표에 부합하며 잘 동작함
상태 : 문제없이 잘 동작 하지만 동작(구현) 방식이 우아(?)하지도 안전(?)하지도 않는데다
배포되어 사용되는 시점에 모양새가 안타까워 가능한 다른 방법으로 찾고 있음
질문 요약
.Net에서 AxImp.exe를 사용하지 않고 동적으로 로드한 OCX의 인터페이스(Property, Method, Event)를 .Net 인터페이스 형태로 제공하는 것이 가능한가?
(step1의 구현 방식에서 로드한 COM 개체를 분석해 동적으로 멤버를 생성/추가하면되겠다(리플렉션이든 뭐든?)라고 막연히 생각해보는데 이것이 기술적으로 가능한 것인지?
만약 그런 방식으로 구현이 가능하다면 AxImp.exe와 같은 도구를 별도로 제공할필요가 없었텐데하는 의문에 질문하게 되었습니다)
혹은 상기 최종 구현 목표를 달성을 위한 또 다른 방법이 있다면 조언 부탁합니다.
답변 부탁드립니다.
감사합니다.
※ 첨부한 테스트 프로젝트는 용량 관계상 스크립트 라이브러리 패키지(Nuget)를 삭제한 상태입니다.
OCX 로드 테스트에 사용한 MSCAL.OCX도 첨부했습니다.
개발환경 : Win7 32bit, VS2015
[최초 등록일: ]
[최종 수정일: 10/12/2015]