ارائهی NET 5. یا پایان NET Standard.
تا پیش از ارائهی NET 5.، پیاده سازیهای مجزایی از دات نت مانند Full .NET Framework ،.NET Core ،Xamarin و غیره وجود داشتند و دارند. در این حالت برای اینکه بتوان یک class library قابل اجرای بر روی تمام اینها را ارائه داد، نیاز به ارائهی API ای بود که بین تمام آنها به اشتراک گذاشته شود و این دقیقا هدف وجودی NET Standard. است؛ اما ... مشکلات زیر را نیز به همراه دارد:
هر زمانیکه نیاز به افزودن یک API جدید باشد، نیاز خواهد بود تا یک نگارش جدید از NET Standard. ارائه شود. سپس تمام نگارشهای مختلف دات نت باید سعی کنند به صورت مجزایی این API جدید را پیاده سازی کنند. این پروسه بسیار کند است. همچنین همواره باید مراجع مختلف را دقیق بررسی کنید که برای مثال کدام نگارش از دات نت، کدام نگارش از NET Standard. را پیاده سازی کردهاست.
با ارائهی NET 5.، وضعیت کاملا فرق کردهاست. در اینجا یک «کد پایهی اشتراکی» را برای تمام نگارشهای مختلف دات نت داریم و این نگارش میخواهد مخصوص دسکتاپ یا برنامههای موبایل باشد، تفاوتی نمیکند. اکنون که تمام نگارشهای مختلف دات نت بر فراز یک کد اشتراکی پایه کار میکنند، دیگر نیازی به ارائهی مجزای یک API استاندارد و سپس پیاده سازی مجزای دیگری از آن، نیست.
نگارشهای ویژهی NET 5.، مخصوص سکوهای کاری مختلف
همانطور که عنوان شد، NET 5. در اصل یک «مجموعه کد اشتراکی» بین NET Core ،Mono ،Xamarin. و سایر پیاده سازیهای دات نت است. اما سکوهای کاری مختلف، مانند Android، iOS، ویندوز و غیره، به همراه کدهای قابل توجهی که مختص به آن سیستم عاملهای خاص باشند نیز هستند. برای رفع این مشکل، یکسری TFM یا target framework name/Target Framework Moniker ارائه شدهاند. برای مثال net5.0 یکی از آنها است. زمانیکه از این TFM استفاده میکنید، یعنی در حال کار با API ای هستید که در تمام نگارشهای چندسکویی مختلف دات نت، مهیا و قابل استفادهاست. نام جدید «net5.0» جایگزین کنندهی نامهای قدیمی «netcoreapp» و «netstandard» است.
در اینجا اگر نیاز به کار با API مخصوص ویندوز را نیز داشتید، میتوانید از TFM مخصوص آن که net5.0-windows نام دارد استفاده کنید. «net5.0-windows» به این معنا است که به تمام امکانات net5.0 دسترسی دارید؛ به علاوهی API ای که مختص به سیستم عامل ویندوز است (مانند Windows Forms و WPF). در دات نت 6، دو TFM جدید net6.0-android و net6.0-ios را نیز شاهد خواهیم بود.
کار کردن با این اسامی و درک آنها نیز سادهاست. برای مثال net6.0-ios به این معنا است که این قطعه کد و اسمبلی آن، میتواند تمام کتابخانههای مخصوص net5.0 و net6.0 را نیز استفاده کند؛ اما نه کتابخانههایی که به صورت اختصاصی برای net5.0-windows و یا net6.0-android کامپایل شدهاند.
این توضیحات به معنای پایان کار «NET Standard.» است. پس از NET Standard 2.1. فعلی، دیگر هیچ نگارش جدیدتری از آن ارائه نخواهد شد و البته net5.0 و تمام نگارشهای پس از آن، قابلیت استفادهی از کتابخانههای مبتنی بر NET Standard 2.1. و پیش از آنرا نیز دارا هستند. بنابراین از این پس، net5.0 را به عنوان پایهی به اشتراک گذاری کدها مدنظر داشته باشید.
سؤال: اگر امروز خواستیم کتابخانهای را تولید کنیم، باید از کدام TFM استفاده کرد؟
net5.0 و تمام نگارشهای پس از آن، از کتابخانههای مبتنی بر NET Standard 2.1. و قبل از آن نیز پیشیبانی میکنند. در این حالت تنها دلیل تغییر TFM کتابخانههای قدیمی موجود به net5.0، میتواند دسترسی به یکسری API جدید باشد. اما در مورد کتابخانههای جدید چطور؟ آیا باید برای مثال از netstandard2.0 استفاده کرد و یا از net5.0؟ این مورد بستگی به نوع پروژهی در حال تهیه دارد:
- اجزای مختلف یک برنامه: اگر از کتابخانهها برای شکستن برنامهی خود به چندین قسمت استفاده میکنید، بهتر است از نام جدید netX.Y استفاده کنید (مانند net5.0). که در اینجا X.Y، منظور پایینترین شماره نگارش NET. ای است که برنامهی شما قرار است بر مبنای آن تهیه شود.
- کتابخانههای با قابلیت استفادهی مجدد: اگر قرار است از کتابخانهی شما در NET 4x. نیز استفاده شود، با netstandard2.0 شروع کنید. بهتر است netstandard1x را فراموش کنید؛ چون دیگر پشتیبانی نمیشود. اگر نیازی به پشتیبانی از NET 4x. ندارید، میتوانید یا از netstandard2.1 و یا از net5.0 استفاده کنید و اگر در این حالت نیازی به پشتیبانی از NET Core 3x. ندارید، میتوانید مستقیما با net5.0 شروع کنید.
بنابراین به صورت خلاصه:
- netstandard2.0 امکان اشتراک کدها را بین NET 4x. و سایر سکوهای کاری میسر میکند.
- netstandard2.1 امکان اشتراک کدها را بین Mono ،Xamarin و NET Core 3x. میسر میکند.
- net5.0، مخصوص نگارش فعلی و آیندهی دات نت است.
و یا حتی میتوانید یک کتابخانه را به صورت multi-targeting با پشتیبانی از تمام TFMهای یاد شدهی فوق نیز تولید کنید:
تا پیش از ارائهی NET 5.، پیاده سازیهای مجزایی از دات نت مانند Full .NET Framework ،.NET Core ،Xamarin و غیره وجود داشتند و دارند. در این حالت برای اینکه بتوان یک class library قابل اجرای بر روی تمام اینها را ارائه داد، نیاز به ارائهی API ای بود که بین تمام آنها به اشتراک گذاشته شود و این دقیقا هدف وجودی NET Standard. است؛ اما ... مشکلات زیر را نیز به همراه دارد:
هر زمانیکه نیاز به افزودن یک API جدید باشد، نیاز خواهد بود تا یک نگارش جدید از NET Standard. ارائه شود. سپس تمام نگارشهای مختلف دات نت باید سعی کنند به صورت مجزایی این API جدید را پیاده سازی کنند. این پروسه بسیار کند است. همچنین همواره باید مراجع مختلف را دقیق بررسی کنید که برای مثال کدام نگارش از دات نت، کدام نگارش از NET Standard. را پیاده سازی کردهاست.
با ارائهی NET 5.، وضعیت کاملا فرق کردهاست. در اینجا یک «کد پایهی اشتراکی» را برای تمام نگارشهای مختلف دات نت داریم و این نگارش میخواهد مخصوص دسکتاپ یا برنامههای موبایل باشد، تفاوتی نمیکند. اکنون که تمام نگارشهای مختلف دات نت بر فراز یک کد اشتراکی پایه کار میکنند، دیگر نیازی به ارائهی مجزای یک API استاندارد و سپس پیاده سازی مجزای دیگری از آن، نیست.
نگارشهای ویژهی NET 5.، مخصوص سکوهای کاری مختلف
همانطور که عنوان شد، NET 5. در اصل یک «مجموعه کد اشتراکی» بین NET Core ،Mono ،Xamarin. و سایر پیاده سازیهای دات نت است. اما سکوهای کاری مختلف، مانند Android، iOS، ویندوز و غیره، به همراه کدهای قابل توجهی که مختص به آن سیستم عاملهای خاص باشند نیز هستند. برای رفع این مشکل، یکسری TFM یا target framework name/Target Framework Moniker ارائه شدهاند. برای مثال net5.0 یکی از آنها است. زمانیکه از این TFM استفاده میکنید، یعنی در حال کار با API ای هستید که در تمام نگارشهای چندسکویی مختلف دات نت، مهیا و قابل استفادهاست. نام جدید «net5.0» جایگزین کنندهی نامهای قدیمی «netcoreapp» و «netstandard» است.
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> </PropertyGroup> </Project>
کار کردن با این اسامی و درک آنها نیز سادهاست. برای مثال net6.0-ios به این معنا است که این قطعه کد و اسمبلی آن، میتواند تمام کتابخانههای مخصوص net5.0 و net6.0 را نیز استفاده کند؛ اما نه کتابخانههایی که به صورت اختصاصی برای net5.0-windows و یا net6.0-android کامپایل شدهاند.
این توضیحات به معنای پایان کار «NET Standard.» است. پس از NET Standard 2.1. فعلی، دیگر هیچ نگارش جدیدتری از آن ارائه نخواهد شد و البته net5.0 و تمام نگارشهای پس از آن، قابلیت استفادهی از کتابخانههای مبتنی بر NET Standard 2.1. و پیش از آنرا نیز دارا هستند. بنابراین از این پس، net5.0 را به عنوان پایهی به اشتراک گذاری کدها مدنظر داشته باشید.
سؤال: اگر امروز خواستیم کتابخانهای را تولید کنیم، باید از کدام TFM استفاده کرد؟
net5.0 و تمام نگارشهای پس از آن، از کتابخانههای مبتنی بر NET Standard 2.1. و قبل از آن نیز پیشیبانی میکنند. در این حالت تنها دلیل تغییر TFM کتابخانههای قدیمی موجود به net5.0، میتواند دسترسی به یکسری API جدید باشد. اما در مورد کتابخانههای جدید چطور؟ آیا باید برای مثال از netstandard2.0 استفاده کرد و یا از net5.0؟ این مورد بستگی به نوع پروژهی در حال تهیه دارد:
- اجزای مختلف یک برنامه: اگر از کتابخانهها برای شکستن برنامهی خود به چندین قسمت استفاده میکنید، بهتر است از نام جدید netX.Y استفاده کنید (مانند net5.0). که در اینجا X.Y، منظور پایینترین شماره نگارش NET. ای است که برنامهی شما قرار است بر مبنای آن تهیه شود.
- کتابخانههای با قابلیت استفادهی مجدد: اگر قرار است از کتابخانهی شما در NET 4x. نیز استفاده شود، با netstandard2.0 شروع کنید. بهتر است netstandard1x را فراموش کنید؛ چون دیگر پشتیبانی نمیشود. اگر نیازی به پشتیبانی از NET 4x. ندارید، میتوانید یا از netstandard2.1 و یا از net5.0 استفاده کنید و اگر در این حالت نیازی به پشتیبانی از NET Core 3x. ندارید، میتوانید مستقیما با net5.0 شروع کنید.
بنابراین به صورت خلاصه:
- netstandard2.0 امکان اشتراک کدها را بین NET 4x. و سایر سکوهای کاری میسر میکند.
- netstandard2.1 امکان اشتراک کدها را بین Mono ،Xamarin و NET Core 3x. میسر میکند.
- net5.0، مخصوص نگارش فعلی و آیندهی دات نت است.
و یا حتی میتوانید یک کتابخانه را به صورت multi-targeting با پشتیبانی از تمام TFMهای یاد شدهی فوق نیز تولید کنید:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net5.0;netstandard2.1;netstandard2.0;net461</TargetFrameworks> </PropertyGroup> </Project>