.NET CLı ile Kitaplıklar geliştirme
Bu makalede .NET CLı kullanılarak .NET için kitaplıkların nasıl yazılacağı ele alınmaktadır. CLı, desteklenen tüm işletim sistemlerinde çalışacak etkili ve düşük düzeyde bir deneyim sağlar. Visual Studio ile kitaplıkları oluşturmaya devam edebilirsiniz ve tercih ettiğiniz deneyim Visual Studio kılavuzuna başvurur.
Önkoşullar
Makinenizde .NET SDK 'nın yüklü olması gerekir.
bu belgenin .NET Framework sürümleriyle ilgili bölümlerinde, .NET Framework Windows bir makineye yüklenmesi gerekir.
ayrıca, eski .NET Framework hedeflerini desteklemek istiyorsanız, .NET Framework indirmeleri sayfasındanhedefleme paketlerini veya geliştirici paketlerini yüklemeniz gerekir. Bu tabloya başvurun:
| .NET Framework sürümü | İndirileceği |
|---|---|
| 4.6.1 | .NET Framework 4.6.1 hedefleme paketi |
| 4,6 | .NET Framework 4,6 hedefleme paketi |
| 4.5.2 | .NET Framework 4.5.2 geliştirici paketi |
| 4.5.1 | .NET Framework 4.5.1 geliştirici paketi |
| 4,5 | Windows 8 için Windows Yazılım Geliştirme Seti |
| 4.0 | Windows 7 ve .NET Framework 4 için Windows SDK |
| 2,0, 3,0 ve 3,5 | .NET Framework 3,5 SP1 çalışma zamanı (veya Windows 8 + sürüm) |
.NET 5 + veya .NET Standard nasıl hedeflenecek
Projenizin hedef çerçevesini proje dosyanıza (. csproj veya . fsproj) ekleyerek kontrol edersiniz. .NET 5 + veya .NET Standard hedefleme arasında nasıl seçim yapılacağı hakkında yönergeler için bkz. .NET 5 + ve .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>
.NET Framework sürümleri 4,0 veya sonraki bir sürümü hedeflemek istiyorsanız veya .NET Framework ' de kullanılabilir ancak .NET Standard (örneğin,) bir apı kullanmak istiyorsanız, System.Drawing aşağıdaki bölümleri okuyun ve çoklu hedef hakkında bilgi edinin.
Nasıl hedeflenecek .NET Framework
Not
bu yönergeler makinenizde .NET Framework yüklü olduğunu varsayar. Bağımlılıkları yüklemek için önkoşulları inceleyin.
burada kullanılan .NET Framework sürümlerinden bazılarının artık desteklenmediğini aklınızda bulundurun. desteklenmeyen sürümler hakkında sss .NET Framework destek yaşam döngüsü ilkesi hakkında sss bölümüne bakın.
en fazla geliştirici ve proje sayısına ulaşmak isterseniz, taban çizgisi hedefi olarak .NET Framework 4,0 kullanın. .NET Framework hedeflemek için, desteklemek istediğiniz .NET Framework sürümüne karşılık gelen doğru hedef Framework bilinen adını (tfd) kullanarak başlayın.
| .NET Framework sürümü | 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 |
Daha sonra bu tfd 'yi TargetFramework proje dosyanızın bölümüne eklersiniz. örneğin, .NET Framework 4,0 ' i hedefleyen bir kitaplığı nasıl yazacağınız aşağıda verilmiştir:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net40</TargetFramework>
</PropertyGroup>
</Project>
Hepsi bu! bu yalnızca .NET Framework 4 için derlense de, kitaplığı .NET Framework daha yeni sürümlerinde kullanabilirsiniz.
Çoklu hedef
Not
aşağıdaki yönergelerde .NET Framework makinenizde yüklü olduğunu varsaymaktadır. Yüklemeniz gereken bağımlılıkları ve bunların nereden indirileceği hakkında bilgi edinmek için Önkoşullar bölümüne bakın.
projeniz hem .NET Framework hem de .net ' i desteklediğinde, .NET Framework eski sürümlerini hedefleyebilirsiniz. Bu senaryoda, daha yeni hedefler için daha yeni API 'Ler ve dil yapıları kullanmak istiyorsanız, #if kodunuzda yönergeleri kullanın. Ayrıca, hedeflediğiniz her platform için, her bir durum için gereken farklı API 'Leri dahil etmek için farklı paketler ve bağımlılıklar eklemeniz gerekebilir.
Örneğin, HTTP üzerinden ağ işlemleri gerçekleştiren bir kitaplığınız olduğunu varsayalım. .NET Standard ve .NET Framework sürümleri 4,5 veya üzeri için, HttpClient ad alanından sınıfını kullanabilirsiniz System.Net.Http . ancak, .NET Framework önceki sürümleri sınıfına sahip değildir HttpClient , WebClient bu nedenle System.Net bunun yerine ad alanından sınıfını kullanabilirsiniz.
Proje dosyanız şuna benzeyebilir:
<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>
Burada üç önemli değişiklik fark edeceksiniz:
TargetFrameworkDüğüm ile değiştirilmiştirTargetFrameworksve üç tfms içinde belirtilir.<ItemGroup>net40bir .NET Framework başvurusunda hedef çekme için bir düğüm vardır.<ItemGroup>net45iki .NET Framework başvuru halinde hedef çekme için bir düğüm vardır.
Yapı sistemi, yönergelerden kullanılan aşağıdaki Önişlemci simgelerinden haberdar olur #if :
| Hedef Çerçeveler | Simgeleri | .NET 5 + SDK 'da kullanılabilen ek simgeler |
|---|---|---|
| .NET Framework | NETFRAMEWORK, NET48, NET472, NET471, NET47, NET462, NET461, NET46, NET452, NET451, NET45, NET40, NET35, NET20 |
NET48_OR_GREATER, NET472_OR_GREATER, NET471_OR_GREATER, NET47_OR_GREATER, NET462_OR_GREATER, NET461_OR_GREATER, NET46_OR_GREATER, NET452_OR_GREATER, NET451_OR_GREATER, NET45_OR_GREATER, NET40_OR_GREATER, NET35_OR_GREATER, NET20_OR_GREATER |
| .NET Standard | NETSTANDARD, NETSTANDARD2_1, NETSTANDARD2_0, NETSTANDARD1_6, NETSTANDARD1_5, NETSTANDARD1_4, NETSTANDARD1_3, NETSTANDARD1_2, NETSTANDARD1_1, NETSTANDARD1_0 |
NETSTANDARD2_1_OR_GREATER, NETSTANDARD2_0_OR_GREATER, NETSTANDARD1_6_OR_GREATER, NETSTANDARD1_5_OR_GREATER, NETSTANDARD1_4_OR_GREATER, NETSTANDARD1_3_OR_GREATER, NETSTANDARD1_2_OR_GREATER, NETSTANDARD1_1_OR_GREATER, NETSTANDARD1_0_OR_GREATER |
| .NET 5 + (ve .NET Core) | NET, NET6_0, NET6_0_ANDROID, NET6_0_IOS, NET6_0_MACOS, NET6_0_MACCATALYST, NET6_0_TVOS, NET6_0_WINDOWS, NET5_0, NETCOREAPP, NETCOREAPP3_1, NETCOREAPP3_0, NETCOREAPP2_2, NETCOREAPP2_1, NETCOREAPP2_0, NETCOREAPP1_1, NETCOREAPP1_0 |
NET6_0_OR_GREATER, NET6_0_ANDROID_OR_GREATER, NET6_0_IOS_OR_GREATER, NET6_0_MACOS_OR_GREATER, NET6_0_MACCATALYST_OR_GREATER, NET6_0_TVOS_OR_GREATER, NET6_0_WINDOWS_OR_GREATER, NET5_0_OR_GREATER, NETCOREAPP_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_GREATER, NETCOREAPP1_0_OR_GREATER |
Not
- Versionless sembolleri, hedeflediğiniz sürümden bağımsız olarak tanımlanmıştır.
- Sürüme özgü semboller yalnızca hedeflediğiniz sürüm için tanımlanmıştır.
<framework>_OR_GREATERSemboller, hedeflediğiniz sürüm ve önceki tüm sürümler için tanımlanır. örneğin, .NET Framework 2,0 ' i hedefliyorsanız, aşağıdaki semboller tanımlanmıştır:NET_2_0,NET_2_0_OR_GREATER,NET_1_1_OR_GREATERveNET_1_0_OR_GREATER.
Hedefe göre koşullu derleme kullanan bir örnek aşağıda verilmiştir:
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
}
}
Bu projeyi ile oluşturursanız dotnet build , klasörün altında üç dizin olduğunu fark edeceksiniz bin/ :
net40/
net45/
netstandard2.0/
Bunların her biri, .dll her bir hedef için dosyaları içerir.
.NET üzerinde kitaplıkları test etme
Platformlar arasında test etmek önemlidir. Kutusundan xUnit veya mstest kullanabilirsiniz. Her ikisi de kitaplığınızı .NET 'teki birim testi için uygun şekilde uygundur. Çözümünüzü Test projeleri ile nasıl ayarlayacağınıza çözümünüzün yapısınagöre değişiklik gösterir. Aşağıdaki örnek, test ve kaynak dizinlerinin aynı en üst düzey dizinde canlı olduğunu varsayar.
Not
Bu bazı .net CLI komutlarını kullanır. Daha fazla bilgi için bkz. DotNet New ve DotNet sln .
Çözümünüzü ayarlayın. Bunu aşağıdaki komutlarla yapabilirsiniz:
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.csprojBu, projeler oluşturur ve bunları bir çözümde birbirine bağlar. Dizininiz şuna
SolutionWithSrcAndTestbenzemelidir:/SolutionWithSrcAndTest |__SolutionWithSrcAndTest.sln |__MyProject/ |__MyProject.Test/Test projesinin dizinine gidin ve öğesinden öğesine bir başvuru ekleyin
MyProject.TestMyProject.cd MyProject.Test dotnet add reference ../MyProject/MyProject.csprojPaketleri geri yükle ve projeleri oluştur:
dotnet restore dotnet buildKomutunu yürüterek xUnit 'in çalıştığını doğrulayın
dotnet test. MSTest kullanmayı seçerseniz, bunun yerine MSTest konsol Çalıştırıcısı çalıştırılmalıdır.
Hepsi bu! Artık, komut satırı araçlarını kullanarak kitaplığınızı tüm platformlarda test edebilirsiniz. Artık her şeyi ayarlamış olduğunuza göre teste devam etmek için, kitaplığınızı test etmek çok basittir:
- Kitaplığınızda değişiklik yapın.
- Testleri komut satırından, test dizininizde,
dotnet testkomutuyla çalıştırın.
Komut çağırdığınızda kodunuz otomatik olarak yeniden oluşturulur dotnet test .
Birden çok proje kullanma
Daha büyük kitaplıkların yaygın olması, işlevselliği farklı projelere yerleştirbir yerdir.
Imagine, tek bir C# ve F # içinde tüketilen bir kitaplık oluşturmak istiyorsunuz. Bu, kitaplığınızı tüketenlerin bunu C# veya F# ile doğal bir şekilde tükettiği anlamına geliyor. Örneğin, C# içinde kitaplığı şu şekilde tüketebilirsiniz:
using AwesomeLibrary.CSharp;
public Task DoThings(Data data)
{
var convertResult = await AwesomeLibrary.ConvertAsync(data);
var result = AwesomeLibrary.Process(convertResult);
// do something with result
}
F# içinde şu şekilde olabilir:
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
}
Bunun gibi tüketim senaryoları, erişilen API'lerin C# ve F# için farklı bir yapıya sahip olması anlamına geliyor. Bunu gerçekleştirmeye yönelik yaygın bir yaklaşım, bir kitaplığın tüm mantığını, C# ve F# projeleriyle bu çekirdek projeye çağrıyı çağıran API katmanlarını tanımlayan çekirdek proje olarak çarpanlaraktır. Bölümün geri kalanı aşağıdaki adları kullanır:
- AwesomeLibrary.Core - Kitaplığın tüm mantığını içeren temel bir proje
- AwesomeLibrary.CSharp - C'de tüketime yönelik genel API'lere sahip bir proje #
- AwesomeLibrary.FSharp - F'de tüketime yönelik genel API'lere sahip bir proje #
Bu kılavuzla aynı yapıyı üretmek için terminalde aşağıdaki komutları çalıştırabilirsiniz:
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
Bu, yukarıdaki üç proje ve bunları bir araya alan bir çözüm dosyası ekler. Çözüm dosyası oluşturma ve projeleri bağlama, projeleri en üst düzeyden geri yüklemenizi ve derlemenizi sağlar.
Project projeden projeye başvuru
Bir projeye başvuru göndermenin en iyi yolu, proje başvurusu eklemek için .NET CLI kullanmaktır. AwesomeLibrary.CSharp ve AwesomeLibrary.FSharp proje dizinlerinden aşağıdaki komutu çalıştırabilirsiniz:
dotnet add reference ../AwesomeLibrary.Core/AwesomeLibrary.Core.csproj
Hem AwesomeLibrary.CSharp hem de AwesomeLibrary.FSharp proje dosyaları artık hedef olarak AwesomeLibrary.Core'a ProjectReference başvuracak. Proje dosyalarını inceler ve bunlarda aşağıdakileri görerek bunu doğrularsiniz:
<ItemGroup>
<ProjectReference Include="..\AwesomeLibrary.Core\AwesomeLibrary.Core.csproj" />
</ItemGroup>
.NET CLI kullanmamayı tercih ediyorsanız bu bölümü her proje dosyasına el ile ekleyebilirsiniz.
Çözümü yapılandırma
Çok projeli çözümlerin bir diğer önemli yönü de iyi bir genel proje yapısı kurmaktır. Kodu istediğiniz gibi düzenleyebilirsiniz ve her projeyi ile çözüm dosyanıza bağlarsanız ve çözüm dotnet sln add düzeyinde dotnet restore dotnet build çalıştırabilirsiniz.