Gdy .NET Core nadal używa tego project.json
formatu, można zbudować bibliotekę klas dla wielu platform (np. Net451, netcoreapp1.0).
Teraz, gdy oficjalny format projektu csproj
korzysta z programu MSBuild, jak określić wiele platform docelowych? Staram się spojrzeć na to od ustawień projektu w VS2017, ale jestem w stanie kierować tylko pojedynczą ramy z ram .NET rdzenia (nawet nie notować inne pełne wersje .NET Framework które nie zostały zainstalowane) :
Odpowiedzi:
Musisz ręcznie edytować plik projektu i dodać s do domyślnego TargetFramework i zasadniczo zmienić go na TargetFrameworks . Następnie wspominasz o Monikerze z ; separator.
Możesz również umieścić odwołania do pakietów Nuget w warunkowej ItemGroup ręcznie lub za pomocą Menedżera pakietów VS Nuget.
Oto jak powinien wyglądać plik .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>
Innym obejściem, które robię w dzisiejszych czasach z powodu brakującej dokumentacji, jest utworzenie projektu w VS2015 i utworzenie pliku project.json przy użyciu dostępnej dokumentacji i funkcji Intellisense, a następnie otwarcie rozwiązania w VS2017 i skorzystanie z wbudowanej aktualizacji. Następnie przyjrzę się plikowi csproj, aby dowiedzieć się, jak wykonać tę konfigurację.
Wielokrotne kierowanie na bardziej ezoteryczne cele bez monikera :
Microsoft:
Jeśli chcesz kierować Portable profilu nie ma predefiniowany przydomek też nie można wywnioskować więc przenośne profili
TargetFrameworkIdentifier
,TargetFrameworkVersion
orazTargetFrameworkProfile
. Również stała kompilatora nie jest definiowana automatycznie. Na koniec musisz dodać wszystkie odwołania do zestawów, żadne nie są domyślnie dostarczane.Poniższy przykład pochodzi z projektu, w którym użyto
dynamic
słowa kluczowego, więc dodatkowo potrzebowałMicrosoft.CSharp
zestawu, dzięki czemu można zobaczyć, jak to odwołania do różnych celów.<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>
źródło
Możesz ręcznie edytować
.csproj
plik dla tego i ustawićTargetFrameworks
(nieTargetFramework
) właściwość.<TargetFrameworks>net451;netstandard1.4</TargetFrameworks>
Na przykład patrz
EFCore.csproj
: https://github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9b3ec6645e47c825fa842a/src/EFCore/EFCore.csprojźródło
To nie jest szablon projektu, którego potrzebujesz, jeśli Twoja biblioteka musi działać na wielu platformach docelowych. Dzięki temu szablonowi projektu Twoja biblioteka może być używana tylko w projekcie, który jest przeznaczony dla .NETCore. Podejście oparte na bibliotece PCL zostało wycofane, teraz musisz wybrać standard .NET.
Robisz to, uruchamiając projekt za pomocą szablonu projektu „Biblioteka klas (.NET Standard)”. Masz teraz możliwość wybrania wersji .NETStandard. Aktualna siatka kompatybilności jest tutaj .
Miejmy nadzieję, że będą aktualizować ten powiązany artykuł. To się zmienia, .NETStandard 2.0 został przybity, ale jeszcze nie jest dostępny. Planowany na drugi kwartał 2017 roku, prawdopodobnie do końca wiosny, obecnie pokazuje, że osiągnięto 97%. Słyszałem, jak projektanci mówili, że używanie 1.5 lub 1.6 nie jest zalecane, nie jest wystarczająco kompatybilne z 2.0
źródło
project.json
że możesz określić konkretne zależności dla docelowego frameworka.Zrobiłem przewodnik dla początkujących na temat struktury sieciowej i netcore z wieloma celami, który zaczyna się od prostej 1-liniowej poprawki, a następnie prowadzi Cię przez każdą z komplikacji.
Najprostszym podejściem jest ustawienie celu netcore lub netstandard działającego jako pierwszy. Następnie edytuj plik csproj i wykonaj te czynności dla innych celów.
<Reference />s
dla System. * Dlls dla dowolnych obiektów docelowych netframework, po prostu odczytując brak informacji o błędach kompilacji.<PackageReference />s
w przypadkach, gdy nie są one takie same dla każdego elementu docelowego. Najłatwiejszą sztuczką jest tymczasowe przywrócenie pojedynczego celu, tak aby GUI poprawnie obsługiwał odwołania do Nuget.źródło