기본 콘텐츠로 건너뛰기

등록 과정(Registry) 없이 OCX 사용하는 방법

현재 진행 중인 프로젝트가 외국계 증권사이다보니 시스템에 뭘 설치할 수가 없다.

외부에서 리포트 솔루션을 도입해서 사용을 하여야 하는데,
제공되는 뷰어가 OCX 버전이라서 무설치로 .NET Window Forms에서 적용하여야 한다.

여러 가지 방법을 찾던 중에 다음과 같은 방법을 이용하여 적용할 수 있었다.

단, 이게 최선의 방법일지?? 문제가 없을지는 이후에도 검토를 해 보아야 하겠지만,
기본적인 작동은 하고 있기 때문에 아래의 방법을 정리해 놓도록 한다.

기본적으로 OCX 만 제공받은 상태라고 가정한다.

1. Visual Studio Command Prompt 를 실행한다.

2. sn -k Report.snk 를 실행해서 서명 키를 생성하도록 한다.

3. tlbimp viewer.ocx /primary /keyfile:Report.snk /out:ReportViewer.dll /namespace:MyNamespace 를 실행해서 Type Library용 Assembly를 생성한다.

4. aximp viewer.ocx /Source /rcw:ReportViewer.dll 를 실행해서 OCX Wrapper DLL 과 소스를 생성한다.

위와 같이 생성된 DLL을 참조해서 사용하면 된다. 소스도 같이 생성하였으므로 DLL을 쓰던 소스코드를 쓰던 선택하면 된다.

중요한 것은 Type Library DLL 과 Wrapper DLL 또는 소스를 같이 사용해야 한다는 점이다.

이제 구동을 할 때 .NET Assembly 에서 OCX를 Loading하기 위한 정보를 제공해 주어야 한다. 일반적이라면 OCX를 Registry에 등록을 하고 사용하기 때문에 COM Server를 사용하겠지만, Registry 등록없이 사용하는 것이기 때문에 이를 대신할 정보를 생성하는 것이라고 생각하면 된다.

1. Visual Studio에서 시작 프로젝트를 선택하고 "추가 > 어플리케이션 마니페스트 파일" 처리하면 app.manifest 파일이 생성된다. 이름을 어셈블리 이름과 동일하게 맞추고 (ex. WindowsFormsApplication3.exe.manifest) 실행 경로로 복사될 수 있도록 해 준다.

2. Visual Studio 의 Command 창을 열고 ocx 가 존재하는 경로에서 다음과 같이 명령을 지정하여 OCX에 대한 Manifest 파일을 생성한다.

mt.exe -tllb:ocx파일명 -dll:ocx파일명 -out:ocx파일명.manifest

3. 위에서 생성한 WindowsFormsApplication.3.exe.manifest 파일을 열고 내용을 다음과 같이 변경한다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
    manifestVersion="1.0">
 <assemblyIdentity type = "win32" name = "WindowsFormsApplication3" version = "1.0.0.0" />
 <dependency>
  <dependentAssembly>
   <assemblyIdentity
    type="win32"
    name="ocx명"
    version="1.0.0.0" />
  </dependentAssembly>
 </dependency>
</assembly>

4. mt.exe 로 생성한 ocx명.manifest 파일 (ex. TestSample.ocx.manifest) 을 실행 경로로 복사해 준다.

위와 같이 처리하면 이제는 Registry 등록 과정이 없이 독립적으로 사용할 수 있다.

참고로 첫번째 단계에서 생성한 Interop DLL 들은 참조 설정을 한 후에 Interop 정보 포함은 false 로 지정하고 특정버전을 true 로 해주면 된다.





댓글