ClickOnce를 사용하여 COM 구성 요소 배포
레거시 COM 구성 요소 배포는 전통적으로 어려운 작업이었습니다. 구성 요소를 전역으로 등록해야 하기 때문에 겹치는 애플리케이션 간에 원치 않는 부작용이 발생할 수 있습니다. 이 상황은 일반적으로 .NET Framework 애플리케이션에서는 문제가 되지 않는데, 구성 요소가 애플리케이션에 완전히 격리되어 있거나 상호 호환되기 때문입니다. Visual Studio를 사용하면 Windows 운영 체제에 격리된 COM 구성 요소를 배포할 수 있습니다.
ClickOnce는 .NET 애플리케이션을 배포하기 위한 쉽고 안전한 메커니즘을 제공합니다. 하지만 애플리케이션이 레거시 COM 구성 요소를 사용하는 경우 배포를 위한 추가 단계를 수행해야 합니다. 이 주제에서는 격리된 COM 구성 요소를 배포하고 네이티브 구성 요소(예: Visual Basic 6.0 또는 Visual C++의 구성 요소)를 참조하는 방법을 설명합니다.
격리된 COM 구성 요소 배포에 대한 자세한 내용은 ClickOnce와 등록이 필요 없는 COM을 사용한 앱 배포 간소화를 참조하세요.
등록이 필요 없는 COM
등록이 필요 없는 COM은 격리된 COM 구성 요소를 배포하고 활성화하기 위한 새로운 기술입니다. 등록이 필요 없는 COM은 일반적으로 시스템 레지스트리에 설치되는 모든 구성 요소의 형식 라이브러리 및 등록 정보를 애플리케이션과 동일한 폴더에 저장되는 매니페스트라는 XML 파일에 넣음으로써 작동합니다.
COM 구성 요소를 격리하려면 COM 구성 요소를 개발자의 컴퓨터에 등록해야 하지만 최종 사용자의 컴퓨터에 등록할 필요는 없습니다. COM 구성 요소를 격리하려면 참조의 Isolated 속성을 True로 설정하기만 하면 됩니다. 기본적으로 이 속성은 등록된 COM 참조로 처리되어야 함을 나타내는 False로 설정되어 있습니다. 이 속성이 True라면 빌드 시 이 구성 요소의 매니페스트가 생성됩니다. 또한 설치하는 동안 해당 파일이 애플리케이션 폴더에 복사됩니다.
매니페스트 생성기에서 격리된 COM 참조가 발생하면 구성 요소의 형식 라이브러리에 있는 모든 CoClass
항목을 열거하여 각 항목을 해당 등록 데이터와 대조하고, 형식 라이브러리 파일에 있는 모든 COM 클래스의 매니페스트 정의를 생성합니다.
ClickOnce를 사용하여 등록이 필요 없는 COM 구성 요소 배포
ClickOnce 배포 기술은 격리된 COM 구성 요소를 배포하는 데 적합합니다. ClickOnce 및 등록이 필요 없는 COM 모두 배포되기 위해서는 구성 요소에 매니페스트가 있어야 하기 때문입니다.
일반적으로 구성 요소의 작성자가 매니페스트를 제공해야 합니다. 하지만 그렇지 않은 경우 Visual Studio가 COM 구성 요소의 매니페스트를 자동으로 생성할 수 있습니다. 매니페스트 생성은 ClickOnce 게시 프로세스 중에 수행됩니다. 자세한 내용은 ClickOnce 애플리케이션 게시를 참조하세요. 이 기능을 사용하면 Visual Basic 6.0과 같은 이전 개발 환경에서 작성한 레거시 구성 요소도 활용할 수 있습니다.
ClickOnce에서 COM 구성 요소를 배포하는 방법에는 두 가지가 있습니다.
부트스트래퍼를 사용하여 COM 구성 요소를 배포합니다. 이 방법은 지원되는 모든 플랫폼에서 작동합니다.
네이티브 구성 요소 격리(등록이 필요 없는 COM이라고도 함) 배포를 사용합니다.
간단한 COM 구성 요소를 격리하고 배포하는 예
등록이 필요 없는 COM 구성 요소 배포를 보여 주기 위해 이 예에서는 Visual Basic 6.0을 사용하여 만든 격리된 네이티브 COM 구성 요소를 참조하는 Windows 기반 애플리케이션을 Visual Basic에서 만들고 ClickOnce를 사용하여 배포합니다.
먼저 네이티브 COM 구성 요소를 만들어야 합니다.
네이티브 COM 구성 요소를 만들려면
Visual Basic 6.0을 사용하여 파일 메뉴에서 새로 만들기를 클릭한 다음 프로젝트를 클릭합니다.
새 프로젝트 대화 상자에서 Visual Basic 노드를 선택하고 ActiveX DLL 프로젝트를 선택합니다. 이름 상자에
VB6Hello
을 입력합니다.참고 항목
ActiveX DLL 및 ActiveX 컨트롤 프로젝트 형식만 등록이 필요 없는 COM에서 지원됩니다. ActiveX EXE 및 ActiveX 문서 프로젝트 형식은 지원되지 않습니다.
솔루션 탐색기에서 Class1.vb를 두 번 클릭하여 텍스트 편집기를 엽니다.
Class1.vb에서
New
메서드에 대해 생성된 코드 뒤에 다음 코드를 추가합니다.Public Sub SayHello() MsgBox "Message from the VB6Hello COM component" End Sub
구성 요소 빌드 빌드 메뉴에서 솔루션 빌드를 클릭합니다.
참고 항목
등록이 필요 없는 COM은 DLL 및 COM 컨트롤 프로젝트 형식만 지원합니다. 등록이 필요 없는 COM에서는 EXE를 사용할 수 없습니다.
이제 Windows 기반 애플리케이션을 만들고 COM 구성 요소에 대한 참조를 추가할 수 있습니다.
COM 구성 요소를 사용하여 Windows 기반 애플리케이션을 만들려면
Visual Basic을 사용하여 파일 메뉴에서 새로 만들기를 클릭한 다음 프로젝트를 클릭합니다.
새 프로젝트 대화 상자에서 Visual Basic 노드를 선택하고 Windows 애플리케이션을 선택합니다. 이름 상자에
RegFreeComDemo
을 입력합니다.솔루션 탐색기에서 모든 파일 표시 단추를 클릭하여 프로젝트 참조를 표시합니다.
참조 노드를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 참조 추가를 선택합니다.
참조 추가 대화 상자에서 찾아보기 탭을 클릭하고 VB6Hello.dll로 이동하여 선택합니다.
참조 목록에 VB6Hello 참조가 나타납니다.
도구 상자를 가리키고 단추 컨트롤을 선택하여 Form1 양식으로 끌어 놓습니다.
속성 창에서 단추의 Text 속성을 Hello로 설정합니다.
단추를 두 번 클릭하여 처리기 코드를 추가하고, 코드 파일에서 처리기가 다음과 같이 표시되도록 코드를 추가합니다.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim VbObj As New VB6Hello.Class1 VbObj.SayHello() End Sub
애플리케이션을 실행합니다. 디버그 메뉴에서 디버깅 시작을 클릭합니다.
다음으로 컨트롤을 격리해야 합니다. 애플리케이션이 사용하는 각 COM 구성 요소는 프로젝트에서 COM 참조로 표시됩니다. 이러한 참조는 솔루션 탐색기 창의 참조 노드 아래에 표시됩니다. (프로젝트 메뉴에서 참조 추가 명령을 직접 사용하거나 ActiveX 컨트롤을 양식으로 끌어 놓아 간접적으로 참조를 추가할 수 있습니다.)
다음 단계는 COM 구성 요소를 격리하고 격리된 컨트롤을 포함하는 업데이트된 애플리케이션을 게시하는 방법을 보여 줍니다.
COM 구성 요소를 격리하려면
솔루션 탐색기의 참조 노드에서 VB6Hello를 선택합니다.
속성 창에서 Isolated 속성의 값을 False에서 True로 변경합니다.
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
이제 F5 키를 누르면 애플리케이션이 예상대로 작동하지만 이제 등록이 필요 없는 COM에서 실행됩니다. 이를 증명하려면 VB6Hello.dll 구성 요소의 등록을 취소하고 Visual Studio IDE 외부에서 RegFreeComDemo1.exe를 실행해 보세요. 이번에는 단추를 클릭할 때 여전히 작동합니다. 애플리케이션 매니페스트의 이름을 일시적으로 바꾸면 다시 실패합니다.
참고 항목
COM 구성 요소의 등록을 일시적으로 취소하여 COM 구성 요소의 부재를 시뮬레이션할 수 있습니다. 명령 프롬프트를 열고 cd /d %windir%\system32
를 입력하여 시스템 폴더로 이동한 다음 regsvr32 /u VB6Hello.dll
을 입력하여 구성 요소의 등록을 취소합니다. regsvr32 VB6Hello.dll
을 입력하면 다시 등록할 수 있습니다.
마지막 단계는 ClickOnce를 사용하여 애플리케이션을 게시하는 것입니다.
격리된 COM 구성 요소를 사용하여 애플리케이션 업데이트를 게시하려면
빌드 메뉴에서 RegFreeComDemo 게시를 클릭합니다.
게시 마법사가 나타납니다.
게시 마법사에서 게시된 파일에 액세스하고 검사할 수 있는 로컬 컴퓨터의 디스크 위치를 지정합니다.
마침을 클릭하여 애플리케이션을 게시합니다.
게시된 파일을 검사하면 sysmon.ocx 파일이 포함되어 있습니다. 컨트롤은 이 애플리케이션에 완전히 격리됩니다. 즉, 최종 사용자의 컴퓨터에 다른 버전의 컨트롤을 사용하는 다른 애플리케이션이 있는 경우 컨트롤은 이 애플리케이션을 방해할 수 없습니다.
네이티브 어셈블리 참조
Visual Studio는 네이티브 Visual Basic 6.0 또는 C++ 어셈블리에 대한 참조를 지원합니다. 이러한 참조를 네이티브 참조라고 합니다. 파일 형식 속성이 네이티브 또는 ActiveX로 설정되어 있는지 확인하여 참조가 네이티브인지 여부를 알 수 있습니다.
네이티브 참조를 추가하려면 참조 추가 명령을 사용한 다음 매니페스트를 찾습니다. 일부 구성 요소는 DLL 내부에 매니페스트를 배치합니다. 이 경우 DLL 자체를 선택하기만 하면 Visual Studio는 구성 요소에 포함된 매니페스트가 포함되어 있는 것을 검색하는 경우 DLL을 네이티브 참조로 추가합니다. Visual Studio는 참조된 구성 요소와 동일한 폴더에 있는 경우 매니페스트에 나열된 종속 파일 또는 어셈블리도 자동으로 포함합니다.
COM 컨트롤 격리를 사용하면 매니페스트가 없는 COM 구성 요소를 쉽게 배포할 수 있습니다. 하지만 구성 요소에 매니페스트가 제공된 경우 매니페스트를 직접 참조할 수 있습니다. 실제로 Isolated 속성을 사용하는 것보다는 가능하면 항상 구성 요소의 작성자가 제공한 매니페스트를 사용해야 합니다.
등록이 필요 없는 COM 구성 요소 배포의 제한 사항
등록이 필요 없는 COM은 기존 배포 기술에 비해 분명한 장점이 있습니다.
모든 구성 요소가 등록이 필요 없는 COM에 적합한 후보는 아닙니다. 다음 중 하나라도 해당되는 구성 요소는 적합하지 않습니다.
구성 요소가 out-of-process 서버입니다. EXE 서버는 지원되지 않습니다. DLL만 지원됩니다.
구성 요소가 운영 체제의 일부이거나 XML, 브라우저 구성 요소 또는 MDAC(Microsoft Data Access Components)와 같은 시스템 구성 요소입니다. 구성 요소 작성자의 재배포 정책에 따라야 합니다. 공급업체에 문의하세요.
구성 요소가 Microsoft Office와 같은 애플리케이션의 일부입니다. 예를 들어 Microsoft Excel 개체 모델을 격리하려고 해서는 안 됩니다. 이것은 Office의 일부이며 전체 Office 제품이 설치된 컴퓨터에서만 사용할 수 있습니다.
구성 요소가 추가 기능 또는 스냅인(예: Office 추가 기능 또는 웹 브라우저의 컨트롤)으로 사용하기 위한 것입니다. 이러한 구성 요소에는 일반적으로 매니페스트 자체의 범위를 벗어난 호스팅 환경에서 정의된 일종의 등록 체계가 필요합니다.
구성 요소가 시스템의 실제 또는 가상 디바이스(예: 인쇄 스풀러의 디바이스 드라이버)를 관리합니다.
구성 요소가 데이터 액세스 재배포 가능 요소입니다. 일반적으로 데이터 애플리케이션을 실행하려면 별도의 데이터 액세스 재배포 가능 요소를 설치해야 합니다. Microsoft ADO 데이터 컨트롤, Microsoft OLE DB 또는 MDAC(Microsoft Data Access Components)와 같은 구성 요소는 격리해서는 안 됩니다. 대신 애플리케이션이 사용하는 MDAC 또는 SQL Server Express는 필수 구성 요소로 설정해야 합니다. 방법: ClickOnce 애플리케이션을 사용하여 필수 구성 요소 설치를 참조하세요.
경우에 따라 구성 요소의 개발자가 등록이 필요 없는 COM을 위해 이를 다시 디자인할 수 있습니다. 이것이 불가능한 경우 부트스트래퍼를 사용하여 표준 등록 체계를 통해 종속된 애플리케이션을 빌드하고 게시할 수 있습니다. 자세한 내용은 부트스트래퍼 패키지 만들기를 참조하세요.
COM 구성 요소는 애플리케이션당 한 번만 격리할 수 있습니다. 예를 들어 동일한 COM 구성 요소는 동일한 애플리케이션의 일부인 두 개의 다른 클래스 라이브러리 프로젝트에서 격리할 수 없습니다. 이렇게 하면 빌드 경고가 발생하고, 애플리케이션이 런타임에 로드되지 않습니다. 이 문제를 방지하기 위해 Microsoft는 단일 클래스 라이브러리에서 COM 구성 요소를 캡슐화하는 것을 권장합니다.
애플리케이션 배포에 등록이 필요하지 않더라도 개발자의 컴퓨터에 COM 등록이 필요한 몇 가지 시나리오가 있습니다.
Isolated
속성을 사용하려면 빌드 중에 매니페스트를 자동으로 생성하기 위해 COM 구성 요소를 개발자의 컴퓨터에 등록해야 합니다. 빌드 중에 자체 등록을 호출하는 등록 캡처 기능은 없습니다. 또한 형식 라이브러리에 명시적으로 정의되지 않은 클래스는 매니페스트에 반영되지 않습니다. 네이티브 참조와 같이 기존 매니페스트에 COM 구성 요소를 사용하는 경우 개발 시 구성 요소를 등록하지 않아도 됩니다. 그러나 구성 요소가 ActiveX 컨트롤이고 도구 상자 및 Windows Forms 디자이너에 포함하려는 경우에는 등록이 필요합니다.