Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Universal Windows Platform (UWP) предоставляет общую платформу приложений для каждого устройства, работающего Windows 10. В рамках этой модели приложения UWP могут вызывать интерфейсы API WinRT, которые являются общими для всех устройств, а также API (включая Win32 и .NET), относящиеся к семейству устройств, на которых работает приложение.
В этом пошаговом руководстве вы создадите пакет NuGet с собственным компонентом UWP (включая элемент управления XAML), который можно использовать как в управляемых, так и в собственных проектах.
Необходимые условия
Visual Studio 2017 или Visual Studio 2015. Установите выпуск Community 2017 бесплатно из visualstudio.com; Вы также можете использовать выпуски Professional и Enterprise.
Интерфейс командной строки NuGet. Скачайте последнюю версию
nuget.exeс сайта nuget.org/downloads, сохранив её в выбранной вами папке (скачивается такой.exeнепосредственно). Затем добавьте это расположение в переменную среды PATH, если это еще не так.
Создание компонента Windows Runtime UWP
В Visual Studio выберите File > New > Project, разверните узел Visual C++ > Windows > Universal, выберите шаблон Windows Runtime Component (Универсальная платформа Windows), измените имя на ImageEnhancer и нажмите кнопку "ОК". При появлении запроса примите значения по умолчанию для целевой версии и минимальной версии.
Щелкните проект правой кнопкой мыши в Solution Explorer, выберите Add > New Item, Щелкните узел Visual C++ > XAML, выберите Templated Control измените имя на AwesomeImageControl.cpp и щелкните Add:
Щелкните проект правой кнопкой мыши в Solution Explorer и выберите Properties. На странице свойств разверните Configuration Properties > C/C++ и щелкните Output Files. В области справа измените значение для параметра Создание XML-документации на да.
Щелкните решение правой кнопкой мыши, выберите пакетную сборку, установите три поля отладки в диалоговом окне, как показано ниже. Это гарантирует, что при выполнении сборки создается полный набор артефактов для каждой из целевых систем, которые поддерживаются Windows.
В диалоговом окне пакетной сборки нажмите кнопку "Сборка ", чтобы проверить проект и создать выходные файлы, необходимые для пакета NuGet.
Замечание
В этом пошаговом руководстве вы используете отладочные артефакты для пакета. Для не отладочного пакета проверьте параметры релиза в диалоговом окне "Пакетная сборка" и обратитесь к результирующим папкам релиза в последующих шагах.
Создание и обновление nuspec-файла
Чтобы создать исходный .nuspec файл, сделайте следующее. В следующих разделах описаны другие необходимые обновления.
Откройте командную строку и перейдите в папку, содержащую
ImageEnhancer.vcxproj(это будет вложенная папка ниже, где находится файл решения).Выполните команду NuGet
spec, чтобы создатьImageEnhancer.nuspec(имя файла берется из имени.vcxprojфайла):nuget specОткройте
ImageEnhancer.nuspecв редакторе и обновите его, чтобы оно соответствовало следующему, заменив YOUR_NAME соответствующим значением. Значение<id>, в частности, должно быть уникальным в nuget.org (см. соглашения об именовании, описанные в статье "Создание пакета"). Кроме того, обратите внимание, что необходимо также обновить теги автора и описания, иначе вы получите ошибку на этапе упаковки.<?xml version="1.0"?> <package > <metadata> <id>ImageEnhancer.YOUR_NAME</id> <version>1.0.0</version> <title>ImageEnhancer</title> <authors>YOUR_NAME</authors> <owners>YOUR_NAME</owners> <requireLicenseAcceptance>false</requireLicenseAcceptance> <description>Awesome Image Enhancer</description> <releaseNotes>First release</releaseNotes> <copyright>Copyright 2016</copyright> <tags>image enhancer imageenhancer</tags> </metadata> </package>
Замечание
Для пакетов, созданных для общедоступного потребления, обратите особое внимание на <tags> элемент, так как эти теги помогают другим пользователям найти пакет и понять, что это делает.
Добавление метаданных Windows в пакет
Компонент Windows Runtime требует метаданных, описывающих все его общедоступные типы, что позволяет другим приложениям и библиотекам использовать компонент. Эти метаданные содержатся в winmd-файле, который создается при компиляции проекта и должен быть включен в пакет NuGet. XML-файл с данными IntelliSense также создается одновременно и должен быть включен.
Добавьте следующий <files> узел в .nuspec файл:
<package>
<metadata>
...
</metadata>
<files>
<!-- WinMd and IntelliSense files -->
<file src="..\Debug\ImageEnhancer\ImageEnhancer.winmd" target="lib\uap10.0"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.xml" target="lib\uap10.0"/>
</files>
</package>
Добавление содержимого XAML
Чтобы включить элемент управления XAML с компонентом, необходимо добавить XAML-файл, имеющий шаблон по умолчанию для элемента управления (как создается шаблоном проекта). Это также относится к разделу <files> :
<?xml version="1.0"?>
<package >
<metadata>
...
</metadata>
<files>
...
<!-- XAML controls -->
<file src="Themes\Generic.xaml" target="lib\uap10.0\Themes"/>
</files>
</package>
Добавление собственных библиотек реализации
В вашем компоненте основная логика типа ImageEnhancer находится в нативном коде, который содержится в различных ImageEnhancer.dll сборках, создаваемых для каждой целевой среды выполнения (ARM, x86 и x64). Чтобы включить их в пакет, ознакомьтесь с ними в <files> разделе вместе с связанными файлами ресурсов .pri:
<?xml version="1.0"?>
<package >
<metadata>
...
</metadata>
<files>
...
<!-- DLLs and resources -->
<file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm\native"/>
<file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm\native"/>
<file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm64\native"/>
<file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm64\native"/>
<file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x64\native"/>
<file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x64\native"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x86\native"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x86\native"/>
</files>
</package>
Добавление целевых объектов
Затем проектам C++ и JavaScript, которые могут использовать ваш пакет NuGet, нужен файл .targets для идентификации необходимых сборок и winmd-файлов. (Проекты C# и Visual Basic делают это автоматически.) Создайте этот файл, скопировав приведенный ниже текст в ImageEnhancer.targets, и сохраните его в той же папке, что и файл .nuspec.
Примечание. Этот .targets файл должен быть таким же именем, как и идентификатор пакета (например <Id> , элемент в .nupspec файле):
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ImageEnhancer-Platform Condition="'$(Platform)' == 'Win32'">x86</ImageEnhancer-Platform>
<ImageEnhancer-Platform Condition="'$(Platform)' != 'Win32'">$(Platform)</ImageEnhancer-Platform>
</PropertyGroup>
<ItemGroup Condition="'$(TargetPlatformIdentifier)' == 'UAP'">
<Reference Include="$(MSBuildThisFileDirectory)..\..\lib\uap10.0\ImageEnhancer.winmd">
<Implementation>ImageEnhancer.dll</Implementation>
</Reference>
<ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\runtimes\win10-$(ImageEnhancer-Platform)\native\ImageEnhancer.dll" />
</ItemGroup>
</Project>
Затем обратитесь к ImageEnhancer.targets в вашем файле .nuspec.
<?xml version="1.0"?>
<package >
<metadata>
...
</metadata>
<files>
...
<!-- .targets -->
<file src="ImageEnhancer.targets" target="build\native"/>
</files>
</package>
Итоговый .nuspec
Окончательный .nuspec файл должен выглядеть следующим образом, где снова YOUR_NAME следует заменить соответствующим значением:
<?xml version="1.0"?>
<package >
<metadata>
<id>ImageEnhancer.YOUR_NAME</id>
<version>1.0.0</version>
<title>ImageEnhancer</title>
<authors>YOUR_NAME</authors>
<owners>YOUR_NAME</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Awesome Image Enhancer</description>
<releaseNotes>First Release</releaseNotes>
<copyright>Copyright 2016</copyright>
<tags>image enhancer imageenhancer</tags>
</metadata>
<files>
<!-- WinMd and IntelliSense -->
<file src="..\Debug\ImageEnhancer\ImageEnhancer.winmd" target="lib\uap10.0"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.xml" target="lib\uap10.0"/>
<!-- XAML controls -->
<file src="Themes\Generic.xaml" target="lib\uap10.0\Themes"/>
<!-- DLLs and resources -->
<file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm\native"/>
<file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm\native"/>
<file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm64\native"/>
<file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm64\native"/>
<file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x64\native"/>
<file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x64\native"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x86\native"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x86\native"/>
<!-- .targets -->
<file src="ImageEnhancer.targets" target="build\native"/>
</files>
</package>
Упаковка компонента
После завершения .nuspec ссылки на все файлы, которые необходимо включить в пакет, можно выполнить pack команду:
nuget pack ImageEnhancer.nuspec
Это создает ImageEnhancer.YOUR_NAME.1.0.0.nupkg. Откройте этот файл в средстве, например в обозревателе пакетов NuGet , и разверните все узлы, вы увидите следующее содержимое:
Подсказка
Файл .nupkg — это только ZIP-файл с другим расширением. Вы также можете проверить содержимое пакета, изменив .nupkg на .zip, но не забудьте восстановить расширение перед отправкой пакета в nuget.org.
Чтобы сделать пакет доступным для других разработчиков, следуйте инструкциям по публикации пакета.