using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace GeoSigmaDrawLib { /// /// 负责为本应用程序注册本地原生库(DLL)的搜索路径。 /// 此类不加载任何 DLL,仅通过 Windows API 设置系统搜索目录, /// 确保后续通过 P/Invoke 或 DllImport 加载的库能被正确找到。 /// /// 注意:必须在首次调用任何 GeoSigmaLib 的 P/Invoke 方法前调用此方法。 /// public static class NativeLibraryPathRegistrar { private const string VtkDirectory = "vtk"; private const string ThirdPartyDirectory = "thirdparty"; private const string EnvPath = "PATH"; /// /// 注册三方库目录 /// public static void Register() { var baseDirectory = GetExecutableDirectory(); AddToEnvironmentPath(Path.Combine(baseDirectory, VtkDirectory)); AddToEnvironmentPath(Path.Combine(baseDirectory, ThirdPartyDirectory)); } /// /// 添加目录到 Path 环境变量中 /// /// 要添加的目录名,建议使用绝对路径 public static void AddToEnvironmentPath(string directory) { if (string.IsNullOrWhiteSpace(directory)) { return; } string? current = Environment.GetEnvironmentVariable(EnvPath); string newPath = AppendToPath(current, directory); Environment.SetEnvironmentVariable(EnvPath, newPath); } public static string GetExecutableDirectory() { var executablePath = Process.GetCurrentProcess().MainModule?.FileName; if (string.IsNullOrEmpty(executablePath)) { throw new InvalidOperationException("无法获取当前进程的可执行文件路径。"); } if(string.IsNullOrWhiteSpace(executablePath)) { executablePath = AppDomain.CurrentDomain.BaseDirectory; return executablePath; } return Path.GetDirectoryName(executablePath) ?? throw new InvalidOperationException("可执行文件路径无效。"); } private static string AppendToPath(string? current, string directory) { if (string.IsNullOrWhiteSpace(directory)) { return current ?? string.Empty; } if (string.IsNullOrWhiteSpace(current)) { return directory; } char pathSeparator = Path.PathSeparator; var pathEntries = current.Split(pathSeparator) .Where(p => !string.IsNullOrWhiteSpace(p)) // 过滤空项 .ToList(); if (pathEntries.Contains(directory, StringComparer.OrdinalIgnoreCase)) { return current; } pathEntries.Add(directory); return string.Join(pathSeparator, pathEntries); } } }