Universal Windows Platform (UWP) は、Windows 10を実行するすべてのデバイスに共通のアプリ プラットフォームを提供します。 このモデルでは、UWP アプリは、すべてのデバイスに共通する WinRT API と、アプリが実行されているデバイス ファミリに固有の API (Win32 と.NETを含む) の両方を呼び出すことができます。
このチュートリアルでは、マネージド プロジェクトとネイティブ プロジェクトの両方で使用できるネイティブ UWP コンポーネント (XAML コントロールを含む) を含む NuGet パッケージを作成します。
前提条件
Visual Studio 2017 または Visual Studio 2015。 visualstudio.com から無料で 2017 Community エディションをインストールします。Professional エディションと Enterprise エディションも使用できます。
NuGet CLI。 nuget.org/downloads
nuget.exeバージョンのをダウンロードし、選択した場所に保存します (ダウンロードは直接.exeです)。 その場所がまだない場合は、その場所を PATH 環境変数に追加します。
UWP Windows Runtime コンポーネントを作成する
Visual Studioでは、 File > New > Project を選択し、Visual C++ > Windows > Universal ノードを展開し、Windows Runtime コンポーネント (ユニバーサル Windows) テンプレートの名前を ImageEnhancer に変更し、[OK] をクリックします。 メッセージが表示されたら、[ターゲット バージョン] と [最小バージョン] の既定値をそのまま使用します。
Solution Explorerでプロジェクトを右クリックし、
[Add New Item Visual C++ ノードをクリックし、XAML Templated Control を選択し、名前を AwesomeImageControl.cpp に変更して、Add をクリックします。
Solution Explorerでプロジェクトを右クリックし、プロパティを選択します。プロパティページで、構成プロパティ > C/C++を展開し、出力ファイルをクリックします。 右側のペインで、[ XML ドキュメント ファイルの生成 ] の値を [はい] に変更します。
ソリューションを今すぐ右クリックし、[バッチ ビルド] を選択し、次に示すようにダイアログの 3 つの [デバッグ] ボックスをオンにします。 これにより、ビルドを実行すると、Windowsがサポートする各ターゲット システムの成果物の完全なセットが生成されます。
[バッチ ビルド] ダイアログで、[ ビルド ] をクリックしてプロジェクトを確認し、NuGet パッケージに必要な出力ファイルを作成します。
注
このチュートリアルでは、パッケージのデバッグ 成果物を使用します。 非デバッグ パッケージの場合は、代わりに Batch ビルド ダイアログでリリース オプションを確認し、次の手順で結果のリリース フォルダーを参照してください。
.nuspec ファイルを作成して更新する
初期 .nuspec ファイルを作成するには、次の 3 つの手順を実行します。 以降のセクションでは、他の必要な更新プログラムについて説明します。
コマンド プロンプトを開き、
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 パッケージに含める必要があります。 IntelliSense データを含む XML ファイルも同時にビルドされ、同様に含める必要があります。
<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 型のコア ロジックはネイティブ コードにあり、ターゲット ランタイム (ARM、x86、x64) ごとに生成されるさまざまな ImageEnhancer.dll アセンブリに含まれています。 これらをパッケージに含めるには、関連する .pri リソース ファイルと共に、 <files> セクションでそれらを参照します。
<?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>
.targets の追加
次に、NuGet パッケージを使用する可能性がある C++ および JavaScript プロジェクトには、必要なアセンブリファイルと winmd ファイルを識別するための .targets ファイルが必要です。 (C# プロジェクトと Visual Basic プロジェクトでは、この処理が自動的に実行されます)。このファイルを作成するには、以下のテキストを ImageEnhancer.targets にコピーし、.nuspec ファイルと同じフォルダーに保存します。
注: この.targets ファイルは、パッケージ ID と同じ名前である必要があります (たとえば、<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 にアップロードする前に拡張機能を復元することを忘れないでください。
他の開発者がパッケージを使用できるようにするには、「 パッケージを発行する」の手順に従います。