Introdução: O Labirinto das Bibliotecas .NET
\n\nSe você já criou um novo projeto no Visual Studio ou Rider, certamente viu dois modelos semelhantes, mas confusos: Class Library (.NET Core) e Class Library (.NET Standard). Surge a pergunta inevitável: "Qual é a diferença, afinal? E o que devo escolher para não ter que reescrever tudo do zero?".
\n\nIsso não é apenas um interesse acadêmico. No Stack Overflow, essa pergunta acumulou milhares de visualizações, e a confusão entre esses dois tipos de projeto é um dos erros mais comuns de iniciantes. Neste artigo, vamos esclarecer de uma vez por todas esse dilema, ver exemplos reais de código em C# e descobrir qual tipo de biblioteca é adequado para a sua tarefa.
\n\n1. Breve histórico: do .NET Framework à era da unificação
\n\nPara entender a diferença, é preciso lembrar como a plataforma evoluiu. Antes, existia apenas o .NET Framework — um ambiente monolítico para Windows. Depois, surgiu o .NET Core — uma versão multiplataforma e leve. E então surgiu um problema: como escrever uma biblioteca que funcionasse em ambos? Para isso, foi criado o .NET Standard — uma especificação formal das APIs que estão garantidamente presentes em todas as implementações do .NET.
\n\nNo entanto, com o lançamento do .NET 5 (e posteriormente .NET 6, 7, 8), a Microsoft unificou as plataformas. Agora, existe uma classe base única — .NET (anteriormente .NET Core). Isso mudou significativamente as regras do jogo. Vamos entender o que isso significa para nós, desenvolvedores.
2. O que é Class Library (.NET Standard)?
\n\n.NET Standard não é um runtime, mas um conjunto de contratos. Imagine que é um "adaptador universal". Se você criar uma biblioteca direcionada ao netstandard2.0, ela poderá funcionar:
- \n
- No .NET Framework 4.6.1+ \n
- No .NET Core 2.0+ \n
- No .NET 5/6/7/8 \n
- No Xamarin, Mono, Unity e até no UWP \n
Esta é a escolha ideal se você precisa de cobertura máxima de plataformas. Você escreve o código uma vez — e ele funciona em qualquer lugar que suporte essa versão do padrão.
\n\nExemplo de código para uma biblioteca .NET Standard
\n\nVamos criar uma biblioteca simples para manipulação de strings, direcionada ao netstandard2.0:
// StringHelper.cs\nusing System;\nusing System.Text.RegularExpressions;\n\nnamespace MyStandardLibrary\n{\n public class StringHelper\n {\n /// <summary>\n /// Remove todas as tags HTML de uma string.\n /// </summary>\n public static string StripHtmlTags(string input)\n {\n if (string.IsNullOrEmpty(input))\n return string.Empty;\n\n // Regex simples, mas eficaz para remover tags\n return Regex.Replace(input, "<.*?>", string.Empty);\n }\n\n /// <summary>\n /// Inverte uma string.\n /// </summary>\n public static string ReverseString(string input)\n {\n if (string.IsNullOrEmpty(input))\n return string.Empty;\n\n char[] chars = input.ToCharArray();\n Array.Reverse(chars);\n return new string(chars);\n }\n }\n}\n\nObserve: estamos usando apenas classes base (System, System.Text.RegularExpressions), que estão garantidamente presentes em todas as implementações do .NET Standard 2.0. Esta biblioteca funcionará até mesmo em um projeto .NET Framework 4.6.1, que a Microsoft não desenvolve mais, mas que ainda é usado no setor corporativo.
3. O que é Class Library (.NET Core / .NET)?
\n\nQuando você escolhe .NET Core Class Library (ou simplesmente .NET Class Library, se você tem .NET 5+), você está vinculado a uma implementação específica da plataforma. No arquivo de projeto (csproj), você verá algo como <Target