private static IntPtr GetHandle(NativeAssemblyResolver resolver, params string[] names) { if (names == null || names.Length == 0) { throw new ArgumentNullException(nameof(names)); } IntPtr value = IntPtr.Zero; foreach (string name in names) { if (Path.IsPathRooted(name)) { switch (PlatformHelper.CurrentPlatform) { case PlatformHelper.Platform.Windows: value = Kernel32.LoadLibrary(name); break; case PlatformHelper.Platform.Linux: case PlatformHelper.Platform.MacOS: case PlatformHelper.Platform.FreeBSD: value = Libdl.dlopen(name, 0x002); break; default: break; } } else { foreach (string loadTarget in resolver.EnumerateLoadTargets(name)) { if (!Path.IsPathRooted(loadTarget) || File.Exists(loadTarget)) { IntPtr v = IntPtr.Zero; switch (PlatformHelper.CurrentPlatform) { case PlatformHelper.Platform.Windows: v = Kernel32.LoadLibrary(loadTarget); break; case PlatformHelper.Platform.Linux: case PlatformHelper.Platform.MacOS: case PlatformHelper.Platform.FreeBSD: v = Libdl.dlopen(loadTarget, 0x002); break; default: break; } if (v != IntPtr.Zero) { value = v; } } } } if (value != IntPtr.Zero) { break; } } if (value == IntPtr.Zero) { throw new FileNotFoundException($"Could not load a library with the specified name(s): [ {string.Join(", ", names)} ]"); } return(value); }
/// <summary> /// Initializes a new instance of the <see cref="NativeAssembly"/> class /// with the specified <see cref="NativeAssemblyResolver"/>. /// </summary> /// <param name="names">An ordered list of assembly names to attempt to load.</param> /// <param name="resolver">The resolver used to identify possible load targets for the assembly.</param> public NativeAssembly(NativeAssemblyResolver resolver, params string[] names) : base(new SafeAssemblyHandle(GetHandle(resolver, names))) { }