27 string explicitExecutableEnvironmentVariable,
28 IEnumerable<string> homeEnvironmentVariables,
29 IEnumerable<string> relativeExecutablePaths,
30 IEnumerable<string> pathExecutableNames)
32 ArgumentException.ThrowIfNullOrWhiteSpace(
33 explicitExecutableEnvironmentVariable);
35 ArgumentNullException.ThrowIfNull(
36 homeEnvironmentVariables);
37 ArgumentNullException.ThrowIfNull(
38 relativeExecutablePaths);
39 ArgumentNullException.ThrowIfNull(
43 Environment.GetEnvironmentVariable(
44 explicitExecutableEnvironmentVariable)?.Trim() ??
47 if (File.Exists(explicitPath))
49 return Path.GetFullPath(
53 string[] relativePaths =
54 relativeExecutablePaths
55 .Where(path => !
string.IsNullOrWhiteSpace(path))
58 foreach (
string environmentVariable
in homeEnvironmentVariables)
60 if (
string.IsNullOrWhiteSpace(
67 Environment.GetEnvironmentVariable(
68 environmentVariable)?.Trim() ??
71 if (
string.IsNullOrWhiteSpace(home))
76 foreach (
string relativePath
in relativePaths)
83 if (File.Exists(candidate))
85 return Path.GetFullPath(
102 IEnumerable<string> executableNames)
104 ArgumentNullException.ThrowIfNull(
108 Environment.GetEnvironmentVariable(
"PATH") ??
111 string[] directories =
114 StringSplitOptions.RemoveEmptyEntries |
115 StringSplitOptions.TrimEntries);
117 foreach (
string directory
in directories)
119 foreach (
string executableName
in executableNames)
121 if (
string.IsNullOrWhiteSpace(
132 executableName.Trim());
134 if (File.Exists(candidate))
136 return Path.GetFullPath(