다음을 통해 공유


다중 인스턴스 유니버설 Windows 앱 만들기

이 항목에서는 다중 인스턴스 UWP(유니버설 Windows 플랫폼) 앱을 만드는 방법을 설명합니다.

Windows 10, 버전 1803(10.0, 빌드 17134) 부터는 UWP 앱에서 다중 인스턴스를 지원하도록 옵트인할 수 있습니다. 다중 인스턴스 UWP 앱의 인스턴스를 실행 중이며 후속 정품 인증을 요청하는 경우 플랫폼은 기존 인스턴스를 활성화하지 않습니다. 대신 다른 프로세스에서 실행 중인 인스턴스를 새로 만듭니다.

Important

다중 인스턴스화는 JavaScript 응용 프로그램에 대해 지원 되지만 다중 인스턴스화 리디렉션은 지원하지 않습니다. JavaScript 응용 프로그램에는 다중 인스턴스화 리디렉션이 지원되지 않으므로 AppInstance 클래스는 이러한 응용 프로그램에는 유용하지 않습니다.

다중 인스턴스 동작 옵트인

새로운 다중 인스턴스 응용 프로그램을 만드는 경우 Visual Studio Marketplace에 있는 Multi-Instance App Project Templates.VSIX를 설치할 수 있습니다. 이 템플릿을 설치하면 Visual C# > Windows 유니버설(또는 기타 언어 > Visual C++ > Windows 유니버설)의 새 프로젝트 대화 상자에서 사용할 수 있게 됩니다.

참고 항목

다중 인스턴스 앱 프로젝트 템플릿을 더 이상 사용할 수 없습니다. VSIX 템플릿은 편리했기 때문에 아래에 설명된 대로 기존 프로젝트를 대신 수정해야 합니다. DISABLE_XAML_GENERATED_MAIN 상수를 프로젝트 빌드 기호에 추가해야 합니다. 이렇게 하면 빌드에서 기본 Main()이 생성되지 않습니다. 이렇게 하면 특별히 작성된 앱별 버전의 Main()을 사용할 수 있습니다.

다음의 두 템플릿이 설치됩니다. 다중 인스턴스 UWP 앱은 다중 인스턴스 앱을 만드는 템플릿을 제공하고 다중 인스턴스 리디렉션 UWP 앱은 새 인스턴스를 시작하거나 이미 시작된 인스턴스를 선택적으로 활성화하기 위해 빌드할 수 있는 추가 논리를 제공합니다. 예를 들어 동일한 문서를 편집할 때 한 번에 한 인스턴스에서만 편집되게 하려는 경우 새 인스턴스를 시작하지 않고 해당 파일이 열려 있는 인스턴스를 전경으로 가져옵니다.

두 템플릿 모두 package.appxmanifest 파일에 SupportsMultipleInstances를 추가합니다. 네임스페이스 접두사 desktop4iot2 참고: 데스크톱을 대상으로 하는 프로젝트나 IoT(사물 인터넷) 프로젝트만 다중 인스턴스화를 지원합니다.

<Package
  ...
  xmlns:desktop4="http://schemas.microsoft.com/appx/manifest/desktop/windows10/4"
  xmlns:iot2="http://schemas.microsoft.com/appx/manifest/iot/windows10/2"  
  IgnorableNamespaces="uap mp desktop4 iot2">
  ...
  <Applications>
    <Application Id="App"
      ...
      desktop4:SupportsMultipleInstances="true"
      iot2:SupportsMultipleInstances="true">
      ...
    </Application>
  </Applications>
   ...
</Package>

다중 인스턴스 활성화 리디렉션

UWP 앱에 대한 다중 인스턴스화는 단순히 앱의 여러 인스턴스를 시작할 수 있도록 하는 것 이상입니다. 앱의 새 인스턴스를 시작할지 또는 이미 실행 중인 인스턴스를 활성화할지 여부를 선택하려는 경우 사용자 지정할 수 있습니다. 예를 들어 다른 인스턴스에서 이미 편집하고 있는 파일을 편집하기 위해 앱이 시작된 경우 파일을 편집하고 있는 다른 인스턴스를 여는 대신 활성화를 해당 인스턴스로 리디렉션하려고 할 수 있습니다.

실행 과정을 보려면 다중 인스턴스 UWP 앱 만들기에 대한 비디오를 시청하세요.

다중 인스턴스 리디렉션 UWP 앱 템플릿은 위에 표시된 대로 package.appxmanifest 파일에 SupportsMultipleInstances를 추가하고 Main() 함수가 포함된 프로젝트에 Program.cs(또는 C++ 버전의 템플릿을 사용하는 경우 Program.cpp)를 추가합니다. 활성화를 리디렉션하는 논리가 Main 함수로 들어갑니다. Program .cs의 템플릿은 아래와 같습니다.

AppInstance.RecommendedInstance 속성은 이 활성화 요청에 대해 셸을 제공하는 기본 설정 인스턴스가 있는 경우 이를 나타냅니다(또는 null이 없는 경우). 셸에서 기본 설정을 제공하는 경우 활성화를 해당 인스턴스로 리디렉션할 수 있으며, 선택하는 경우 무시 할 수 있습니다.

public static class Program
{
    // This example code shows how you could implement the required Main method to
    // support multi-instance redirection. The minimum requirement is to call
    // Application.Start with a new App object. Beyond that, you may delete the
    // rest of the example code and replace it with your custom code if you wish.

    static void Main(string[] args)
    {
        // First, we'll get our activation event args, which are typically richer
        // than the incoming command-line args. We can use these in our app-defined
        // logic for generating the key for this instance.
        IActivatedEventArgs activatedArgs = AppInstance.GetActivatedEventArgs();

        // If the Windows shell indicates a recommended instance, then
        // the app can choose to redirect this activation to that instance instead.
        if (AppInstance.RecommendedInstance != null)
        {
            AppInstance.RecommendedInstance.RedirectActivationTo();
        }
        else
        {
            // Define a key for this instance, based on some app-specific logic.
            // If the key is always unique, then the app will never redirect.
            // If the key is always non-unique, then the app will always redirect
            // to the first instance. In practice, the app should produce a key
            // that is sometimes unique and sometimes not, depending on its own needs.
            string key = Guid.NewGuid().ToString(); // always unique.
                                                    //string key = "Some-App-Defined-Key"; // never unique.
            var instance = AppInstance.FindOrRegisterInstanceForKey(key);
            if (instance.IsCurrentInstance)
            {
                // If we successfully registered this instance, we can now just
                // go ahead and do normal XAML initialization.
                global::Windows.UI.Xaml.Application.Start((p) => new App());
            }
            else
            {
                // Some other instance has registered for this key, so we'll 
                // redirect this activation to that instance instead.
                instance.RedirectActivationTo();
            }
        }
    }
}

Main()은 실행되는 첫 번째 항목입니다. 이는 OnLaunchedOnActivated 이전에 실행됩니다. 이를 사용하면 앱에서 다른 초기화 코드가 실행되기 전에 해당 인스턴스 또는 다른 인스턴스를 활성화할지 여부를 결정할 수 있습니다.

위의 코드는 응용 프로그램의 기존 인스턴스가 활성화되는지 또는 새 인스턴스가 활성화되는지 여부를 결정합니다. 키를 사용하여 활성화하려는 기존 인스턴스가 있는지 여부를 판별합니다. 예를 들어 파일 활성화 처리를 위해 앱을 시작할 수 있는 경우 이 파일 이름을 키로 사용할 수 있습니다. 그런 다음 앱의 인스턴스가 해당 키로 이미 등록되어 있는지 확인하고 새 인스턴스를 여는 대신 활성화할 수 있습니다. 다음은 코드의 개념입니다. var instance = AppInstance.FindOrRegisterInstanceForKey(key);

키로 등록된 인스턴스를 찾으면 해당 인스턴스가 활성화됩니다. 키가 없는 경우 현재 인스턴스(현재 Main을 실행하고 있는 인스턴스)가 응용 프로그램 개체를 만들고 실행을 시작합니다.

백그라운드 작업 및 다중 인스턴스화

  • Out-of-proc 백그라운드 작업은 다중 인스턴스화를 지원합니다. 일반적으로 각각의 새 트리거는 백그라운드 작업의 새 인스턴스를 생성합니다(기술적으로 말하자면 동일한 호스트 프로세스에서 여러 백그라운드 작업이 실행될 수 있음). 그러나 백그라운드 작업에 대해 서로 다른 인스턴스가 만들어집니다.
  • In-proc 백그라운드 작업은 다중 인스턴스화를 지원하지 않습니다.
  • 백그라운드 오디오 작업은 다중 인스턴스화를 지원하지 않습니다.
  • 앱이 백그라운드 작업을 등록할 때 일반적으로 해당 작업이 이미 등록되어 있는지를 먼저 확인한 후 작업을 삭제하고 다시 등록하거나 기존 등록을 유지하기 위해 어떤 작업도 수행하지 않습니다. 이는 다중 인스턴스 앱의 일반적인 동작입니다. 그러나 다중 인스턴스화 앱은 인스턴스당 다른 백그라운드 작업 이름을 등록하도록 선택할 수 있습니다. 이를 통해 동일한 트리거에 대해 여러 개의 등록이 생성되고 트리거가 실행되면 여러 백그라운드 작업 인스턴스가 활성화됩니다.
  • 앱 서비스는 모든 연결에 대해 별도의 앱 서비스 백그라운드 작업 인스턴스를 시작합니다. 다중 인스턴스 앱의 경우에는 변경되지 않습니다. 즉, 다중 인스턴스 앱의 각 인스턴스는 고유한 앱 서비스 백그라운드 작업 인스턴스를 가지게 됩니다.

추가 고려 사항

  • 다중 인스턴스화는 데스크톱 및 IoT(사물 인터넷) 프로젝트를 대상으로 하는 UWP 앱에서 지원됩니다.
  • 경합 조건과 경합 문제가 발생하지 않도록 하려면 다중 인스턴스 앱이 여러 인스턴스 간에 공유할 수 있는 설정, 앱 로컬 저장소 및 기타 리소스(예: 사용자 파일, 데이터 저장소 등)에 대한 액세스를 파티션/동기화하는 단계를 수행해야 합니다. 뮤텍스, 세마포, 이벤트 등의 표준 동기화 메커니즘을 사용할 수 있습니다.
  • 앱의 Package.appxmanifest 파일에 SupportsMultipleInstances가 있는 경우 확장에서 SupportsMultipleInstances를 선언할 필요가 없습니다.
  • 백그라운드 작업 또는 앱 서비스를 제외한 다른 확장에 SupportsMultipleInstances를 추가하고 확장을 호스트하는 앱이 Package.appxmanifest 파일에서 SupportsMultipleInstances를 선언하지 않는 경우 스키마 오류가 발생합니다.
  • 앱은 매니페스트의 ResourceGroup 선언을 사용하여 여러 백그라운드 작업을 동일한 호스트로 그룹화할 수 있습니다. 이는 각 활성화가 별도의 호스트로 들어가는 다중 인스턴스화와 충돌합니다. 따라서 앱은 매니페스트에서 SupportsMultipleInstancesResourceGroup 모두를 선언할 수 없습니다.

예제

다중 인스턴스 활성화 리디렉션의 예는 다중 인스턴스 샘플을 참조하세요.

참고 항목

AppInstance.FindOrRegisterInstanceForKeyAppInstance.GetActivatedEventArgsAppInstance.RedirectActivationTo앱 활성화 처리