Avatar ·

В чем разница между проектами библиотек классов .NET Core и .NET Standard в Visual Studio?

Привет! Я новичок в C# и .NET, и недавно начал изучать создание библиотек классов. В Visual Studio при добавлении нового проекта я вижу два похожих шаблона: "Библиотека классов (.NET Core)" и "Библиотека классов (.NET Standard)". Я в замешательстве — какой из них выбрать? Например, я пишу небольшой проект для себя на .NET Core 3.1, и хочу вынести общие утилиты (валидацию email, работу с датами) в отдельную библиотеку. Если я создам библиотеку на .NET Standard, смогу ли я её использовать в своём .NET Core проекте? Или наоборот, если я сделаю библиотеку на .NET Core, то она будет работать только с .NET Core? Также я слышал про .NET Framework — моя библиотека должна поддерживать и старые проекты на .NET Framework 4.6.1? Или лучше сразу всё переводить на .NET Core? Буду благодарен за разъяснение с примерами кода. ```csharp // Пример: моя утилита для валидации email public static class EmailValidator { public static bool IsValidEmail(string email) { try { var addr = new System.Net.Mail.MailAddress(email); return addr.Address == email; } catch { return false; } } } ``` <<>>

Ключевое отличие: .NET Standard — это спецификация, .NET Core — реализация

Чтобы понять разницу, нужно запомнить главное:

  • .NET Standard — это набор API-контрактов, который должны реализовать все .NET-платформы. Это не исполняемая среда, а "дорожная карта" для совместимости.
  • .NET Core — это конкретная реализация этих контрактов (наряду с .NET Framework, Mono, Xamarin).

Как это работает на практике?

Представьте, что .NET Standard — это международный стандарт розеток (например, USB Type-C). А .NET Core, .NET Framework, Xamarin — это конкретные зарядные устройства, которые поддерживают этот стандарт. Если ваша библиотека написана под .NET Standard 2.0, она будет работать везде, где этот стандарт реализован: в .NET Core 2.0+, .NET Framework 4.6.1+, Xamarin, Unity и т.д.

Когда использовать каждый тип проекта?

  • Библиотека .NET Standard — если вы хотите, чтобы ваша библиотека работала на максимальном количестве платформ. Пример: вы пишете библиотеку для валидации email, которую потом можно использовать в ASP.NET Core, десктопном WPF-приложении на .NET Framework и мобильном приложении на Xamarin.
  • Библиотека .NET Core — если вы используете API, специфичные для .NET Core (например, Span<T>, Memory<T>, System.IO.Pipelines), или если ваша библиотека зависит от версии .NET Core и не должна работать на других платформах.

Пример с вашим кодом

Ваш EmailValidator использует только базовые классы из System.Net.Mail, которые доступны в .NET Standard 2.0. Поэтому лучший выбор — библиотека .NET Standard 2.0. Она будет работать и в .NET Core 3.1, и в .NET Framework 4.6.1, и в других средах.

// EmailValidator.cs — проект .NET Standard 2.0
public static class EmailValidator
{
    public static bool IsValidEmail(string email)
    {
        try
        {
            var addr = new System.Net.Mail.MailAddress(email);
            return addr.Address == email;
        }
        catch
        {
            return false;
        }
    }
}

В вашем .NET Core 3.1 проекте вы просто добавляете ссылку на эту библиотеку (NuGet или прямую ссылку) и используете:

// Program.cs — проект .NET Core 3.1
using MyLibrary;

class Program
{
    static void Main()
    {
        bool isValid = EmailValidator.IsValidEmail("test@example.com");
        Console.WriteLine(isValid); // True
    }
}

Практические рекомендации

  1. Для новых проектов: если вы не уверены, выбирайте .NET Standard 2.0. Это "золотая середина" — он покрывает 95% API и совместим с большинством платформ.
  2. Если вам нужны новейшие фичи .NET Core (например, System.Text.Json в .NET Core 3.0+), используйте .NET Core. Но помните, что такая библиотека не будет работать на .NET Framework.
  3. Если вы пишете библиотеку для NuGet — всегда стремитесь к .NET Standard, чтобы охватить максимальную аудиторию.
  4. Для поддержки .NET Framework 4.6.1 — .NET Standard 2.0 отлично подходит, так как эта версия фреймворка полностью его реализует.

Важное примечание про версии

Чем выше версия .NET Standard, тем больше API она включает, но тем меньше платформ её поддерживают. Например:

  • .NET Standard 2.0 — поддерживается .NET Framework 4.6.1+, .NET Core 2.0+, Xamarin
  • .NET Standard 2.1 — поддерживается .NET Core 3.0+, Xamarin, но НЕ поддерживается .NET Framework

Поэтому для максимальной совместимости выбирайте .NET Standard 2.0, если не требуется специфических API из 2.1.

<<>>

Альтернативный взгляд: мультитаргетинг и TFM

Если вам нужно, чтобы библиотека работала и на .NET Core, и на .NET Framework, но при этом вы хотите использовать новейшие API на одной платформе и старые на другой — используйте мультитаргетинг (multi-targeting).

В файле .csproj вы можете указать несколько целевых платформ:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netcoreapp3.1;net461</TargetFrameworks>
  </PropertyGroup>
</Project>

Затем в коде используйте директивы препроцессора для условной компиляции:

public static class PlatformHelper
{
    public static string GetInfo()
    {
#if NETCOREAPP3_1
        return "Running on .NET Core 3.1";
#elif NET461
        return "Running on .NET Framework 4.6.1";
#endif
    }
}

Этот подход сложнее, но даёт полный контроль. Однако для простых библиотек, как ваш валидатор email, .NET Standard 2.0 — самый простой и надёжный вариант. Мультитаргетинг оправдан, когда вы используете специфичные API (например, Span<T> в .NET Core и ArraySegment<T> в .NET Framework).