1. ホーム
  2. c#

[解決済み] csprojで.NET Coreクラスライブラリをマルチターゲットにする方法とは?

2022-11-23 17:59:14

質問

.NET Coreがまだ project.json 形式を使用していたころは、クラスライブラリ 複数のフレームワークをターゲットにした (例:net451, netcoreapp1.0)をターゲットとしたクラスライブラリを構築することができます。

現在、公式のプロジェクト形式は csproj を使用してMSBuildを実行する場合、ターゲットとする複数のフレームワークをどのように指定するのでしょうか?VS2017 のプロジェクト設定から探そうとしているのですが、.NET Core フレームワークの中から単一のフレームワークしかターゲットにできません(他のフルバージョンの .NET Framework はリストアップされないので を行う はインストールされています)。

どのように解決するのですか?

プロジェクトファイルを手動で編集し、そのファイルに s をデフォルトの ターゲットフレームワーク に変更し、基本的には ターゲットフレームワーク . それから Moniker と共に ; セパレータを使用します。

また、Nuget パッケージの参照を条件付き ItemGroup に手動で、または VS Nuget パッケージマネージャを使用して置くことができます。

.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 プラットフォーム標準は、PCL を発展させたものです。 PCL を発展させたものであり、単一の名称を使用してプラットフォーム間でのバイナリ移植性を表します。 のような静的なものに縛られることなく、プラットフォーム間でのバイナリ移植性を表します。

Portable Profile をターゲットとする場合、あらかじめ定義された モノカー を持たないので、ポータブルプロファイルもまた 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>