앱 확장을 사용하면 앱이 다른 패키지의 추가 기능 콘텐츠 및 기능을 호스트할 수 있습니다. 이것은 플러그인 모델의 Windows 버전입니다. 확장 공급자는 콘텐츠 또는 서비스를 선언하고 호스트 앱은 런타임에 이를 검색하고 로드합니다.
Important
앱 확장에는 호스트 및 확장 앱 모두에 대한 MSIX 패키지 ID 가 필요합니다. 확장은 패키지 카탈로그를 통해 검색됩니다.
앱 확장의 작동 방식
앱 확장 모델에는 두 가지 역할이 있습니다.
- 확장 호스트 - 앱이 허용하는 확장 유형을 선언하고 설치된 확장을 검색합니다.
- 확장 공급자 - 다른 앱(또는 동일한 앱)은 특정 형식의 확장을 제공한다고 선언합니다.
확장은 코드가 아닌 패키지 매니페스트 선언을 통해 통신합니다. 호스트 앱은 AppExtensionCatalog API를 사용하여 설치된 확장을 찾고 관리합니다.
확장 호스트 선언
앱에 AppExtensionHost 선언을 추가합니다.Package.appxmanifest
<Package xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3" ...>
<Applications>
<Application ...>
<Extensions>
<uap3:Extension Category="windows.appExtensionHost">
<uap3:AppExtensionHost>
<uap3:Name>com.example.myapp.extensions</uap3:Name>
</uap3:AppExtensionHost>
</uap3:Extension>
</Extensions>
</Application>
</Applications>
</Package>
확장 공급자 선언하기
확장 앱의 Package.appxmanifest:
<Package xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3" ...>
<Applications>
<Application ...>
<Extensions>
<uap3:Extension Category="windows.appExtension">
<uap3:AppExtension Name="com.example.myapp.extensions"
Id="MathExtension"
DisplayName="Math Functions"
Description="Provides math operations"
PublicFolder="Public">
</uap3:AppExtension>
</uap3:Extension>
</Extensions>
</Application>
</Applications>
</Package>
호스트 PublicFolder 앱에서 읽을 수 있는 확장 패키지의 폴더를 가리킵니다.
확장 기능 찾기 및 불러오기
호스트 앱에서 설치된 확장을 검색하는 데 사용합니다 AppExtensionCatalog .
private AppExtensionCatalog? _catalog;
private async Task InitializeExtensionsAsync()
{
_catalog = AppExtensionCatalog.Open("com.example.myapp.extensions");
_catalog.PackageInstalled += OnExtensionInstalled;
_catalog.PackageUpdated += OnExtensionUpdated;
_catalog.PackageUninstalling += OnExtensionRemoved;
var extensions = await _catalog.FindAllAsync();
foreach (var extension in extensions)
{
await LoadExtensionAsync(extension);
}
}
private async Task LoadExtensionAsync(AppExtension extension)
{
string extensionId = extension.Id;
string displayName = extension.DisplayName;
// Get the extension's public folder
var folder = await extension.GetPublicFolderAsync();
if (folder != null)
{
// Read configuration, content, or scripts from the folder
var configFile = await folder.TryGetItemAsync("config.json");
if (configFile != null)
{
// Parse and use the extension configuration
}
}
}
// See "Handle extension lifecycle events" below for the
// OnExtensionInstalled, OnExtensionUpdated, and OnExtensionRemoved handlers.
private async void OnExtensionInstalled(AppExtensionCatalog sender,
AppExtensionPackageInstalledEventArgs args) { }
private async void OnExtensionUpdated(AppExtensionCatalog sender,
AppExtensionPackageUpdatedEventArgs args) { }
private void OnExtensionRemoved(AppExtensionCatalog sender,
AppExtensionPackageUninstallingEventArgs args) { }
확장 프로그램 수명 주기 이벤트 처리
private async Task LoadExtensionAsync(AppExtension extension) => await Task.CompletedTask;
// (See "Discover and load extensions" above for the real implementation.)
private async void OnExtensionInstalled(AppExtensionCatalog sender,
AppExtensionPackageInstalledEventArgs args)
{
// Re-query the catalog to get the AppExtension instances added by this package
var extensions = await sender.FindAllAsync();
foreach (var extension in extensions.Where(e => e.Package.Id.FamilyName == args.Package.Id.FamilyName))
{
await LoadExtensionAsync(extension);
}
}
private void OnExtensionRemoved(AppExtensionCatalog sender,
AppExtensionPackageUninstallingEventArgs args)
{
// args.Package identifies the package that is uninstalling
string familyName = args.Package.Id.FamilyName;
// Remove any extensions from that package from your app
}
private async void OnExtensionUpdated(AppExtensionCatalog sender,
AppExtensionPackageUpdatedEventArgs args)
{
// Re-query the catalog to get the refreshed AppExtension instances
var extensions = await sender.FindAllAsync();
foreach (var extension in extensions.Where(e => e.Package.Id.FamilyName == args.Package.Id.FamilyName))
{
// Reload with updated content
await LoadExtensionAsync(extension);
}
}
관련 콘텐츠
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
Windows developer