Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk bemutatja, hogyan írhat kódtárakat a .NET-hez a .NET parancssori felület használatával. A parancssori felület hatékony és alacsony szintű élményt nyújt, amely minden támogatott operációs rendszeren működik. Továbbra is létrehozhat kódtárakat a Visual Studióval, és ha ez az előnyben részesített élmény, tekintse meg a Visual Studio útmutatóját.
Prerequisites
A számítógépen telepítve kell lennie a .NET SDK-nak .
A .NET-keretrendszer verzióival foglalkozó dokumentum szakaszaihoz telepítenie kell a .NET-keretrendszert egy Windows-gépen.
Továbbá, ha támogatni szeretné a régebbi .NET-keretrendszer-célokat, telepítenie kell a célcsomagokat vagy a fejlesztői csomagokat a .NET-keretrendszer letöltési oldaláról. Tekintse meg ezt a táblázatot:
| .NET-keretrendszer verziója | Mit kell letölteni? |
|---|---|
| 4.6.1 | .NET Framework 4.6.1 Célcsomag |
| 4.6 | .NET-keretrendszer 4.6-os célcsomag |
| 4.5.2 | .NET-keretrendszer 4.5.2 fejlesztői csomag |
| 4.5.1 | .NET-keretrendszer 4.5.1 fejlesztői csomag |
| 4.5 | Windows Szoftverfejlesztő Készlet Windows 8-hoz |
| 4.0 | Windows SDK For Windows 7 és .NET Framework 4 |
| 2.0, 3.0 és 3.5 | .NET Framework 3.5 SP1 Futtatókörnyezet (vagy Windows 8+ verzió) |
A .NET 5+ vagy a .NET Standard megcélzása
A projekt cél-keretrendszerét úgy szabályozhatja, hogy hozzáadja azt a projektfájlhoz (.csproj vagy .fsproj). A .NET 5+ vagy a .NET Standard célzása közötti választásról a .NET 5+ és a .NET Standard című témakörben talál útmutatást.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
</Project>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
Ha a .NET-keretrendszer 4.0-s vagy régebbi verzióit szeretné megcélozni, vagy a .NET-keretrendszerben elérhető API-t szeretne használni, de nem a .NET Standardban (például System.Drawing), olvassa el a következő szakaszokat és tanulja meg a multitargetezést.
A .NET-keretrendszer megcélzása
Note
Ezek az utasítások feltételezik, hogy a .NET-keretrendszer telepítve van a gépen. Tekintse meg a függőségek telepítésének előfeltételeit .
Ne feledje, hogy az itt használt .NET-keretrendszer egyes verziói már nem támogatottak. Tekintse meg a .NET-keretrendszer támogatási életciklus-szabályzatával kapcsolatos gyakori kérdéseket a nem támogatott verziókról.
Ha a fejlesztők és projektek maximális számát szeretné elérni, használja a .NET-keretrendszer 4.0-s verziójának alapkonfigurációját. A .NET-keretrendszer célként való megcélzásához használja a megfelelő Target Framework Moniker (TFM) eszközt, amely megfelel a támogatni kívánt .NET-keretrendszer-verziónak.
| .NET-keretrendszer verziója | TFM |
|---|---|
| .NET-keretrendszer 2.0 | net20 |
| .NET-keretrendszer 3.0 | net30 |
| .NET-keretrendszer 3.5 | net35 |
| .NET-keretrendszer 4.0 | net40 |
| .NET-keretrendszer 4.5 | net45 |
| .NET-keretrendszer 4.5.1 | net451 |
| .NET-keretrendszer 4.5.2 | net452 |
| .NET-keretrendszer 4.6 | net46 |
| .NET-keretrendszer 4.6.1 | net461 |
| .NET-keretrendszer 4.6.2 | net462 |
| .NET-keretrendszer 4.7 | net47 |
| .NET-keretrendszer 4.8 | net48 |
Ezután szúrja be ezt a TFM-et a TargetFramework projektfájl szakaszába. Például a következőképpen írna egy .NET-keretrendszer 4.0-s verziója számára készült kódtárat:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net40</TargetFramework>
</PropertyGroup>
</Project>
És ennyi! Bár ez csak a .NET Framework 4-hez készült, a .NET-keretrendszer újabb verzióiban is használhatja a kódtárat.
Hogyan vegyünk célba több célt
Note
Az alábbi utasítások feltételezik, hogy a .NET-keretrendszer telepítve van a gépen. Az Előfeltételek szakaszban megtudhatja , hogy mely függőségeket kell telepítenie, és honnan kell letöltenie őket.
Előfordulhat, hogy meg kell céloznia a .NET-keretrendszer régebbi verzióit, ha a projekt támogatja a .NET-keretrendszert és a .NET-t is. Ebben a forgatókönyvben, ha újabb API-kat és nyelvi szerkezeteket szeretne használni az újabb célokhoz, használjon #if irányelveket a kódban. Előfordulhat, hogy az egyes célplatformokhoz különböző csomagokat és függőségeket kell hozzáadnia, hogy az egyes esetekhez szükséges különböző API-kat is tartalmazza.
Tegyük fel például, hogy van egy kódtára, amely HTTP-en keresztül végez hálózati műveleteket. A .NET Standard és a .NET-keretrendszer 4.5-ös vagy újabb verzióihoz használhatja az osztályt HttpClient a System.Net.Http névtérből. A .NET-keretrendszer korábbi verziói azonban nem rendelkeznek az HttpClient osztállyal, ezért a WebClient névtérből a System.Net osztályt használhatja helyettük.
A projektfájl így nézhet ki:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net40;net45</TargetFrameworks>
</PropertyGroup>
<!-- Need to conditionally bring in references for the .NET Framework 4.0 target -->
<ItemGroup Condition="'$(TargetFramework)' == 'net40'">
<Reference Include="System.Net" />
</ItemGroup>
<!-- Need to conditionally bring in references for the .NET Framework 4.5 target -->
<ItemGroup Condition="'$(TargetFramework)' == 'net45'">
<Reference Include="System.Net.Http" />
<Reference Include="System.Threading.Tasks" />
</ItemGroup>
</Project>
Itt három fő változást fog látni:
- A
TargetFrameworkcsomópont cserélve lettTargetFrameworks-re, és három TFM van jelen belül. - Van egy
<ItemGroup>csomópont anet40cél lekéréséhez egy .NET-keretrendszer-referenciában. - A célhoz tartozó
<ItemGroup>csomópont létezik, amely beépít két .NET-keretrendszer-hivatkozást.
Előfeldolgozó szimbólumok
A buildrendszer ismeri a következő, irányelvekben #if használt előprocesszorjeleket:
| Cél-keretrendszerek | Symbols | További szimbólumok (.NET 5+ SDK-kban érhető el) |
Platformszimbólumok (csak operációsrendszer-specifikus TFM megadásakor) |
|---|---|---|---|
| .NET-keretrendszer |
NETFRAMEWORK, NET481, NET48, NET472, NET471, NET47NET462, NET461, NET46, NET452, NET451, NET45, , NET40, , , NET35NET20 |
NET48_OR_GREATER, NET472_OR_GREATER, NET471_OR_GREATER, NET47_OR_GREATER, NET462_OR_GREATERNET461_OR_GREATER, NET46_OR_GREATER, NET452_OR_GREATER, NET451_OR_GREATER, NET45_OR_GREATER, NET40_OR_GREATER, , , NET35_OR_GREATERNET20_OR_GREATER |
|
| .NET Standard |
NETSTANDARD, NETSTANDARD2_1, NETSTANDARD2_0, NETSTANDARD1_6, NETSTANDARD1_5NETSTANDARD1_4, NETSTANDARD1_3, NETSTANDARD1_2, , NETSTANDARD1_1NETSTANDARD1_0 |
NETSTANDARD2_1_OR_GREATER, NETSTANDARD2_0_OR_GREATER, NETSTANDARD1_6_OR_GREATER, NETSTANDARD1_5_OR_GREATERNETSTANDARD1_4_OR_GREATER, NETSTANDARD1_3_OR_GREATER, NETSTANDARD1_2_OR_GREATER, , NETSTANDARD1_1_OR_GREATERNETSTANDARD1_0_OR_GREATER |
|
| .NET 5+ (és .NET Core) |
NET, NET10_0, NET9_0, NET8_0, NET7_0, NET6_0NET5_0, NETCOREAPP, NETCOREAPP3_1, NETCOREAPP3_0, NETCOREAPP2_2, NETCOREAPP2_1, , NETCOREAPP2_0, , , NETCOREAPP1_1NETCOREAPP1_0 |
NET10_0_OR_GREATER, NET9_0_OR_GREATER, NET8_0_OR_GREATER, NET7_0_OR_GREATER, NET6_0_OR_GREATERNET5_0_OR_GREATER, NETCOREAPP3_1_OR_GREATER, NETCOREAPP3_0_OR_GREATER, NETCOREAPP2_2_OR_GREATER, NETCOREAPP2_1_OR_GREATER, NETCOREAPP2_0_OR_GREATER, , , NETCOREAPP1_1_OR_GREATERNETCOREAPP1_0_OR_GREATER |
ANDROID, BROWSER, IOS, MACCATALYSTMACOS, TVOS, WINDOWS[OS][version] (például IOS15_1),[OS][version]_OR_GREATER (például IOS15_1_OR_GREATER) |
Note
- A verzió nélküli szimbólumok a megcélzott verziótól függetlenül vannak definiálva.
- A verzióspecifikus szimbólumok csak a megcélzott verzióhoz vannak definiálva.
- A
<framework>_OR_GREATERszimbólumok a megcélzott verzióhoz és az összes korábbi verzióhoz vannak definiálva. Ha például a 2.0-s .NET-keretrendszer céloz meg, a következő szimbólumok vannak definiálva:NET20,NET20_OR_GREATER,NET11_OR_GREATERésNET10_OR_GREATER. - A
NETSTANDARD<x>_<y>_OR_GREATERszimbólumok csak a .NET Standard célokhoz vannak definiálva, a .NET Standardot implementáló célokhoz nem, például a .NET Core-hoz és a .NET-keretrendszer. - Ezek eltérnek az MSBuild
TargetFrameworktulajdonság és a NuGet által használt célkeret-monikerektől (TFM-ek).
Íme egy példa a célonkénti feltételes fordítás használatára:
using System;
using System.Text.RegularExpressions;
#if NET40
// This only compiles for the .NET Framework 4 targets
using System.Net;
#else
// This compiles for all other targets
using System.Net.Http;
using System.Threading.Tasks;
#endif
namespace MultitargetLib
{
public class Library
{
#if NET40
private readonly WebClient _client = new WebClient();
private readonly object _locker = new object();
#else
private readonly HttpClient _client = new HttpClient();
#endif
#if NET40
// .NET Framework 4.0 does not have async/await
public string GetDotNetCount()
{
string url = "https://www.dotnetfoundation.org/";
var uri = new Uri(url);
string result = "";
// Lock here to provide thread-safety.
lock(_locker)
{
result = _client.DownloadString(uri);
}
int dotNetCount = Regex.Matches(result, ".NET").Count;
return $"Dotnet Foundation mentions .NET {dotNetCount} times!";
}
#else
// .NET Framework 4.5+ can use async/await!
public async Task<string> GetDotNetCountAsync()
{
string url = "https://www.dotnetfoundation.org/";
// HttpClient is thread-safe, so no need to explicitly lock here
var result = await _client.GetStringAsync(url);
int dotNetCount = Regex.Matches(result, ".NET").Count;
return $"dotnetfoundation.org mentions .NET {dotNetCount} times in its HTML!";
}
#endif
}
}
Ha ezzel a projekttel dotnet buildkészíti el a projektet, három könyvtárat fog látni a bin/ mappában:
net40/
net45/
netstandard2.0/
Ezek mindegyike az .dll fájlokat tartalmazza minden egyes célhoz.
Kódtárak tesztelése a .NET-en
Fontos, hogy több platformon is tesztelhető legyen. A dobozon kívül xUnit vagy MSTest is használható. Mindkettő tökéletesen alkalmas a könyvtár .NET-en való tesztelésére. A megoldás tesztelési projektekhez való beállítása a megoldás szerkezetétől függ. Az alábbi példa feltételezi, hogy a teszt- és forráskönyvtárak ugyanabban a legfelső szintű könyvtárban élnek.
Note
Ez néhány .NET CLI-parancsot használ. További információkért lásd: dotnet new és dotnet sln.
Állítsa be a megoldást. Ezt a következő parancsokkal teheti meg:
mkdir SolutionWithSrcAndTest cd SolutionWithSrcAndTest dotnet new sln dotnet new classlib -o MyProject dotnet new xunit -o MyProject.Test dotnet sln add MyProject/MyProject.csproj dotnet sln add MyProject.Test/MyProject.Test.csprojEz projekteket hoz létre, és összekapcsolja őket egy megoldásban. Az Ön
SolutionWithSrcAndTestkönyvtára így kell kinézzen:/SolutionWithSrcAndTest |__SolutionWithSrcAndTest.sln |__MyProject/ |__MyProject.Test/Keresse meg a tesztprojekt könyvtárát, és adjon hozzá egy hivatkozást a
MyProject.TestforrásbólMyProject.cd MyProject.Test dotnet reference add ../MyProject/MyProject.csprojCsomagok visszaállítása és projektek létrehozása:
dotnet restore dotnet buildEllenőrizze, hogy az xUnit fut-e a
dotnet testparancs végrehajtásával. Ha az MSTest használatát választotta, akkor az MSTest-konzol futójának kell futnia.
És ennyi! Mostantól parancssori eszközökkel tesztelheti a tárat az összes platformon. Ha most szeretné folytatni a tesztelést, hogy minden be van állítva, a kódtár tesztelése nagyon egyszerű:
- Módosítsa a könyvtárát.
- Futtassa a teszteket a tesztkönyvtárban a parancssorból a
dotnet testparanccsal.
A parancs meghívásakor dotnet test a kód automatikusan újraépül.
Több projekt használata
A nagyobb kódtárak esetében gyakori igény a funkciók különböző projektekben való elhelyezése.
Képzelje el, hogy olyan könyvtárat szeretne létrehozni, amely idiomatikus C# és F# nyelven használható. Ez azt jelentené, hogy a könyvtár felhasználói olyan módon használják, amely természetes a C# vagy az F# számára. A C#-ban például a következő módon használhatja a kódtárat:
using AwesomeLibrary.CSharp;
public Task DoThings(Data data)
{
var convertResult = await AwesomeLibrary.ConvertAsync(data);
var result = AwesomeLibrary.Process(convertResult);
// do something with result
}
Az F#-ban a következőhöz hasonló lehet:
open AwesomeLibrary.FSharp
let doWork data = async {
let! result = AwesomeLibrary.AsyncConvert data // Uses an F# async function rather than C# async method
// do something with result
}
Az ilyen használati forgatókönyvek azt jelentik, hogy a hozzáférés alatt álló API-knak más struktúrával kell rendelkezniük a C# és az F# esetében. Ennek egyik gyakori módszere, ha egy könyvtár összes logikáját egy alapprojektbe integrálja, a C# és az F# projektek hozzák létre az API szinteket, amelyek hívják az alapprojektet. A szakasz többi része a következő neveket használja:
- AwesomeLibrary.Core – Egy alapvető projekt, amely a kódtár összes logikáját tartalmazza
- AwesomeLibrary.CSharp – Nyilvános API-kat tartalmazó projekt, amelyet C-ben való fogyasztásra szánnak#
- AwesomeLibrary.FSharp – Nyilvános API-kat tartalmazó projekt F nyelven való használatra#
Az alábbi parancsokat futtathatja a terminálon, hogy ugyanazt a struktúrát hozza létre, mint az útmutató:
mkdir AwesomeLibrary && cd AwesomeLibrary
dotnet new sln
mkdir AwesomeLibrary.Core && cd AwesomeLibrary.Core && dotnet new classlib
cd ..
mkdir AwesomeLibrary.CSharp && cd AwesomeLibrary.CSharp && dotnet new classlib
cd ..
mkdir AwesomeLibrary.FSharp && cd AwesomeLibrary.FSharp && dotnet new classlib -lang "F#"
cd ..
dotnet sln add AwesomeLibrary.Core/AwesomeLibrary.Core.csproj
dotnet sln add AwesomeLibrary.CSharp/AwesomeLibrary.CSharp.csproj
dotnet sln add AwesomeLibrary.FSharp/AwesomeLibrary.FSharp.fsproj
Ezzel hozzáadja a fenti három projektet és egy olyan megoldásfájlt, amely összekapcsolja őket. A megoldásfájl létrehozása és a projektek összekapcsolása lehetővé teszi a projektek legfelső szintű visszaállítását és létrehozását.
Projektközi hivatkozás
A projektekre a legjobban úgy hivatkozhat, ha a .NET CLI használatával ad hozzá egy projekthivatkozást. Az AwesomeLibrary.CSharp és az AwesomeLibrary.FSharp projektkönyvtárakban a következő parancsot futtathatja:
dotnet reference add ../AwesomeLibrary.Core/AwesomeLibrary.Core.csproj
A AwesomeLibrary.CSharp és az AwesomeLibrary.FSharp projektfájljai mostantól az AwesomeLibrary.Core-ra fognak hivatkozni célként ProjectReference . Ezt úgy ellenőrizheti, hogy megvizsgálja a projektfájlokat, és az alábbiakat látja bennük:
<ItemGroup>
<ProjectReference Include="..\AwesomeLibrary.Core\AwesomeLibrary.Core.csproj" />
</ItemGroup>
Ezt a szakaszt manuálisan is hozzáadhatja minden projektfájlhoz, ha nem szeretné használni a .NET parancssori felületet.
Megoldás strukturálása
A többprojektes megoldások másik fontos eleme a jó átfogó projektstruktúra kialakítása. Tetszés szerint rendszerezheti a kódot, és amíg az egyes projekteket a megoldásfájlhoz dotnet sln add csatolja, futtathatja dotnet restore és dotnet build a megoldás szintjén.