複数の .NET バージョンをサポートするSupport multiple .NET versions

多くのライブラリは、特定のバージョンの .NET Framework に対応しています。Many libraries target a specific version of the .NET Framework. たとえば、あるバージョンのライブラリは UWP に固有であり、別のバージョンは .NET Framework 4.6 の機能を活用します。For example, you might have one version of your library that's specific to UWP, and another version that takes advantage of features in .NET Framework 4.6. これに対応するために、NuGet では 1 つのパッケージに同じライブラリの複数のバージョンを配置することがサポートされています。To accommodate this, NuGet supports putting multiple versions of the same library in a single package.

この記事では、パッケージやアセンブリのビルド方法に関係なく、NuGet パッケージのレイアウトについて説明します (つまり、SDK スタイルではない複数の .csproj ファイルとカスタムの .nuspec ファイルを使う場合でも、複数をターゲットにした SDK スタイルの .csproj を単一ファイルで使う場合でも、レイアウトは同じです)。This article describes the layout of a NuGet package, regardless of how the package or assemblies are built (that is, the layout is the same whether using multiple non-SDK-style .csproj files and a custom .nuspec file, or a single multi-targeted SDK-style .csproj). SDK スタイルのプロジェクトの場合、NuGet の pack ターゲットでは、パッケージの整理方法が認識され、適切な lib フォルダーにアセンブリを配置したり、ターゲット フレームワーク (TFM) ごとに依存関係グループを作成する操作が自動化されます。For an SDK-style project, NuGet pack targets knows how the package must be layed out and automates putting the assemblies in the correct lib folders and creating dependency groups for each target framework (TFM). 詳細な手順については、「プロジェクト ファイル内で複数の .NET Framework バージョンをサポートする」を参照してください。For detailed instructions, see Support multiple .NET Framework versions in your project file.

パッケージの作成」で説明されている規則ベースの作業ディレクトリを使用する場合は、この記事の説明に従って手動でパッケージをレイアウトする必要があります。You must manually lay out the package as described in this article when using the convention-based working directory method described in Creating a package. SDK スタイルのプロジェクトでは自動の方法を使用することをお勧めしますが、この記事で説明されているように、パッケージを手動で配置することもできます。For an SDK-style project, the automated method is recommended, but you may also choose to manually lay out the package as described in this article.

フレームワーク バージョンのフォルダー構造Framework version folder structure

1 つだけのバージョンのライブラリを含むパッケージまたは複数のフレームワークを対象とするパッケージをビルドするときは常に、小文字と大文字を区別するフレームワーク名を利用し、lib の下にサブフォルダーを作ります。次の規則を利用します。When building a package that contains only one version of a library or target multiple frameworks, you always make subfolders under lib using different case-sensitive framework names with the following convention:

lib\{framework name}[{version}]

サポートされている名前の完全一覧については、ターゲット フレームワーク参照を参照してください。For a complete list of supported names, see the Target Frameworks reference.

フレームワークに固有ではないライブラリ バージョンは、ルート lib フォルダーに直接置かないでください。You should never have a version of the library that is not specific to a framework and placed directly in the root lib folder. (この機能は packages.config でのみサポートされていました。)(This capability was supported only with packages.config). これにより、ライブラリがあらゆるターゲット フレームワークに対応するようになり、どこでもインストールできてしまいます。その結果、予想外のランタイム エラーが発生します。Doing so would make the library compatible with any target framework and allow it to be installed anywhere, likely resulting in unexpected runtime errors. ルート フォルダー (lib\abc.dll など) またはサブフォルダー (lib\abc\abc.dll など) へのアセンブリ追加は非推奨となりました。PackagesReference 形式を使用するときは無視されます。Adding assemblies in the root folder (such as lib\abc.dll) or subfolders (such as lib\abc\abc.dll) has been deprecated and is ignored when using the PackagesReference format.

たとえば、次のフォルダー構造では、フレームワーク固有の 4 つのバージョンのアセンブリがサポートされています。For example, the following folder structure supports four versions of an assembly that are framework-specific:

\lib
    \net46
        \MyAssembly.dll
    \net461
        \MyAssembly.dll
    \uap
        \MyAssembly.dll
    \netcore
        \MyAssembly.dll

パッケージのビルド時、これらすべてのファイルを簡単に含めるには、.nuspec<files> セクションに再帰的 ** ワイルドカードを使用します。To easily include all these files when building the package, use a recursive ** wildcard in the <files> section of your .nuspec:

<files>
    <file src="lib\**" target="lib/{framework name}[{version}]" />
</files>

アーキテクチャ固有フォルダーArchitecture-specific folders

アーキテクチャ固有のアセンブリがあるとき、つまり、個々のアセンブリが ARM、x86、x64 を対象とするとき、runtimes という名前のフォルダーの {platform}-{architecture}\lib\{framework} または {platform}-{architecture}\native という名前のサブフォルダー内にそれを置く必要があります。If you have architecture-specific assemblies, that is, separate assemblies that target ARM, x86, and x64, you must place them in a folder named runtimes within sub-folders named {platform}-{architecture}\lib\{framework} or {platform}-{architecture}\native. たとえば、次のフォルダー構造は、Windows 10 と uap10.0 フレームワークを対象とするネイティブ DLL とマネージド DLL の両方に対応します。For example, the following folder structure would accommodate both native and managed DLLs targeting Windows 10 and the uap10.0 framework:

\runtimes
    \win10-arm
        \native
        \lib\uap10.0
    \win10-x86
        \native
        \lib\uap10.0
    \win10-x64
        \native
        \lib\uap10.0

これらのアセンブリはランタイムでのみ使用できます。そのため、対応するコンパイル時のアセンブリも指定する必要がある場合は、AnyCPU アセンブリを /ref/{tfm} フォルダー内に置きます。These assemblies will only be available at runtime, so if you want to provide the corresponding compile time assembly as well then have AnyCPU assembly in /ref/{tfm} folder.

NuGet では、コンパイル時またはランタイムのアセットを常に 1 つのフォルダーから選択するため、/ref からの互換性のあるアセットが存在する場合は、コンパイル時のアセンブリを追加するために /lib が無視されます。Please note, NuGet always picks these compile or runtime assets from one folder so if there are some compatible assets from /ref then /lib will be ignored to add compile-time assemblies. 同様に、/runtimes からの互換性のあるアセットが存在する場合も、ランタイムのために /lib が無視されます。Similarly, if there are some compatible assets from /runtimes then also /lib will be ignored for runtime.

.nuspec マニフェストでこれらのファイルを参照する例については、「Create UWP Packages」 (UWP パッケージの作成) を参照してください。See Create UWP Packages for an example of referencing these files in the .nuspec manifest.

また、NuGet を使用した Windows ストア アプリのコンポーネントのパッケージ化に関するページもご覧ください。Also, see Packing a Windows store app component with NuGet

プロジェクトでアセンブリ バージョンとターゲット フレームワークを組み合わせるMatching assembly versions and the target framework in a project

複数のアセンブリ バージョンを含むパッケージを NuGet がインストールすると、アセンブリのフレームワーク名とプロジェクトのターゲット フレームワークの照合が試行されます。When NuGet installs a package that has multiple assembly versions, it tries to match the framework name of the assembly with the target framework of the project.

一致が見つからない場合、プロジェクトのターゲット フレームワークと同じかそれより下のバージョンの中で最も上のバージョンのアセンブリがコピーされます。If a match is not found, NuGet copies the assembly for the highest version that is less than or equal to the project's target framework, if available. 互換性のあるアセンブリが見つからない場合、エラー メッセージが返されます。If no compatible assembly is found, NuGet returns an appropriate error message.

たとえば、パッケージに次のフォルダー構造があるとします。For example, consider the following folder structure in a package:

\lib
    \net45
        \MyAssembly.dll
    \net461
        \MyAssembly.dll

.NET Framework 4.6 を対象とするプロジェクトにこのパッケージをインストールすると、NuGet は net45 フォルダーにアセンブリをインストールします。4.6 以下で利用できる最も上のバージョンであるためです。When installing this package in a project that targets .NET Framework 4.6, NuGet installs the assembly in the net45 folder, because that's the highest available version that's less than or equal to 4.6.

一方、プロジェクトが .NET Framework 4.6.1 を対象とする場合、NuGet は net461 フォルダーにアセンブリをインストールします。If the project targets .NET Framework 4.6.1, on the other hand, NuGet installs the assembly in the net461 folder.

プロジェクトが .NET Framework 4.0 以前を対象とする場合、NuGet はエラー メッセージを出し、互換性のあるアセンブリが見つからないことを伝えます。If the project targets .NET framework 4.0 and earlier, NuGet throws an appropriate error message for not finding the compatible assembly.

フレームワーク バージョン別にアセンブリをグループ化するGrouping assemblies by framework version

NuGet は、パッケージ内の 1 つだけのライブラリ フォルダーからアセンブリをコピーします。NuGet copies assemblies from only a single library folder in the package. たとえば、パッケージに次のフォルダー構造があるとします。For example, suppose a package has the following folder structure:

\lib
    \net40
        \MyAssembly.dll (v1.0)
        \MyAssembly.Core.dll (v1.0)
    \net45
        \MyAssembly.dll (v2.0)

.NET Framework 4.5 を対象とするプロジェクトにパッケージがインストールされるとき、インストールされる唯一のアセンブリは MyAssembly.dll (v2.0) です。When the package is installed in a project that targets .NET Framework 4.5, MyAssembly.dll (v2.0) is the only assembly installed. MyAssembly.Core.dll (v1.0) はインストールされません。net45 フォルダーの一覧にないためです。MyAssembly.Core.dll (v1.0) is not installed because it's not listed in the net45 folder. MyAssembly.Core.dllMyAssembly.dll のバージョン 2.0 に結合されている可能性があるため、NuGet はこのように動作します。NuGet behaves this way because MyAssembly.Core.dll might have merged into version 2.0 of MyAssembly.dll.

.NET Framework 4.5 で MyAssembly.Core.dll をインストールする場合、net45 フォルダーにコピーを置きます。If you want MyAssembly.Core.dll to be installed for .NET Framework 4.5, place a copy in the net45 folder.

フレームワーク プロファイル別にアセンブリをグループ化するGrouping assemblies by framework profile

NuGet ではまた、ダッシュとプロファイル名をフォルダーの最後に付けることで特定のフレームワーク プロファイルを対象にすることができます。NuGet also supports targeting a specific framework profile by appending a dash and the profile name to the end of the folder.

lib\{framework name}-{profile}

サポートされているプロファイルは次のとおりです。The supported profiles are as follows:

  • client:Client Profileclient: Client Profile
  • full:Full Profilefull: Full Profile
  • wp:Windows Phonewp: Windows Phone
  • cf:Compact Frameworkcf: Compact Framework

依存関係の宣言 (高度)Declaring dependencies (Advanced)

プロジェクト ファイルをパックするとき、NuGet はそのプロジェクトから依存関係を自動的に生成しようとします。When packing a project file, NuGet tries to automatically generate the dependencies from the project. このセクションに記載されている、 .nuspec ファイルを使用した依存関係の宣言に関する情報が必要になるのは、通常は、高度なシナリオだけです。The information in this section about using a .nuspec file to declare dependencies is typically necessary for advanced scenarios only.

" (バージョン 2.0 以降) " <dependencies> 要素内の <group> 要素を使って、ターゲット プロジェクトのターゲット フレームワークに対応する .nuspec でパッケージの依存関係を宣言できます。(Version 2.0+) You can declare package dependencies in the .nuspec corresponding to the target framework of the target project using <group> elements within the <dependencies> element. 詳しくは、dependencies 要素に関する記事をご覧ください。For more information, see dependencies element.

各グループには、targetFramework という名前の属性があり、0 個以上の <dependency> 要素が含まれます。Each group has an attribute named targetFramework and contains zero or more <dependency> elements. ターゲット フレームワークにプロジェクトのフレームワーク プロファイルとの互換性がある場合、これらの依存関係が一緒にインストールされます。Those dependencies are installed together when the target framework is compatible with the project's framework profile. 正確なフレームワーク識別子については、「ターゲット フレームワーク」をご覧ください。See Target frameworks for the exact framework identifiers.

lib/ および ref/ フォルダー内のファイルに対しては、ターゲット フレームワーク モニカー (TFM) ごとに 1 つのグループを使用することをお勧めします。We recommend using one group per Target Framework Moniker (TFM) for files in the lib/ and ref/ folders.

次の例では、<group> 要素のさまざまなバリエーションを示します。The following example shows different variations of the <group> element:

<dependencies>

    <group targetFramework="net472">
        <dependency id="jQuery" version="1.10.2" />
        <dependency id="WebActivatorEx" version="2.2.0" />
    </group>

    <group targetFramework="net20">
    </group>

</dependencies>

使用する NuGet ターゲットを決定するDetermining which NuGet target to use

ポータブル クラス ライブラリを対象とするライブラリをパッケージ化するとき、フォルダー名と .nuspec ファイルで使用する NuGet ターゲットの決定にはこつが要ります。PCL のサブセットのみを対象とする場合は特にそうです。When packaging libraries targeting the Portable Class Library it can be tricky to determine which NuGet target you should use in your folder names and .nuspec file, especially if targeting only a subset of the PCL. 次の外部リソースが役立ちます。The following external resources will help you with this:

コンテンツ ファイルと PowerShell スクリプトContent files and PowerShell scripts

警告

変更可能なコンテンツ ファイルとスクリプト実行は packages.config 形式のみで利用できます。これらは、他のすべての形式を使用するときは非推奨とされます。また、新しいパッケージにはこれらを使用しないでください。Mutable content files and script execution are available with the packages.config format only; they are deprecated with all other formats and should not be used for any new packages.

packages.config では、コンテンツ ファイルと PowerShell スクリプトを、content フォルダーと tools フォルダー内で同じフォルダー規則を使用し、ターゲット フレームワーク別にグループ化できます。With packages.config, content files and PowerShell scripts can be grouped by target framework using the same folder convention inside the content and tools folders. 次に例を示します。For example:

\content
    \net46
        \MyContent.txt
    \net461
        \MyContent461.txt
    \uap
        \MyUWPContent.html
    \netcore
\tools
    init.ps1
    \net46
        install.ps1
        uninstall.ps1
    \uap
        install.ps1
        uninstall.ps1

フレームワーク フォルダーを空のまま残す場合、NuGet はアセンブリ参照やコンテンツ ファイルを追加せず、そのフレームワークの PowerShell スクリプトを実行しません。If a framework folder is left empty, NuGet doesn't add assembly references or content files or run the PowerShell scripts for that framework.

注意

init.ps1 はソリューション レベルで実行され、プロジェクトに依存しないため、tools フォルダーの下に直接置く必要があります。Because init.ps1 is executed at the solution level and not dependent on project, it must be placed directly under the tools folder. フレームワーク フォルダーの下に置いた場合は無視されます。It's ignored if placed under a framework folder.