Introducción: El laberinto de las bibliotecas .NET
\n\nSi alguna vez has creado un nuevo proyecto en Visual Studio o Rider, seguramente has visto dos plantillas similares pero confusas: Class Library (.NET Core) y Class Library (.NET Standard). Surge la pregunta lógica: «¿Y cuál es la diferencia? ¿Y qué elijo para no tener que reescribir todo desde cero?».
\n\nNo es solo un interés académico. En Stack Overflow, esta pregunta ha acumulado miles de visitas, y la confusión entre estos dos tipos de proyectos es uno de los errores más comunes de los principiantes. En este artículo, aclararemos de una vez por todas este dilema, veremos ejemplos reales de código en C# y descubriremos qué tipo de biblioteca se adapta mejor a tu tarea.
\n\n1. Breve recorrido histórico: de .NET Framework a la era de la unificación
\n\nPara entender la diferencia, hay que recordar cómo evolucionó la plataforma. Antes solo existía .NET Framework, un entorno monolítico para Windows. Luego apareció .NET Core, una versión multiplataforma y ligera. Y surgió un problema: ¿cómo escribir una biblioteca que funcionara en ambos? Para eso se creó .NET Standard, una especificación formal de las API que están garantizadas en todas las implementaciones de .NET.
\n\nSin embargo, con el lanzamiento de .NET 5 (y luego .NET 6, 7, 8), Microsoft unificó las plataformas. Ahora existe una clase base única: .NET (anteriormente .NET Core). Esto cambió significativamente las reglas del juego. Analicemos qué significa esto para nosotros, los desarrolladores.
2. ¿Qué es Class Library (.NET Standard)?
\n\n.NET Standard no es un runtime, sino un conjunto de contratos. Imagínalo como un «adaptador universal». Si creas una biblioteca orientada a netstandard2.0, podrá funcionar en:
- \n
- .NET Framework 4.6.1+ \n
- .NET Core 2.0+ \n
- .NET 5/6/7/8 \n
- Xamarin, Mono, Unity e incluso UWP \n
Es la elección ideal si necesitas la máxima cobertura de plataformas. Escribes el código una vez y funciona en todas partes donde se admita esa versión del estándar.
\n\nEjemplo de código para una biblioteca .NET Standard
\n\nCreemos una biblioteca simple para trabajar con cadenas, orientada a netstandard2.0:
// StringHelper.cs\nusing System;\nusing System.Text.RegularExpressions;\n\nnamespace MyStandardLibrary\n{\n public class StringHelper\n {\n /// <summary>\n /// Elimina todas las etiquetas HTML de una cadena.\n /// </summary>\n public static string StripHtmlTags(string input)\n {\n if (string.IsNullOrEmpty(input))\n return string.Empty;\n\n // Regex simple pero efectivo para eliminar etiquetas\n return Regex.Replace(input, "<.*?>", string.Empty);\n }\n\n /// <summary>\n /// Invierte una cadena al revés.\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\nObserva: solo usamos clases base (System, System.Text.RegularExpressions) que están garantizadas en todas las implementaciones de .NET Standard 2.0. Esta biblioteca funcionará incluso en un proyecto de .NET Framework 4.6.1, que Microsoft ya no desarrolla, pero que todavía se usa en el sector corporativo.
3. ¿Qué es Class Library (.NET Core / .NET)?
\n\nCuando eliges .NET Core Class Library (o simplemente .NET Class Library, si tienes .NET 5+), te vinculas a una implementación específica de la plataforma. En el archivo del proyecto (csproj) verás algo como <Target