using System; using System.IO; using System.Linq; namespace ScreenConnect; public static class NativeLibrary { public static T LoadProxy(Type assemblyTypeHint) { return (T)LoadProxy(typeof(T), assemblyTypeHint); } public static object LoadProxy(Type type, Type assemblyTypeHint) { if (Singleton.Instance.SupportsReflectionEmit()) { INativeLibrary nativeLibrary = LoadLibrary(type, assemblyTypeHint); return Singleton.Instance.BuildEmitCalliProxy(type, nativeLibrary); } return Activator.CreateInstance((from _ in Extensions.GetPluginTypes(type) where !_.IsAbstractX() select _).First()); } public static T LoadBootstrapProxy() { return (T)LoadBootstrapProxy(typeof(T)); } public static object LoadBootstrapProxy(Type type) { string libraryPath = GetLibraryPath(GetLibraryName(type)); return Singleton.Instance.BuildEmitPlatformInvokeProxy(type, libraryPath); } public static INativeLibrary LoadLibrary(Type type, Type assemblyTypeHint) { return LoadLibrary(GetLibraryName(type), assemblyTypeHint); } public static INativeLibrary LoadLibrary(string libraryName, Type assemblyTypeHint) { string libraryResourceName = GetLibraryResourceName(libraryName); Type type = assemblyTypeHint; while ((object)type != null) { using (Stream stream = type.ExtractEmbeddedResourceToStream(libraryResourceName)) { if (stream != null) { return Singleton.Instance.LoadNativeLibraryFromResourceStream(libraryResourceName, stream); } } type = type.BaseType; } string libraryPath = GetLibraryPath(libraryName); return Singleton.Instance.LoadNativeLibraryFromDisk(libraryPath); } public static string GetLibraryName(Type type) { return type.Name; } public static string GetLibraryPath(string libraryName) { return Singleton.Instance.FindNativeLibrary(libraryName) ?? (libraryName + GetNativeLibraryFileExtension()); } public static string GetNativeLibraryFileExtension() { return (EnvironmentInfo.Current & EnvironmentFlags.PlatformMask) switch { EnvironmentFlags.Linux => ".so", EnvironmentFlags.OSX => ".dylib", _ => ".dll", }; } public static string GetLibraryResourceName(string libraryName) { string text = (Singleton.Instance.IsArmInstructionSet() ? ".arm" : ((Constants.WordSizeBits == 32) ? ".x86" : ".x64")); string nativeLibraryFileExtension = GetNativeLibraryFileExtension(); return libraryName + text + nativeLibraryFileExtension; } }