WhatExec.Lib
1.1.0
dotnet add package WhatExec.Lib --version 1.1.0
NuGet\Install-Package WhatExec.Lib -Version 1.1.0
<PackageReference Include="WhatExec.Lib" Version="1.1.0" />
<PackageVersion Include="WhatExec.Lib" Version="1.1.0" />
<PackageReference Include="WhatExec.Lib" />
paket add WhatExec.Lib --version 1.1.0
#r "nuget: WhatExec.Lib, 1.1.0"
#:package WhatExec.Lib@1.1.0
#addin nuget:?package=WhatExec.Lib&version=1.1.0
#tool nuget:?package=WhatExec.Lib&version=1.1.0
WhatExec.Lib
Description
WhatExec.Lib is a C# library that finds executable files in PATH Environment Variables, Directories or Drives.
WhatExec.Lib implements WhatExec.Lib.Abstractions's interfaces.
Locators
| Scenario | Interface | Class |
|---|---|---|
| Finding all Executable files on a Drive or in a Directory | IExecutablesLocator |
ExecutablesLocator |
| Finding all Executable files with the same name | IExecutableFileInstancesLocator |
ExecutableFileInstancesLocator |
Resolvers
| Scenario | Interface | Class |
|---|---|---|
| Resolve the file paths of specified Executable files | IExecutableFileResolver |
ExecutableFileResolver |
| Resolve an Executable file path using just the PATH Environment variable | IPathEnvironmentVariableResolver |
PathEnvironmentVariableResolver |
Detectors
| Scenario | Interface | Class |
|---|---|---|
| Detects whether a file is executable or not. | IExecutableFileDetector |
ExecutableFileDetector |
| Detects the contents of the PATH Environment Variable, and the Path Executable Extensions Variable.<sup>1</sup> | IPathEnvironmentVariableDetector |
PathEnvironmentVariableDetector |
<sup>1</sup> - Executable extensions returns empty array on non-Windows platforms.
Installation
To install WhatExecLib, run the following command
dotnet add package WhatExec.Lib
License
This library is licensed under the terms of the Mozilla Public License 2.0.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- DotExtensions (>= 10.3.2)
- Microsoft.Bcl.AsyncInterfaces (>= 10.0.8)
- System.Linq.AsyncEnumerable (>= 10.0.8)
- WhatExec.Lib.Abstractions (>= 1.1.0)
-
net10.0
- DotExtensions (>= 10.3.2)
- WhatExec.Lib.Abstractions (>= 1.1.0)
-
net8.0
- DotExtensions (>= 10.3.2)
- System.Linq.AsyncEnumerable (>= 10.0.8)
- WhatExec.Lib.Abstractions (>= 1.1.0)
-
net9.0
- DotExtensions (>= 10.3.2)
- System.Linq.AsyncEnumerable (>= 10.0.8)
- WhatExec.Lib.Abstractions (>= 1.1.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on WhatExec.Lib:
| Package | Downloads |
|---|---|
|
WhatExec.Lib.Extensions.DependencyInjection
Registers WhatExecLib with Microsoft.Extensions.DependencyInjection |
GitHub repositories
This package is not used by any popular GitHub repositories.
#### 🆕 Additions
- Added `IPathEnvironmentVariableDetector` as a constructor dependency to `ExecutableFileResolver` for improved PATH extension resolution
- Added `System.Linq.AsyncEnumerable` package reference for .NET 8.0 and .NET 9.0 targets
- Added .NET 8.0 and .NET 9.0 target frameworks, expanding platform support beyond net10.0 and netstandard2.0
#### ⚙️ Modifications
- Parallelized multi-drive executable searches in `ExecutableFileInstancesLocator` using `Task.WhenAll` for significantly improved performance
- Replaced `SafelyEnumerateFiles` with `EnumerateFiles` using `EnumerationOptions` (with `IgnoreInaccessible` and `MatchCasing.CaseInsensitive`) across locators and resolvers
- Converted `GetExecutablesInDriveAsync` to a streaming `IAsyncEnumerable`-based `EnumerateExecutablesInDriveAsync` to reduce memory allocations
- Added `EnumerateExecutablesInDirectoryAsync` for directory-level executable enumeration with PATH extension awareness
- Improved `ExecutableFileDetector` to detect `.dll` files via PE/MZ magic number validation on Windows
- Added `.com` file handling in `ExecutableFileDetector` with 64-bit OS magic number check
- Unified Mac and iOS detection logic in `ExecutableFileDetector` using MachO 64-bit magic number
- Simplified Linux/FreeBSD detection in `ExecutableFileDetector` to rely on ELF magic number without execute permission check
- Changed string comparison in `ExecutableFileResolver` to always use `OrdinalIgnoreCase` instead of platform-dependent comparison
- Removed unused global usings (`DotExtensions.IO.Directories`, `DotExtensions.IO.Files`, `WhatExec.Lib.Abstractions`)
- Enabled implicit usings in WhatExec.Lib.Abstractions
- Bumped DotExtensions from 10.0.0 to 10.3.2
- Bumped Microsoft.Extensions.DependencyInjection from 10.0.5 to 10.0.8
- Bumped Microsoft.Extensions.DependencyInjection.Abstractions from 10.0.5 to 10.0.8
- Bumped Microsoft.Bcl.AsyncInterfaces from 10.0.5 to 10.0.8
- Bumped System.Linq.AsyncEnumerable from 10.0.5 to 10.0.8
- Bumped Polyfill from 9.18.0 to 10.8.1
- Bumped Meziantou.Analyzer from 3.0.23 to 3.0.101
#### 🐛 Bug Fixes
- Fixed `ExecutableFileDetector` to gracefully fall back to permission-based detection when magic number reading fails on Windows