Ketika .NET Core masih menggunakan project.json
format tersebut, Anda bisa membangun perpustakaan kelas yang menargetkan beberapa kerangka kerja (misalnya net451, netcoreapp1.0).
Sekarang format proyek resmi csproj
menggunakan MSBuild, bagaimana Anda menentukan beberapa kerangka kerja untuk ditargetkan? Saya mencoba untuk mencari ini dari pengaturan proyek di VS2017, tapi saya bisa hanya menargetkan kerangka tunggal dari kerangka NET Inti (bahkan tidak daftar lengkap versi .NET Framework lain yang saya lakukan telah menginstal) :
Jawaban:
Anda perlu secara manual mengedit file proyek dan add s ke default TargetFramework dan pada dasarnya mengubahnya ke TargetFrameworks . Kemudian Anda menyebutkan Moniker dengan ; pemisah.
Anda juga dapat meletakkan referensi paket Nuget dalam ItemGroup bersyarat secara manual atau menggunakan VS Nuget Package Manager.
Berikut tampilan .csproj Anda:
<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>
Solusi lain yang saya lakukan hari ini karena dokumentasi yang hilang adalah saya membuat proyek di VS2015 dan membentuk project.json menggunakan dokumentasi dan intellisense yang tersedia, kemudian membuka solusi di VS2017 dan menggunakan pemutakhiran bawaan. Saya kemudian akan melihat file csproj untuk mencari tahu bagaimana membuat konfigurasi itu terjadi.
Multi-penargetan target yang lebih esoterik tanpa Moniker :
Microsoft:
Jika Anda ingin menargetkan Profil Portabel itu tidak memiliki ditentukan sebelumnya moniker sehingga Profiles portabel juga tidak bisa mengambil kesimpulan
TargetFrameworkIdentifier
,TargetFrameworkVersion
danTargetFrameworkProfile
. Juga konstanta kompilator tidak didefinisikan secara otomatis. Akhirnya Anda harus menambahkan semua referensi assembly tidak ada yang disediakan secara default.Contoh di bawah ini diambil dari proyek yang menggunakan
dynamic
kata kunci sehingga diperlukan tambahanMicrosoft.CSharp
assembly, sehingga Anda dapat melihat bagaimana referensi untuk target yang berbeda.<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>
sumber
Anda dapat secara manual mengedit
.csproj
file untuk ini dan mengatur propertiTargetFrameworks
(bukanTargetFramework
).<TargetFrameworks>net451;netstandard1.4</TargetFrameworks>
Misalnya lihat
EFCore.csproj
: https://github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9b3ec6645e47c825fa842a/src/EFCore/EFCore.csprojsumber
Itu bukan template proyek yang Anda inginkan jika perpustakaan Anda perlu bekerja pada beberapa target platform. Dengan template proyek ini, pustaka Anda hanya dapat digunakan dalam proyek yang menargetkan .NETCore. Pendekatan perpustakaan PCL dihentikan, Anda sekarang harus memilih .NETStandard.
Anda melakukannya dengan memulai proyek dengan template proyek "Perpustakaan Kelas (.NET Standard)". Anda sekarang memiliki opsi untuk memilih versi .NETStandard. Kisi kompatibilitas saat ini ada di sini .
Mudah-mudahan mereka akan terus memperbarui artikel tertaut itu. Ini berubah, .NETStandard 2.0 telah dipaku tetapi belum dikirimkan. Ditargetkan untuk Q2 tahun 2017, mungkin akhir musim semi, saat ini menunjukkan 97% selesai. Saya tidak sengaja mendengar desainer mengatakan bahwa menggunakan 1.5 atau 1.6 tidak disarankan, tidak cukup kompatibel dengan 2.0
sumber
project.json
Anda dapat menentukan dependensi khusus untuk kerangka target.Saya melakukan panduan pemula untuk kerangka kerja multi-penargetan dan netcore yang dimulai dengan perbaikan 1 baris sederhana dan kemudian memandu Anda melalui setiap komplikasi.
Pendekatan paling sederhana adalah mendapatkan target netcore atau netstandard pertama kali. Kemudian edit file csproj dan lakukan langkah-langkah berikut untuk target lainnya.
<Reference />s
untuk System. * Dll untuk target netframework hanya dengan membaca pesan kesalahan build yang hilang.<PackageReference />s
tidak sama untuk setiap target. Trik termudah adalah untuk sementara kembali ke penargetan tunggal sehingga GUI akan menangani referensi Nuget dengan benar untuk Anda.sumber