.NET Core – Überprüfen Sie, welches Betriebssystem Sie verwenden

 C Programming >> C-Programmierung >  >> Tags >> .NET
.NET Core – Überprüfen Sie, welches Betriebssystem Sie verwenden

Mit .NET Core können Sie plattformübergreifenden C#-Code schreiben.

Manchmal möchten Sie die Dinge je nach Betriebssystem anders machen. Sie können RuntimeInformation.IsOSPlatform() verwenden, um herauszufinden, in welchem ​​​​Betriebssystem Sie sich befinden, wie folgt:

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

Beispiel – Laden einer anderen nativen Bibliothek, je nachdem, ob Sie Windows oder Linux verwenden

Ein praktisches Beispiel dafür, dass Sie wissen müssen, in welchem ​​​​Betriebssystem Sie sich befinden, ist die Integration mit nativen Bibliotheken, und die nativen Bibliotheken haben auf den verschiedenen Betriebssystemplattformen völlig unterschiedliche Namen.

Angenommen, wir möchten mit einer nativen Methode namens Add(int a, int b) integrieren. Unter Windows ist dies in wincalc.dll vorhanden. Unter Linux befindet es sich in advancedcalc.so.

Um dies zu lösen, müssen wir:

  • Geben Sie einen Alias ​​in DllImport an.
  • Verwenden Sie NativeLibrary.SetDllImportResolver, um unseren eigenen nativen Assembly-Resolver anzugeben.
  • Überprüfen Sie mit RuntimeInformation.IsOSPlatform(), welche Plattform verwendet wurde, damit wir wissen, welche native Assembly zu laden ist.
  • Verwenden Sie NativeLibrary.TryLoad(), um die angegebene native Assembly zu laden.

Der folgende Code erledigt all das:

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)