Интеграция непакованных приложений с Windows Share
В этой статье объясняется, как интегрировать распакованные приложения с функцией Windows Share . Функция "Общий доступ" позволяет пользователям совместно использовать содержимое из одного приложения Windows в другое. Распаковка приложения должна быть предоставлена с удостоверением пакета, чтобы он смог зарегистрировать в качестве целевого объекта общего доступа. После регистрации приложение может получать и обрабатывать общие файлы.
Как подключить распаковку приложения в качестве целевого объекта общего доступа:
- Предоставьте приложению удостоверение пакета
- Реализация контракта общей папки
Предоставление распакованных приложений с удостоверением пакета
Приложение может получить удостоверение пакета двумя способами:
- Создание нового пакета установки MSIX (предпочтительный метод) OR
- Сделайте приложения упакованными с внешним расположением, совместимым с текущим установщиком. Это рекомендуется только для приложений, имеющих существующий установщик и которые не могут переключиться на установку MSIX.
Создание нового пакета установки MSIX
Рекомендуется упаковать приложение с помощью MSIX с помощью шаблона проекта упаковки приложений Windows в Visual Studio. Это будет включать все двоичные файлы в пакет MSIX и обеспечить чистый и надежный интерфейс установки.
Обратите внимание, прежде чем упаковывать классические приложения: подготовка к пакету классического приложения (MSIX).
Выполните действия, описанные в разделе "Настройка классического приложения для упаковки MSIX" в Visual Studio , чтобы создать пакет для проекта существующего приложения.
Примечание.
При создании проекта упаковки выберите Windows 10 версии 2004 (10.0; Сборка 19041) или более поздней версии в качестве минимальной версии.
После завершения этого пакета вы создадите пакет, следуя за пакетом классического приложения или приложения UWP в Visual Studio.
Создание упаковки с внешним расположением, совместимым с текущим установщиком
Второй способ предоставить удостоверение пакета приложения — добавить пакет с внешним расположением в приложение и зарегистрировать его в существующем установщике. Пакет с внешним расположением — это пустой пакет MSIX, содержащий appxmanifest с удостоверением, делиться целевой регистрацией и визуальными ресурсами. Двоичные файлы приложения по-прежнему управляются существующим установщиком приложения. При регистрации пакета необходимо указать расположение установки приложения в API. Важно сохранить удостоверение в манифесте пакета MSIX и манифесте приложения Win32 в синхронизации с сертификатом, используемым для подписи приложения.
Действия по предоставлению удостоверения пакета приложению с распаковки
Документация по созданию пакета с внешним расположением доступна здесь, включая сведения о шаблонах, используемых: предоставление удостоверения пакета путем упаковки с внешним расположением.
Полный пример приложения доступен на сайте GitHub: SparsePackages (packaged with External Location).
Регистрация в качестве целевого объекта общего доступа
После того как приложение имеет удостоверение пакета, следующим шагом является реализация контракта Share. Контракт "Общий доступ" позволяет приложению получать данные из другого приложения.
Вы можете выполнить те же действия, что и в разделе "Регистрация в качестве целевого объекта общего доступа" документации по упакованным приложениям для интеграции с листом общего доступа.
Пошаговое руководство примера приложения PhotoStore
В этом пошаговом руководстве по удостоверению пакета регистрация и активация общего доступа для распаковки приложений Win32 вы узнаете, как предоставить удостоверение пакета распаковке приложения Win32, создав пакет с внешним расположением. После того как приложение имеет удостоверение пакета, оно может зарегистрировать и обрабатывать активацию в качестве целевого объекта share. Выполните следующие действия с помощью примера PhotoStoreDemo:
AppxManifest.xml
Создание файла- Создание пакета
- Подписывание пакета
- Регистрация пакета
- Обработка активации приложения
Сначала создайте AppxManifest.xml
файл, который включает в себя необходимые свойства, такие как <AllowExternalContent>
удостоверение и возможности и совместное использование целевого расширения. Убедитесь, что значения и ApplicationId
PackageName
значения в AppxManifest.xml
файле соответствуют Publisher
значениям PhotoStoreDemo.exe.manifest
в файле. Это Publisher
значение также должно соответствовать значению в сертификате, используемом для подписи пакета. Добавьте визуальные ресурсы по мере необходимости и ссылаются на AppxManifest.xml
нее. В Visual Studio можно использовать узел визуальных ресурсов при редактировании package.manifest
в проекте упаковки приложений для создания необходимых визуальных ресурсов.
Это пример AppxManifest.xml
фрагмента кода с разрешенным внешним содержимым:
<Identity Name="PhotoStoreDemo" ProcessorArchitecture="neutral" Publisher="CN=YourPubNameHere" Version="1.0.0.0" />
<Properties>
<DisplayName>PhotoStoreDemo</DisplayName>
<PublisherDisplayName>Sparse Package</PublisherDisplayName>
<Logo>Assets\storelogo.png</Logo>
<uap10:AllowExternalContent>true</uap10:AllowExternalContent>
</Properties>
<Resources>
<Resource Language="en-us" />
</Resources>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.19041.0" MaxVersionTested="10.0.19041.0" />
</Dependencies>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
<rescap:Capability Name="unvirtualizedResources"/>
</Capabilities>
<Applications>
<Application Id="PhotoStoreDemo" Executable="PhotoStoreDemo.exe" uap10:TrustLevel="mediumIL" uap10:RuntimeBehavior="win32App">
<uap:VisualElements AppListEntry="none" DisplayName="PhotoStoreDemo" Description="PhotoStoreDemo" BackgroundColor="transparent" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" Square310x310Logo="Assets\LargeTile.png" Square71x71Logo="Assets\SmallTile.png"></uap:DefaultTile>
<uap:SplashScreen Image="Assets\SplashScreen.png" />
</uap:VisualElements>
<Extensions>
<uap:Extension Category="windows.shareTarget">
<uap:ShareTarget Description="Send to PhotoStoreDemo">
<uap:SupportedFileTypes>
<uap:FileType>.jpg</uap:FileType>
<uap:FileType>.png</uap:FileType>
<uap:FileType>.gif</uap:FileType>
</uap:SupportedFileTypes>
<uap:DataFormat>StorageItems</uap:DataFormat>
<uap:DataFormat>Bitmap</uap:DataFormat>
</uap:ShareTarget>
</uap:Extension>
...
Это пример файла Application.exe.manifest:
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="PhotoStoreDemo.app"/>
<msix xmlns="urn:schemas-microsoft-com:msix.v1"
publisher="CN=YourPubNameHere"
packageName="PhotoStoreDemo"
applicationId="PhotoStoreDemo"
/>
</assembly>
Затем, чтобы создать пакет с внешним расположением, используйте MakeAppx.exe
средство с /nv
командой для создания пакета, AppxManifest.xml
содержащего файл.
Пример:
MakeAppx.exe pack /d <Path to directory with AppxManifest.xml> /p <Output Path>\mypackage.msix /nv
Примечание.
Пакет с внешним расположением содержит манифест пакета, но никакие другие двоичные файлы и содержимое приложения. Манифест пакета с внешним расположением может ссылаться на файлы за пределами пакета в предопределенном внешнем расположении.
Подписыв пакет с помощью SignTool.exe
доверенного сертификата.
Пример:
SignTool.exe sign /fd SHA256 /a /f <path to cert> /p <cert key> <Path to Package>
Сертификат, используемый для подписывания пакета, должен быть установлен в надежном расположении на компьютере.
При первом запуске приложения зарегистрируйте пакет в Windows. Если у приложения есть собственный установщик, он также должен содержать подписанный MSIX в качестве полезных данных и должен поместить его в указанное расположение (например, расположение установки приложения). Это расположение должно быть известно приложению во время выполнения, так как приложению потребуется абсолютный путь MSIX для его регистрации. Поместите ресурсы и resources.pri
в расположение установки приложения.
Следующий код является примером распаковки выполнения метода Main приложения:
[STAThread]
public static void Main(string[] cmdArgs)
{
//if app isn't running with identity, register its package with external identity
if (!ExecutionMode.IsRunningWithIdentity())
{
//TODO - update the value of externalLocation to match the output location of your VS Build binaries and the value of
//externalPkgPath to match the path to your signed package with external identity (.msix).
//Note that these values cannot be relative paths and must be complete paths
string externalLocation = Environment.CurrentDirectory;
string externalPkgPath = externalLocation + @"\PhotoStoreDemo.package.msix";
//Attempt registration
bool bPackageRegistered = false;
//bPackageRegistered = registerPackageWithExternalLocation(externalLocation, externalPkgPath);
if (bPackageRegistered)
{
//Registration succeeded, restart the app to run with identity
System.Diagnostics.Process.Start(Application.ResourceAssembly.Location, arguments: cmdArgs?.ToString());
}
else //Registration failed, run without identity
{
Debug.WriteLine("Package Registration failed, running WITHOUT Identity");
SingleInstanceManager wrapper = new SingleInstanceManager();
wrapper.Run(cmdArgs);
}
}
...
В этом примере показано, как зарегистрировать MSIX в первом запуске приложения:
[STAThread]
public static void Main(string[] cmdArgs)
{
//If app isn't running with identity, register its package with external identity
if (!ExecutionMode.IsRunningWithIdentity())
{
//TODO - update the value of externalLocation to match the output location of your VS Build binaries and the value of
//externalPkgPath to match the path to your signed package with external identity (.msix).
//Note that these values cannot be relative paths and must be complete paths
string externalLocation = Environment.CurrentDirectory;
string externalPkgPath = externalLocation + @"\PhotoStoreDemo.package.msix";
//Attempt registration
if (registerPackageWithExternalLocation(externalLocation, externalPkgPath))
{
//Registration succeeded, restart the app to run with identity
System.Diagnostics.Process.Start(Application.ResourceAssembly.Location, arguments: cmdArgs?.ToString());
}
else //Registration failed, run without identity
{
Debug.WriteLine("Package Registration failed, running WITHOUT Identity");
SingleInstanceManager wrapper = new SingleInstanceManager();
wrapper.Run(cmdArgs);
}
}
...
Наконец, обработайте активацию приложения:
[STAThread]
public static void Main(string[] cmdArgs)
{
//if app isn't running with identity, register its sparse package
if (!ExecutionMode.IsRunningWithIdentity())
{
...
}
else //App is registered and running with identity, handle launch and activation
{
//Handle Sparse Package based activation e.g Share target activation or clicking on a Tile
// Launching the .exe directly will have activationArgs == null
var activationArgs = AppInstance.GetActivatedEventArgs();
if (activationArgs != null)
{
switch (activationArgs.Kind)
{
case ActivationKind.Launch:
HandleLaunch(activationArgs as LaunchActivatedEventArgs);
break;
case ActivationKind.ToastNotification:
HandleToastNotification(activationArgs as ToastNotificationActivatedEventArgs);
break;
case ActivationKind.ShareTarget: // Handle the activation as a share target
HandleShareAsync(activationArgs as ShareTargetActivatedEventArgs);
break;
default:
HandleLaunch(null);
break;
}
}
//This is a direct exe based launch e.g. double click app .exe or desktop shortcut pointing to .exe
else
{
SingleInstanceManager singleInstanceManager = new SingleInstanceManager();
singleInstanceManager.Run(cmdArgs);
}
}
Windows Share с демонстрацией удостоверения пакета
В следующем видео показано, как распаковываемое приложение может быть целевым объектом общего доступа после предоставления удостоверения пакета и регистрации в качестве целевого объекта общего доступа:
См. также
- Общие сведения о развертывании пакета SDK для приложений Для Windows
- Создание простого проекта WinUI 3
- Миграция из UWP в пакет SDK для приложений Windows
- Преимущества и недостатки упаковки приложения — обзор развертывания
- Удостоверение, регистрация и активация непакетированных приложений Win32
- Предоставление общего доступа к реализации контракта для приложения WinAppSDK
- Предоставление общего доступа к реализации контракта для приложений, упакованных с внешним расположением
Windows developer