다음을 통해 공유


IPC(프로세스 간 통신)

이 항목에서는 UWP(유니버설 Windows 플랫폼) 애플리케이션과 Win32 애플리케이션 간에 IPC(프로세스 간 통신)를 수행하는 다양한 방법을 설명합니다.

앱 서비스

앱 서비스를 사용하면 애플리케이션이 기본 형식(ValueSet)의 속성 모음을 수락하고 반환하는 서비스를 백그라운드에서 노출할 수 있습니다. 복잡한 객체는직렬화된 경우 전달할 수 있습니다.

앱 서비스는 백그라운드 작업으로 프로세스 실행하거나 포그라운드 애플리케이션 내에서 프로세스 실행할 수 있습니다.

앱 서비스는 거의 실시간 대기 시간이 필요하지 않은 소량의 데이터를 공유하는 데 가장 적합합니다.

COM을 참조하십시오.

COM 상호 작용하고 통신할 수 있는 이진 소프트웨어 구성 요소를 만들기 위한 분산 개체 지향 시스템입니다. 개발자는 COM을 사용하여 애플리케이션에 재사용 가능한 소프트웨어 구성 요소 및 자동화 계층을 만듭니다. COM 구성 요소는 프로세스 중이거나 처리되지 않을 수 있으며 클라이언트 및 서버 모델을 통해 통신할 수 있습니다. Out-of-process COM 서버는 오랫동안 개체 간 통신수단으로 사용되어 왔습니다.

runFullTrust 기능이 있는 패키지된 애플리케이션은 IPC용 out-of-process COM 서버를 패키지 매니페스트을 통해 등록할 수 있습니다. 이것은 패키지된 COM으로 알려져 있습니다.

파일 시스템

광범위 파일 시스템 액세스

패키지된 애플리케이션은 broadFileSystemAccess 제한된 기능을 선언하여 광범위한 파일 시스템을 사용하여 IPC를 수행할 수 있습니다. 이 기능은 Windows.Storage API 및 xxxFromApp Win32 API에 광범위한 파일 시스템에 대한 액세스 권한을 부여합니다.

기본적으로 패키지된 애플리케이션에 대한 파일 시스템을 통한 IPC는 이 섹션에 설명된 다른 메커니즘으로 제한됩니다.

퍼블리셔 캐시 폴더 (PublisherCacheFolder)

PublisherCacheFolder 사용하면 패키지된 애플리케이션이 동일한 게시자가 다른 패키지와 공유할 수 있는 폴더를 매니페스트에 선언할 수 있습니다.

공유 스토리지 폴더에는 다음과 같은 요구 사항 및 제한 사항이 있습니다.

  • 공유 스토리지 폴더의 데이터는 백업되거나 로밍되지 않습니다.
  • 사용자는 공유 스토리지 폴더의 내용을 지울 수 있습니다.
  • 공유 스토리지 폴더를 사용하여 다른 게시자의 애플리케이션 간에 데이터를 공유할 수 없습니다.
  • 공유 스토리지 폴더를 사용하여 다른 사용자 간에 데이터를 공유할 수 없습니다.
  • 공유 스토리지 폴더에는 버전 관리가 없습니다.

여러 애플리케이션을 게시하고 해당 애플리케이션 간에 데이터를 공유하는 간단한 메커니즘을 찾는 경우 PublisherCacheFolder는 간단한 파일 시스템 기반 옵션입니다.

공유접근스토리지관리자

SharedAccessStorageManager 앱 서비스, 프로토콜 활성화(예: LaunchUriForResultsAsync) 등과 함께 사용하여 토큰을 통해 StorageFiles를 공유합니다.

FullTrustProcessLauncher (풀트러스트프로세스런처)

runFullTrust 기능을 사용하면, 패키지된 애플리케이션은 동일한 패키지 내에서 완전 신뢰 프로세스를 시작할 수 있습니다.

패키지 제한이 부담이 되거나 IPC 옵션이 부족한 시나리오의 경우 애플리케이션은 완전 신뢰 프로세스를 프록시로 사용하여 시스템과 인터페이스한 다음, 앱 서비스 또는 기타 잘 지원되는 IPC 메커니즘을 통해 완전 신뢰 프로세스 자체를 사용하는 IPC를 사용할 수 있습니다.

LaunchUriForResultsAsync

LaunchUriForResultsAsyncProtocolForResults 활성화 계약을 구현하는 다른 패키지 애플리케이션과의 간단한 (ValueSet) 데이터 교환에 사용됩니다. 일반적으로 백그라운드에서 실행되는 App Services와 달리 대상 애플리케이션은 포그라운드에서 시작됩니다.

SharedStorageAccessManager 토큰을 ValueSet을 통해 애플리케이션에 전달하여 파일을 공유할 수 있습니다.

루프백

루프백은 localhost(루프백 주소)에서 수신 대기하는 네트워크 서버와 통신하는 프로세스입니다.

보안 및 네트워크 격리를 유지하기 위해 IPC에 대한 루프백 연결은 기본적으로 패키지된 애플리케이션에 대해 차단됩니다. 기능 및 매니페스트 속성사용하여 신뢰할 수 있는 패키지된 애플리케이션 간에 루프백 연결을 사용하도록 설정할 수 있습니다.

  • 루프백 연결에 참여하는 모든 패키지된 애플리케이션은패키지 매니페스트에서 기능을 선언해야 합니다.
  • 패키지된 두 애플리케이션은 패키지 매니페스트 내에서 LoopbackAccessRules 선언하여 루프백을 통해 통신할 수 있습니다.
    • 각 응용 프로그램은 LoopbackAccessRules에 서로를 나열해야 합니다. 클라이언트는 서버에 대한 "out" 규칙을 선언하고 서버는 지원되는 클라이언트에 대해 "in" 규칙을 선언합니다.

비고

이러한 규칙에서 애플리케이션을 식별하는 데 필요한 패키지 패밀리 이름은 개발 시간 동안 Visual Studio의 패키지 매니페스트 편집기, Microsoft Store를 통해 게시된 애플리케이션에 대한 파트너 센터 또는 이미 설치된 애플리케이션에 대한 Get-AppxPackage PowerShell 명령을 통해 찾을 수 있습니다.

패키지되지 않은 애플리케이션 및 서비스에는 패키지 ID가 없으므로 LoopbackAccessRules선언할 수 없습니다. 패키지된 애플리케이션을 CheckNetIsolation.exe통해 패키지되지 않은 애플리케이션 및 서비스와 루프백을 통해 연결하도록 구성할 수 있지만, 이는 컴퓨터에 대한 로컬 액세스 권한이 있고 관리자 권한이 있는 테스트용 로드 또는 디버깅 시나리오에만 가능합니다.

  • 루프백 연결에 참여하는 모든 패키지 애플리케이션은패키지 매니페스트에서 기능을 선언해야 합니다.
  • 패키지된 애플리케이션이 패키지되지 않은 애플리케이션 또는 서비스에 연결하는 경우 CheckNetIsolation.exe LoopbackExempt -a -n=<PACKAGEFAMILYNAME> 실행하여 패키지된 애플리케이션에 대한 루프백 예외를 추가합니다.
  • 패키지되지 않은 애플리케이션 또는 서비스가 패키지된 애플리케이션에 연결하는 경우 CheckNetIsolation.exe LoopbackExempt -is -n=<PACKAGEFAMILYNAME> 실행하여 패키지된 애플리케이션이 인바운드 루프백 연결을 수신할 수 있도록 합니다.
    • 패키지된 애플리케이션이 연결을 수신 대기하는 동안 CheckNetIsolation.exe 지속적으로 실행되어야 합니다.
    • -is 플래그는 Windows 10 버전 1607(10.0; 빌드 14393)에서 도입되었습니다.

비고

-n 플래그에 필요한 패키지 패밀리 이름은 개발 시간 동안 Visual Studio의 패키지 매니페스트 편집기, Microsoft Store를 통해 게시된 애플리케이션에 대한 파트너 센터 또는 이미 설치된 애플리케이션에 대한 Get-AppxPackage PowerShell 명령을 통해 찾을 수 있습니다.

CheckNetIsolation.exe네트워크 격리 문제를 디버깅하는 데에도 유용합니다.

파이프

파이프는 파이프 서버와 하나 이상의 파이프 클라이언트 간에 간단한 통신을 가능하게 합니다.

익명 파이프 및 명명된 파이프 다음 제약 조건으로 지원됩니다.

  • 기본적으로 패키지된 애플리케이션의 명명된 파이프는 프로세스가 완전 신뢰되지 않는 한 동일한 패키지 내의 프로세스 간에만 지원됩니다.
  • 명명된 파이프는 명명된 개체을 공유하기 위한 지침에 따라 패키지 간에 공유할 수 있습니다.
  • 명명된 파이프(패키지된 앱과 패키지되지 않은 앱)는 파이프 이름에 대한 구문을 \\.\pipe\LOCAL\ 사용해야 합니다.

레지스트리

IPC에 대한 레지스트리 사용은 일반적으로 권장되지 않지만 기존 코드에서는 지원됩니다. 패키지된 애플리케이션은 액세스 권한이 있는 레지스트리 키에만 액세스할 수 있습니다.

일반적으로 패키지된 데스크톱 앱(코드MSIX 패키지 빌드 참조)은 레지스트리 가상화 활용하여 전역 레지스트리 쓰기가 MSIX 패키지 내의 프라이빗 하이브에 포함되도록 합니다. 이렇게 하면 전역 레지스트리 영향을 최소화하면서 소스 코드 호환성을 사용할 수 있으며 동일한 패키지의 프로세스 간에 IPC에 사용할 수 있습니다. 레지스트리를 사용해야 하는 경우 이 모델은 전역 레지스트리 조작에 비해 선호됩니다.

원격 프로시저 호출 (RPC)

RPC 패키지된 애플리케이션에 RPC 엔드포인트의 ACL과 일치하는 올바른 기능이 있는 경우 패키지된 애플리케이션을 Win32 RPC 엔드포인트에 연결하는 데 사용할 수 있습니다.

사용자 지정 기능을 사용하면 OEM 및 IHV가임의의 기능을 정의하고,RPC 엔드포인트를 ACL로 다음, 권한 있는 클라이언트 애플리케이션해당 기능을 부여할 수 있습니다. 전체 샘플 애플리케이션은 CustomCapability 샘플을 참조하세요.

RPC 엔드포인트는 사용자 지정 기능의 관리 오버헤드 없이 엔드포인트에 대한 액세스를 해당 애플리케이션으로만 제한하기 위해 특정 패키지된 애플리케이션에 ACLed가 될 수도 있습니다. DeriveAppContainerSidFromAppContainerName API를 사용하여 패키지 패밀리 이름에서 SID를 파생한 다음, CustomCapability 샘플에 표시된 대로 SID를 사용하여 RPC 엔드포인트를 ACL로 만들 수 있습니다.

공유 메모리

파일 매핑 사용하여 다음 제약 조건을 사용하여 둘 이상의 프로세스 간에 파일 또는 메모리를 공유할 수 있습니다.

  • 기본적으로 패키지된 애플리케이션의 파일 매핑은 프로세스가 완전 신뢰가 아닌 한 동일한 패키지 내의 프로세스 간에만 지원됩니다.
  • 파일 매핑은명명된 개체를 공유하는 지침에 따라 패키지 간에 공유할 수 있습니다.

공유 메모리는 대량의 데이터를 효율적으로 공유하고 조작하는 데 권장됩니다.