.NET Coreがまだproject.json
形式を使用している場合は、クラスライブラリを構築できます 複数のフレームワークを対象とする (例:net451、netcoreapp1.0)。
MSBuildを使用した公式プロジェクトの形式はcsproj
になったので、ターゲットにする複数のフレームワークをどのように指定しますか?私はVS2017のプロジェクト設定からこれを探していますが、.NET Coreフレームワークの単一のフレームワークのみをターゲットにすることができます(他の完全な.NET Frameworkバージョンもリストしていませんdoインストール済み):
プロジェクトファイルを手動で編集し、デフォルトのTargetFrameworkにsを追加し、基本的にTargetFrameworks。次に、 Moniker に;セパレータを付けて言及します。
また、手動で、またはVS Nuget Package Managerを使用して、Nugetパッケージ参照を条件付きItemGroupに配置できます。
.csprojは次のようになります。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard1.6;net452</TargetFrameworks>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net452'">
<PackageReference Include="Microsoft.Azure.DocumentDB">
<Version>1.12.0</Version>
</PackageReference>
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.6'">
<PackageReference Include="Microsoft.Azure.DocumentDB.Core">
<Version>1.1.0</Version>
</PackageReference>
</ItemGroup>
</Project>
ドキュメントが不足しているために最近行っている別の回避策は、VS2015でプロジェクトを作成し、利用可能なドキュメントとインテリセンスを使用してproject.jsonを形成し、VS2017でソリューションを開き、組み込みのアップグレードを使用することです。次に、csprojファイルを見て、その構成を実現する方法を見つけます。
Moniker:なしで、より難解なターゲットをマルチターゲティングする
マイクロソフト:
PCLは推奨されません+
PCLはサポートされていますが、パッケージ作成者は代わりにnetstandardをサポートする必要があります。 .NET Platform StandardはPCLの進化版であり、portable-a + b + cモニカのような静的に結び付けられていない単一のモニカを使用して、プラットフォーム間でのバイナリポータビリティを表します。
ポータブルプロファイルをターゲットにする場合、事前定義されたmonikerがないため、ポータブルプロファイルはTargetFrameworkIdentifier
、TargetFrameworkVersion
、およびTargetFrameworkProfile
を推測することもできません。また、コンパイラ定数は自動的に定義されません。最後に、すべてのアセンブリ参照を追加する必要があります。デフォルトでは何も提供されていません。
以下のこの例は、dynamic
キーワードを使用したプロジェクトから取得したものであるため、さらにMicrosoft.CSharp
アセンブリが必要でした。したがって、さまざまなターゲットへの参照を確認できます。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard1.5;net40;portable40-net45+sl5+win8+wp8</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
<TargetFrameworkIdentifier>.NETPortable</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile158</TargetFrameworkProfile>
<DefineConstants>$(DefineConstants);PORTABLE158</DefineConstants>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)'=='netstandard1.5'">
<PackageReference Include="Microsoft.CSharp" Version="4.3.0" />
<PackageReference Include="System.ComponentModel" Version="4.3.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='net40'">
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
<Reference Include="Microsoft.CSharp" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Windows" />
</ItemGroup>
</Project>
このために.csproj
ファイルを手動で編集し、TargetFrameworks
(TargetFramework
ではありません)プロパティを設定できます。
<TargetFrameworks>net451;netstandard1.4</TargetFrameworks>
たとえば、EFCore.csproj
を参照してください。 https://github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9b3ec6645e47c825fa842a/src/EFCore/EFCore.csproj
実際にクラスライブラリ(.NET Core)を選択しました。
ライブラリが複数のプラットフォームターゲットで動作する必要がある場合、これは必要なプロジェクトテンプレートではありません。このプロジェクトテンプレートを使用すると、ライブラリは.NETCoreをターゲットとするプロジェクトでのみ使用できます。 PCLライブラリアプローチは廃止され、.NETStandardを選択する必要があります。
これを行うには、「クラスライブラリ(.NET標準)」プロジェクトテンプレートを使用してプロジェクトを開始します。 .NETStandardバージョンを選択するオプションがあります。現在の互換性グリッド ここにあります 。
リンクされた記事が常に更新されることを願っています。これは流動的で、.NETStandard 2.0は打ち切られましたが、まだ出荷されていません。おそらく春の終わり、2017年の第2四半期を目標としており、現在97%完了と表示されています。 1.5または1.6の使用は推奨されておらず、2.0との互換性が十分ではないと言っているデザイナーを耳にします
マルチターゲットネットフレームワークとネットコアの初心者向けガイド を作成しました。
最も簡単なアプローチは、最初に1つのnetcore/netstandardターゲットを動作させてから、csprojファイルを編集し、他のターゲットに対して次の手順を実行することです。
<Reference />s
を追加するには、ビルドエラーメッセージに欠落があることを読み取るだけで、ネットワークフレームワークターゲットに対応します。<PackageReference />s
は、ターゲットごとに異なる場合に対処します。最も簡単なトリックは、GUIがNugetの参照を正しく処理できるように、一時的に単一のターゲティングに戻すことです。