Макросы в схеме манифеста пакета
Макрос — это динамически вычисляемое манифестное значение. Макросы можно использовать в значениях некоторых атрибутов в схеме манифеста пакета. Примерами таких атрибутов являются 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