레거시 COM 구성 요소의 배포는 일반적으로 어려운 작업이었습니다. 구성 요소를 전역적으로 등록해야 하므로 겹치는 애플리케이션 간에 바람직하지 않은 부작용이 발생할 수 있습니다. 구성 요소가 애플리케이션에 완전히 격리되거나 병렬 호환되기 때문에 이 상황은 일반적으로 .NET Framework 애플리케이션에서 문제가 되지 않습니다. Visual Studio를 사용하면 Windows 운영 체제에 격리된 COM 구성 요소를 배포할 수 있습니다.
ClickOnce는 .NET 애플리케이션을 배포하기 위한 쉽고 안전한 메커니즘을 제공합니다. 그러나 애플리케이션에서 레거시 COM 구성 요소를 사용하는 경우 배포를 위한 추가 단계를 수행해야 합니다. 이 항목에서는 격리된 COM 구성 요소를 배포하고 네이티브 구성 요소를 참조하는 방법을 설명합니다(예: Visual Basic 6.0 또는 Visual C++).
격리된 COM 구성 요소를 배포하는 방법에 대한 자세한 내용은 ClickOnce 및 Registration-Free COM을 사용하여 앱 배포 간소화를 참조하세요.
등록이 없는 COM
등록이 없는 COM은 격리된 COM 구성 요소를 배포하고 활성화하기 위한 새로운 기술입니다. 일반적으로 시스템 레지스트리에 설치된 모든 구성 요소의 형식 라이브러리 및 등록 정보를 애플리케이션과 동일한 폴더에 저장된 매니페스트라는 XML 파일에 배치하여 작동합니다.
COM 구성 요소를 격리하려면 개발자의 컴퓨터에 등록해야 하지만 최종 사용자의 컴퓨터에 등록할 필요는 없습니다. COM 구성 요소를 격리하려면 참조의 격리 속성을 True로 설정하기만 하면 됩니다. 기본적으로 이 속성은 등록된 COM 참조로 처리되어야 함을 나타내는 False로 설정됩니다. 이 속성이 True이면 빌드 시 이 구성 요소에 대한 매니페스트가 생성됩니다. 또한 설치하는 동안 해당 파일을 애플리케이션 폴더에 복사합니다.
매니페스트 생성기가 격리된 COM 참조를 발견하면 구성 요소의 CoClass 형식 라이브러리에 있는 모든 항목을 열거하고 각 항목을 해당 등록 데이터와 일치시키고 형식 라이브러리 파일의 모든 COM 클래스에 대한 매니페스트 정의를 생성합니다.
ClickOnce를 사용하여 등록이 없는 COM 구성 요소 배포
ClickOnce 배포 기술은 ClickOnce 및 등록이 없는 COM 모두 배포하기 위해 구성 요소에 매니페스트가 있어야 하므로 격리된 COM 구성 요소를 배포하는 데 적합합니다.
일반적으로 구성 요소의 작성자가 매니페스트를 제공해야 합니다. 그렇지 않은 경우 Visual Studio는 COM 구성 요소에 대한 매니페스트를 자동으로 생성할 수 있습니다. 매니페스트 생성은 ClickOnce 게시 프로세스 중에 수행됩니다. 자세한 내용은 ClickOnce 애플리케이션 게시를 참조하세요. 이 기능을 사용하면 Visual Basic 6.0과 같은 이전 개발 환경에서 작성한 레거시 구성 요소를 활용할 수도 있습니다.
ClickOnce에서 COM 구성 요소를 배포하는 방법에는 두 가지가 있습니다.
부트스트래퍼를 사용하여 COM 구성 요소를 배포합니다. 지원되는 모든 플랫폼에서 작동합니다.
네이티브 구성 요소 격리(등록이 없는 COM이라고도 함) 배포를 사용합니다.
간단한 COM 구성 요소 격리 및 배포의 예
등록이 없는 COM 구성 요소 배포를 보여주기 위해 이 예제에서는 Visual Basic에서 Visual Basic 6.0을 사용하여 만든 격리된 네이티브 COM 구성 요소를 참조하는 Windows 기반 애플리케이션을 만들고 ClickOnce를 사용하여 배포합니다.
먼저 네이티브 COM 구성 요소를 만들어야 합니다.
네이티브 COM 구성 요소를 만들려면
Visual Basic 6.0을 사용하여 [파일 ] 메뉴에서 [새로 만들기], [ 프로젝트]를 차례로 클릭합니다.
새 프로젝트 대화 상자에서 Visual Basic 노드를 선택하고 ActiveX DLL 프로젝트를 선택합니다. 이름 상자에 .를 입력합니다
VB6Hello.비고
등록이 없는 COM에서는 ActiveX DLL 및 ActiveX Control 프로젝트 형식만 지원됩니다. 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 참조를 선택합니다.
속성 창에서 격리된 속성의 값을 False에서 True로 변경합니다.
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
이제 F5 키를 누르면 애플리케이션이 예상대로 작동하지만 이제 등록이 없는 COM에서 실행됩니다. 이를 증명하려면 VB6Hello.dll 구성 요소의 등록을 취소하고 Visual Studio IDE 외부에서 RegFreeComDemo1.exe 실행합니다. 이번에는 단추를 클릭하면 계속 작동합니다. 일시적으로 애플리케이션 매니페스트의 이름을 바꾸면 다시 실패합니다.
비고
일시적으로 등록을 취소하여 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에서 기본 참조로 추가합니다. 또한 Visual Studio는 참조된 구성 요소와 동일한 폴더에 있는 경우 매니페스트에 나열된 모든 종속 파일 또는 어셈블리를 자동으로 포함합니다.
COM 컨트롤 격리를 사용하면 매니페스트가 없는 COM 구성 요소를 쉽게 배포할 수 있습니다. 그러나 구성 요소에 매니페스트가 제공된 경우 매니페스트를 직접 참조할 수 있습니다. 실제로 격리 된 속성을 사용하는 대신 가능한 경우 항상 구성 요소 작성자가 제공한 매니페스트를 사용해야 합니다.
등록이 없는 COM 구성 요소 배포의 제한 사항
등록이 없는 COM은 기존 배포 기술에 비해 명확한 이점을 제공합니다.
모든 구성 요소가 등록이 없는 COM에 적합한 후보가 되는 것은 아닙니다. 다음 중 어느 것이라도 true이면 구성 요소가 적합하지 않습니다.
구성 요소는 프로세스 외부 서버입니다. EXE 서버는 지원되지 않습니다. DLL만 지원됩니다.
구성 요소는 운영 체제의 일부이거나 XML, 브라우저 구성 요소 또는 MDAC(Microsoft Data Access Components)와 같은 시스템 구성 요소입니다. 구성 요소 작성자의 재배포 정책을 따라야 합니다. 공급업체에 문의하세요.
구성 요소는 Microsoft Office와 같은 애플리케이션의 일부입니다. 예를 들어 Microsoft Excel 개체 모델을 격리하려고 하면 안 됩니다. 이 기능은 Office의 일부이며 전체 Office 제품이 설치된 컴퓨터에서만 사용할 수 있습니다.
구성 요소는 추가 기능 또는 스냅인(예: 웹 브라우저의 Office 추가 기능 또는 컨트롤)으로 사용하기 위한 것입니다. 이러한 구성 요소에는 일반적으로 매니페스트 자체의 범위를 벗어나는 호스팅 환경에서 정의한 일종의 등록 체계가 필요합니다.
구성 요소는 시스템의 물리적 또는 가상 디바이스(예: 인쇄 스풀러용 디바이스 드라이버)를 관리합니다.
구성 요소는 데이터 액세스 재배포 가능 패키지입니다. 일반적으로 데이터 애플리케이션을 실행하려면 별도의 데이터 액세스 재배포 가능 패키지가 설치되어 있어야 합니다. Microsoft ADO Data Control, Microsoft OLE DB 또는 MDAC(Microsoft Data Access Components)와 같은 구성 요소를 격리하려고 하면 안 됩니다. 대신 애플리케이션에서 MDAC 또는 SQL Server Express를 사용하는 경우 필수 구성 요소로 설정해야 합니다. 방법 : ClickOnce 애플리케이션을 사용하여 필수 구성 요소 설치를 참조하세요.
경우에 따라 구성 요소 개발자가 등록이 없는 COM용으로 다시 디자인할 수 있습니다. 이것이 가능하지 않은 경우 부트스트래퍼를 사용하여 표준 등록 체계를 통해 애플리케이션에 의존하는 애플리케이션을 빌드하고 게시할 수 있습니다. 자세한 내용은 부트스트래퍼 패키지 만들기를 참조하세요.
COM 구성 요소는 애플리케이션당 한 번만 격리할 수 있습니다. 예를 들어 동일한 애플리케이션의 일부인 두 개의 서로 다른 클래스 라이브러리 프로젝트에서 동일한 COM 구성 요소를 격리할 수 없습니다. 이렇게 하면 빌드 경고가 발생하며 애플리케이션은 런타임에 로드되지 않습니다. 이 문제를 방지하기 위해 단일 클래스 라이브러리에 COM 구성 요소를 캡슐화하는 것이 좋습니다.
애플리케이션의 배포에 등록이 필요하지 않더라도 개발자 컴퓨터에서 COM 등록이 필요한 몇 가지 시나리오가 있습니다. 이
Isolated속성을 사용하려면 빌드하는 동안 매니페스트를 자동으로 생성하기 위해 COM 구성 요소를 개발자 컴퓨터에 등록해야 합니다. 빌드 중에 자체 등록을 호출하는 등록 캡처 기능은 없습니다. 또한 형식 라이브러리에 명시적으로 정의되지 않은 클래스는 매니페스트에 반영되지 않습니다. 네이티브 참조와 같은 기존 매니페스트와 함께 COM 구성 요소를 사용하는 경우 개발 시 구성 요소를 등록할 필요가 없습니다. 그러나 구성 요소가 ActiveX 컨트롤이고 도구 상자 및 Windows Forms 디자이너에 포함하려는 경우 등록이 필요합니다.