Megosztás a következőn keresztül:


Kódtárak fejlesztése a .NET parancssori felülettel

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:

  1. A TargetFramework csomópont cserélve lett TargetFrameworks-re, és három TFM van jelen belül.
  2. Van egy <ItemGroup> csomópont a net40 cél lekéréséhez egy .NET-keretrendszer-referenciában.
  3. 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_GREATER szimbó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és NET10_OR_GREATER.
  • A NETSTANDARD<x>_<y>_OR_GREATER szimbó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 TargetFramework tulajdonsá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.

  1. Á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.csproj
    

    Ez projekteket hoz létre, és összekapcsolja őket egy megoldásban. Az Ön SolutionWithSrcAndTest könyvtára így kell kinézzen:

    /SolutionWithSrcAndTest
    |__SolutionWithSrcAndTest.sln
    |__MyProject/
    |__MyProject.Test/
    
  2. Keresse meg a tesztprojekt könyvtárát, és adjon hozzá egy hivatkozást a MyProject.Test forrásból MyProject.

    cd MyProject.Test
    dotnet reference add ../MyProject/MyProject.csproj
    
  3. Csomagok visszaállítása és projektek létrehozása:

    dotnet restore
    dotnet build
    
  4. Ellenőrizze, hogy az xUnit fut-e a dotnet test parancs 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ű:

  1. Módosítsa a könyvtárát.
  2. Futtassa a teszteket a tesztkönyvtárban a parancssorból a dotnet test paranccsal.

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.