.NET Core:compruebe en qué sistema operativo está ejecutando

 C Programming >> Programación C >  >> Tags >> .NET
.NET Core:compruebe en qué sistema operativo está ejecutando

.NET Core le permite escribir código C# multiplataforma.

A veces, querrá hacer las cosas de manera diferente según el sistema operativo en el que se esté ejecutando. Puede usar RuntimeInformation.IsOSPlatform() para averiguar en qué sistema operativo se encuentra, así:

System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
Code language: C# (cs)

Ejemplo:cargar una biblioteca nativa diferente dependiendo de si está en Windows o Linux

Un ejemplo práctico de la necesidad de saber en qué sistema operativo se encuentra es cuando se está integrando con bibliotecas nativas, y las bibliotecas nativas tienen nombres completamente diferentes en las diferentes plataformas de sistemas operativos.

Por ejemplo, digamos que queremos integrarnos con un método nativo llamado Add(int a, int b). En Windows, esto existe en wincalc.dll. En Linux, está en advancedcalc.so.

Para resolver esto, necesitaremos:

  • Especifique un alias en DllImport.
  • Utilice NativeLibrary.SetDllImportResolver para especificar nuestro propio solucionador de ensamblado nativo.
  • Verifique qué plataforma estaba utilizando RuntimeInformation.IsOSPlatform(), para que sepamos qué ensamblado nativo intentar cargar.
  • Utilice NativeLibrary.TryLoad() para cargar el ensamblado nativo especificado.

El siguiente código hace todo eso:

using System.Reflection;
using System.Runtime.InteropServices;
class Program
{
	private const string NATIVE_LIB_ALIAS = "NativeCalculatorLib";
	static void Main(string[] args)
	{
		NativeLibrary.SetDllImportResolver(typeof(Program).Assembly, NativeAssemblyResolver);

		int sum = Add(1, 2);

		Console.WriteLine($"1+2={sum}");
	}

	static IntPtr NativeAssemblyResolver(string libraryName, Assembly assembly, DllImportSearchPath? searchPath)
	{
		if (libraryName != NATIVE_LIB_ALIAS)
			return IntPtr.Zero;

		IntPtr libHandle = IntPtr.Zero;

		if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
		{
			Console.WriteLine("On Windows, so using wincalc.dll");
			NativeLibrary.TryLoad("wincalc.dll", assembly, searchPath, out libHandle);
			
		}
		else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
		{
			Console.WriteLine("On Linux, so using advancedcalc.dll");
			NativeLibrary.TryLoad("advancedcalc.so", assembly, searchPath, out libHandle);
		}
		return libHandle;
	}

	[DllImport(NATIVE_LIB_ALIAS)]
	public static extern int Add(int a, int b);
}
Code language: C# (cs)