Поделиться через


Макросы в схеме манифеста пакета

Макрос — это динамически вычисляемое манифестное значение. Макросы можно использовать в значениях некоторых атрибутов в схеме манифеста пакета. Примерами таких атрибутов являются uap11:CurrentDirectoryPath и uap11:Parameters.

Синтаксис

Макрос выражается в форме $(macro_name).

  • Этот синтаксис расширяется до значения в столбце Expands to ниже.
  • Для одного $ символа в значении атрибута используйте escape-последовательность $$.
Имени макроса Разворачивается до
env:environmentvariable GetEnvironmentVariable(environmentvariable)
package.currentDirectoryPath GetCurrentDirectory()
package.effectiveExternalPath GetPackagePathByFullName2(... PackagePathType_EffectiveExternal...)
package.effectivePath GetPackagePathByFullName2(... PackagePathType_Effective...)
package.installedPath GetPackagePathByFullName2(... PackagePathType_Install...)
package.machineExternalPath GetPackagePathByFullName2(... PackagePathType_MachineExternal...)
package.mutablePath GetPackagePathByFullName2(... PackagePathType_Mutable...)
package.userExternalPath GetPackagePathByFullName2(... PackagePathType_UserExternal...)
system.path GetSystemDirectory()
windows.path GetWindowsDirectory()

Пример сценария

В этом гипотетическом примере сценария я создал упакованную версию приложения (написанного на Языке Python) с именем MyPackagedPythonApp.py. Чтобы запустить его, мне потребуется следующее в манифесте:

<Application...Executable="python.exe" uap10:TrustLevel="mediumIL" uap10:RuntimeBehavior="packagedClassicApp" uap10:Parameters="-m MyPackagedPythonApp.py --default=1">

Эта конфигурация приводит к выполнению этой команды:

"C:\Program Files\WindowsApps\MyApp_1.2.3.4_x64__1234567890abc\python.exe" -m MyPackagedPythonApp.py --default=1

Но эта команда завершается ошибкой, если текущей папкой не является C:\Program Files\WindowsApps\MyApp_1.2.3.4_x64__1234567890abc.

Поэтому я могу попытаться указать файл .py по абсолютному имени файла, как показано ниже:

"C:\Program Files\WindowsApps\MyApp_1.2.3.4_x64__1234567890abc\python.exe" -m "C:\Program Files\WindowsApps\MyApp_1.2.3.4_x64__1234567890abc\MyPackagedPythonApp.py" --default=1

Но я, как разработчик, не знаю, будет ли пакет установлен на этот путь. Возможно, диск пользователя был заполнен, поэтому пакет оказался на диске Q. И путь меняется каждый раз, когда я натыкаюсь на версию пакета. Так вот где макросы приходят на помощь.

Я указываю свой .py файл с помощью макроса для пути (который будет оцениваться во время выполнения) к расположению пакета, как показано ниже:

<Application...Executable="python.exe" uap10:TrustLevel="mediumIL" uap10:RuntimeBehavior="packagedClassicApp" uap10:Parameters="-m $(package.effectivePath)\MyPackagedPythonApp.py --defcon=1">

Теперь во время выполнения команда выполняется должным образом. Но Windows динамически заполняет правильный путь (опять же, во время выполнения), как показано ниже:

"C:\Program Files\WindowsApps\MyApp_1.2.3.4_x64__1234567890abc\python.exe" -m "C:\Program Files\WindowsApps\MyApp_1.2.3.4_x64__1234567890abc\MyPackagedPythonApp.py" --default=1