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 .NET 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. A Visual Studio segítségével továbbra is létrehozhat könyvtárakat, és ha ez az Ön által előnyben részesített élmény, tekintse meg a Visual Studio útmutatót.

Prerequisites

A .NET SDK telepítve kell lennie a gépen.

A dokumentum .NET Framework-verziókkal foglalkozó szakaszaihoz a .NET Framework kell telepítenie egy Windows gépen.

Továbbá, ha támogatni szeretné a régebbi .NET-keretrendszer-célokat, telepítenie kell a célcsomagokat vagy 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-keretrendszer 4.6.1 célzókészlet
4.6 .NET Framework 4.6 Targeting Pack
4.5.2 .NET Framework 4.5.2 fejlesztői csomag
4.5.1 .NET Framework 4.5.1 fejlesztői csomag
4.5 Windows szoftverfejlesztői készlet Windows 8
4.0 Windows SDK Windows 7 és .NET Framework 4-hez
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). .NET 5+ vagy .NET Standard közötti választáshoz útmutatást a következő oldalon talál: .NET 5+ és .NET Standard.

<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 Framework 4.0-s vagy újabb verzióit szeretné megcélzni, vagy .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 ismerje meg a többtarget használatát.

A .NET-keretrendszer megcélzása

Megjegyzés

Ezek az utasítások feltételezik, hogy .NET keretrendszer van telepítve a gépére. 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 Framework 4.0-t alapkonfigurációként. A .NET-keretrendszer megcélzásához először használja a megfelelő Target Framework Moniker (TFM) eszközt, amely megfelel a támogatni kívánt .NET-keretrendszer verziójának.

.NET keretrendszer verziója TFM
.NET Framework 2.0 net20
.NET Framework 3.0 net30
.NET Framework 3.5 net35
.NET Framework 4.0 net40
.NET Framework 4.5 net45
.NET Framework 4.5.1 net451
.NET Framework 4.5.2 net452
.NET Framework 4.6 net46
.NET Framework 4.6.1 net461
.NET Framework 4.6.2 net462
.NET Framework 4.7 net47
.NET Framework 4.8 net48

Ezután szúrja be ezt a TFM-et a TargetFramework projektfájl szakaszába. Az alábbiakban például egy .NET Framework 4.0-t célzó kódtárat írhat:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net40</TargetFramework>
  </PropertyGroup>
</Project>

És ennyi! Bár ez csak .NET Framework 4-hez készült, használhatja a kódtárat a .NET-keretrendszer újabb verzióiban.

Hogyan vegyünk célba több célt

Megjegyzés

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 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 Framework 4.5-ös vagy újabb verzióihoz használhatja a HttpClient osztályt a System.Net.Http névtérből. A .NET-keretrendszer korábbi verziói azonban nem rendelkeznek a HttpClient osztálysal, így a WebClient névtérből használhatja a System.Net osztályt.

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. Létezik egy <ItemGroup> csomópont a net40 célhoz, amely egy .NET Keretrendszer-referenciát von be.
  3. A net45 célhoz tartozik egy <ItemGroup> csomópont, ami két .NET Framework hivatkozást tartalmaz.

Előfeldolgozó szimbólumok

A buildrendszer ismeri a következő, irányelvekben #if használt előprocesszorjeleket:

Cél-keretrendszerek Szimbólumok További szimbólumok
(.NET 5+ SDK-ban érhető el)
Platformszimbólumok (csak elérhetők)
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)

Megjegyzés

  • 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 .NET Framework 2.0-t 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 .NET Standard célokhoz vannak definiálva, nem pedig az .NET Standardot implementáló célokhoz, például a .NET Core-hoz és .NET-keretrendszerhez.
  • 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.

A kódtárak tesztelése a .NET platformon

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árak egységnyi tesztelésére a .NET alatt. 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.

Megjegyzés

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 parancssori felülettel hozzáad 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.