Por qué C# no vive en el vacío, y cómo funciona
\n\nCuando empecé a trabajar con C# hace unos diez años, me parecía que .NET era un universo autosuficiente. Bibliotecas, frameworks, bases de datos: todo al alcance de la mano. Pero luego llegó una tarea: necesitaba usar una biblioteca antigua de C++ para procesamiento de señales. Y entonces entendí: la integración de C# con otros lenguajes no es un lujo, sino una necesidad para cualquier proyecto serio.
\n\nHoy en día, C# es un lenguaje multiplataforma con un ecosistema rico, pero no puede hacerlo todo. A veces es necesario ejecutar un script de Python para machine learning, a veces invocar una función nativa de Rust para máximo rendimiento, y a veces incrustar un motor de JavaScript para la generación dinámica de UI. La buena noticia: C# sabe cómo llevarse bien con casi todos.
\n\nEn este artículo, mostraré escenarios reales de interacción de C# con otros lenguajes con código funcional, benchmarks y trampas. ¡Allá vamos!
\n\nP/Invoke: el clásico del género para C y C++
\n\nPlatform Invocation Services (P/Invoke) es el mecanismo integrado de .NET para llamar funciones desde DLL nativas. Apareció en la primera versión de .NET y sigue siendo la forma más rápida de integrarse con código C/C++.
\n\nEjemplo básico: llamar a una función desde C
\n\nSupongamos que tenemos una biblioteca nativa math_helper.dll con la función:
// math_helper.h\nextern "C" __declspec(dllexport) double calculate_power(double base, int exp);\n\nEn C# la conectamos así:
\n\nusing System.Runtime.InteropServices;\n\npublic class NativeMath\n{\n [DllImport("math_helper.dll", CallingConvention = CallingConvention.Cdecl)]\n public static extern double calculate_power(double base, int exp);\n}\n\n// Uso\ndouble result = NativeMath.calculate_power(2.0, 10);\nConsole.WriteLine($"2^10 = {result}"); // 1024\n\nPuntos importantes al hacer P/Invoke C#:
\n- \n
- Siempre especifique
CallingConvention— normalmenteCdecloStdCall. \n - Para cadenas, use
MarshalAs(UnmanagedType.LPStr)oLPWStr. \n - Pase estructuras por referencia usando
refoout. \n
P/Invoke tiene una sobrecarga mínima: literalmente unos pocos nanosegundos por llamada. Si necesita integrar C# con C++ para cálculos de alto rendimiento, esta es su opción.
\n\nC++/CLI: el puente entre mundos
\n\nC++/CLI es una extensión de Visual C++ que permite escribir código que funciona tanto en entornos administrados (.NET) como no administrados. No es un lenguaje separado, sino un híbrido que se usa a menudo para crear envoltorios sobre bibliotecas de C++.
\n\nEjemplo de envoltorio para OpenCV
\n\nSupongamos que tenemos una función en C++ que procesa una imagen:
\n\n// NativeImageProcessor.h\n#pragma once\npublic ref class ImageProcessor\n{\npublic:\n static System::Drawing::Bitmap^ ApplyFilter(System::Drawing::Bitmap^ bmp);\n};\n\nInternamente, llamamos a OpenCV nativo, y hacia afuera devolvemos un Bitmap administrado. Desde C# lo usamos como una biblioteca .NET normal:
using ImageProcessorLib;\n\nvar img = new Bitmap("photo.jpg");\nvar processed = ImageProcessor.ApplyFilter(img);\nprocessed.Save("filtered.jpg");\n\nLa integración con C++/CLI da control total sobre la memoria y evita el marshaling. La desventaja: el código se vuelve dependiente de la plataforma y más difícil de depurar.
\n\nPython.NET: llamar a Python desde C#
\n\nPython es el rey de la ciencia de datos y el machine learning. Y si su proyecto en C# requiere, por ejemplo, ejecutar una red neuronal en PyTorch o procesar texto con spaCy, llamar a Python desde C# a través de Python.NET es lo que necesita.
\n\nInstalación y primer ejemplo
\n\nInstalamos el paquete:
\n\ndotnet add package Python.Runtime.NETStandardBlogs
Book Recommendations
Leer también
Cómo atrapar undefined: detective de propiedades de objetos en JavaScript
Inyección SQL en PHP 2025: ¿cómo protegerse? Guía completa
¿Cómo especificar el último commit de un repositorio en go.mod? Guía
Los mejores IDE y herramientas para el desarrollo Java: nivel avanzado
Trabajo con fechas y horas en Java: técnicas avanzadas y API