AlastairLundy.CliInvoke.Core
2.0.0-rc.2
Prefix Reserved
See the version list below for details.
dotnet add package AlastairLundy.CliInvoke.Core --version 2.0.0-rc.2
NuGet\Install-Package AlastairLundy.CliInvoke.Core -Version 2.0.0-rc.2
<PackageReference Include="AlastairLundy.CliInvoke.Core" Version="2.0.0-rc.2" />
<PackageVersion Include="AlastairLundy.CliInvoke.Core" Version="2.0.0-rc.2" />
<PackageReference Include="AlastairLundy.CliInvoke.Core" />
paket add AlastairLundy.CliInvoke.Core --version 2.0.0-rc.2
#r "nuget: AlastairLundy.CliInvoke.Core, 2.0.0-rc.2"
#:package AlastairLundy.CliInvoke.Core@2.0.0-rc.2
#addin nuget:?package=AlastairLundy.CliInvoke.Core&version=2.0.0-rc.2&prerelease
#tool nuget:?package=AlastairLundy.CliInvoke.Core&version=2.0.0-rc.2&prerelease
CliInvoke.Core
This package contains Process Running and handling abstractions as well as common types used by implementing classes.
For an implementing package, check out CliInvoke.
Key Abstractions:
IProcessInvokerIProcessConfigurationFactoryPiping:
IProcessPipeHandler
Fluent Builders:
IArgumentsBuilder- An interface to assist with Argument Building and argument escaping.IEnvironmentVariablesBuilder- An interface to assist with setting Environment variables.IProcessConfigurationBuilder- An interface to fluently configure and buildProcessConfigurationobjects.IProcessExitConfigurationBuilder- An interface to fluently configure and buildProcessExitConfigurationobjects.IProcessResourcePolicyBuilder- An interface to fluently configure and buildProcessResourcePolicyobjects.IProcessTimeoutPolicyBuilderIUserCredentialBuilder
Features
- Clear separation of concerns between Process Configuration Builders, Process Configuration Models, and Invokers.
- Supports .NET Standard 2.0, .NET 8 and newer TFMs, and has few dependencies.
- Has Dependency Injection extensions to make using it a breeze.
- Support for specific specializations such as running executables or commands via Windows Powershell or CMD on Windows <sup>1</sup>
- SourceLink support
<sup>1</sup> Specializations library distributed separately.
Why CliInvoke?
| Feature | CliInvoke | CliWrap | ProcessX |
|---|---|---|---|
| Configure and Run External Processes using code written in .NET | ✅ | ✅ | ❌, Uses mixture of .NET and BASH syntax |
| No Additional Licensing Terms Required for Use | ✅ | ❌ | ✅ |
| Uses only managed .NET code | ✅ | ❌ | ✅ |
| Follows Separation of Concerns and the Single Responsibility Principle | ✅ | ❌ | ❌ |
| Allows for alternative Process Runners to be specified and/or used | ✅ | ❌ | ❌ |
Installing CliInvoke.Core
CliInvoke.Core packages can be installed via the .NET SDK CLI, Nuget via your IDE or code editor's package interface, or via the Nuget website.
| Package Name | Nuget Link | .NET SDK CLI command |
|---|---|---|
| AlastairLundy.CliInvoke.Core | AlastairLundy.CliInvoke.Core Nuget | dotnet add package AlastairLundy.CliInvoke.Core |
Supported Platforms
CliInvoke.Core can be added to any .NET Standard 2.0, .NET 8, or .NET 9 or newer supported project.
The following table details which target platforms are supported for running Processes.
| Operating System/Platform specific TFM | Support Status | Notes |
|---|---|---|
| Windows | Fully Supported ✅ | |
| macOS | Fully Supported ✅ | |
| Mac Catalyst | Untested Platform ⚠️ | Support for this platform has not been tested but should theoretically work. |
| Linux | Fully Supported ✅ | |
| FreeBSD | Fully Supported ✅ | |
| Android | Untested Platform ⚠️ | Support for this platform has not been tested but should theoretically work. |
| IOS | Not Supported ❌ | Not supported due to Process.Start() not supporting IOS. ^2 |
| tvOS | Not Supported ❌ | Not supported due to Process.Start() not supporting tvOS ^2 |
| watchOS | Not Supported ❌ | Not supported due to Process.Start() not supporting watchOS ^3 |
| Browser | Not Planned ❌ | Not planned due to Client Side Rendering not being a valid target Platform for executing processes. |
^2 - See the Process class documentation for more info.
^3 - lack of IOS support implies lack of watchOS support since watchOS is based on IOS.
Note: This library has not been tested on Android or Tizen.
Examples
Simple ProcessConfiguration creation with Factory Pattern
This approach uses the IProcessConfigurationFactory interface factory to create a ProcessConfiguration. It requires fewer parameters and sets up more defaults for you.
It can be provided with a Action<IProcessConfigurationBuilder> configure optional parameter where greater control is desired.
Non-Buffered Execution Example
This example gets a non buffered ProcessResult that contains basic process exit code, id, and other information.
using AlastairLundy.CliInvoke.Core.Factories;
using AlastairLundy.CliInvoke.Core;
using AlastairLundy.CliIinvoke;
using Microsoft.Extensions.DependencyInjection;
// Dependency Injection setup code ommitted for clarity
// Get IProcessConfigurationFactory
IProcessConfigurationFactory processConfigFactory = serviceProvider.GetRequiredService<IProcessConfigurationFactory>();
// Get IProcessConfigurationInvoker
IProcessConfigurationInvoker _invoker_ = serviceProvider.GetRequiredService<IProcessConfigurationInvoker>();
// Simply create the process configuration.
ProcessConfiguration configuration = processConfigFactory.Create("path/to/exe", "arguments");
// Run the process configuration and get the results.
ProcessResult result = await _invoker.ExecuteAsync(configuration, CancellationToken.None);
Buffered Execution Example
This example gets a BufferedProcessResult which contains redirected StandardOutput and StandardError as strings.
using AlastairLundy.CliInvoke.Core.Factories;
using AlastairLundy.CliInvoke.Core;
using AlastairLundy.CliIinvoke;
using Microsoft.Extensions.DependencyInjection;
// Dependency Injection setup code ommitted for clarity
// Get IProcessConfigurationFactory
IProcessConfigurationFactory processConfigFactory = serviceProvider.GetRequiredService<IProcessConfigurationFactory>();
// Get IProcessConfigurationInvoker
IProcessConfigurationInvoker _invoker_ = serviceProvider.GetRequiredService<IProcessConfigurationInvoker>();
// Simply create the process configuration.
ProcessConfiguration configuration = processConfigFactory.Create("path/to/exe", "arguments");
// Run the process configuration and get the results.
BufferedProcessResult result = await _invoker.ExecuteBufferedAsync(configuration, CancellationToken.None);
Advanced Configuration with Builders
The following examples shows how to configure and build a ProcessConfiguration depending on whether Buffering the output is desired.
Non-Buffered Execution Example
This example gets a non buffered ProcessResult that contains basic process exit code, id, and other information.
using AlastairLundy.CliInvoke;
using AlastairLundy.CliInvoke.Core;
using AlastairLundy.CliInvoke.Builders;
using AlastairLundy.CliInvoke.Core.Builders;
using Microsoft.Extensions.DependencyInjection;
//Namespace and class code ommitted for clarity
// ServiceProvider and Dependency Injection setup code ommitted for clarity
IProcessInvoker _processInvoker = serviceProvider.GetRequiredService<IProcessInvoker>();
// Fluently configure your Command.
IProcessConfigurationBuilder builder = new ProcessConfigurationBuilder("Path/To/Executable")
.WithArguments(["arg1", "arg2"])
.WithWorkingDirectory("/Path/To/Directory");
// Build it as a ProcessConfiguration object when you're ready to use it.
ProcessConfiguration config = builder.Build();
// Execute the process through ProcessInvoker and get the results.
ProcessResult result = await _processConfigInvoker.ExecuteAsync(config);
Buffered Execution Example
This example gets a BufferedProcessResult which contains redirected StandardOutput and StandardError as strings.
using AlastairLundy.CliInvoke;
using AlastairLundy.CliInvoke.Builders;
using AlastairLundy.CliInvoke.Core;
using AlastairLundy.CliInvoke.Core.Builders;
using Microsoft.Extensions.DependencyInjection;
//Namespace and class code ommitted for clarity
// ServiceProvider and Dependency Injection setup code ommitted for clarity
IProcessInvoker _processInvoker = serviceProvider.GetRequiredService<IProcessInvoker>();
// Fluently configure your Command.
IProcessConfigurationBuilder builder = new ProcessConfigurationBuilder("Path/To/Executable")
.WithArguments(["arg1", "arg2"])
.WithWorkingDirectory("/Path/To/Directory")
.RedirectStandardOutput(true)
.RedirectStandardError(true);
// Build it as a ProcessConfiguration object when you're ready to use it.
ProcessConfiguration config = builder.Build();
// Execute the process through ProcessInvoker and get the results.
BufferedProcessResult result = await _processInvoker.ExecuteBufferedAsync(config);
Acknowledgements
Projects
This project would like to thank the following projects for their work:
- Microsoft.Bcl.HashCode for providing a backport of the HashCode class and static methods to .NET Standard 2.0
- Polyfill for simplifying .NET Standard 2.0 support
For more information, please see the THIRD_PARTY_NOTICES file.
| 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 was computed. 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
- Microsoft.Bcl.HashCode (>= 6.0.0)
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages (5)
Showing the top 5 NuGet packages that depend on AlastairLundy.CliInvoke.Core:
| Package | Downloads |
|---|---|
|
AlastairLundy.CliInvoke
CliInvoke is a .NET Library for interacting with Command Line Interfaces, CliInvoke is a library for interacting with Command Line Interfaces and wrapping around executables. |
|
|
AlastairLundy.CliInvoke.Extensibility
Makes extending CliInvoke, and using custom Command Runners and Command Configurations easier. |
|
|
AlastairLundy.CliInvoke.Extensions
Adds a ``AddCliInvoke`` Dependency Injection extension method to enable easy CliInvoke setup when using the Microsoft.Extensions.DependencyInjection package. |
|
|
AlastairLundy.CliInvoke.Specializations
CliInvoke Specializations is a library for providing pre-configured Specializations of CliInvoke's ProcessConfiguration. |
|
|
AlastairLundy.WCountLib.Providers.wc
This package provides implementations for WCountLib.Abstractions interfaces that use Posix's and Unix's ``wc`` program to perform the calculations. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.0.0 | 270 | 10/28/2025 |
| 2.0.0-rc.2 | 108 | 10/26/2025 |
| 2.0.0-rc.1 | 120 | 10/19/2025 |
| 2.0.0-beta.7 | 120 | 10/15/2025 |
| 2.0.0-beta.6 | 175 | 10/14/2025 |
| 2.0.0-beta.5 | 161 | 10/11/2025 |
| 2.0.0-beta.4 | 161 | 10/9/2025 |
| 2.0.0-beta.3 | 145 | 10/5/2025 |
| 2.0.0-beta.2 | 201 | 10/1/2025 |
| 2.0.0-beta.1 | 189 | 9/27/2025 |
| 1.6.1 | 626 | 10/9/2025 |
| 1.6.0 | 336 | 10/1/2025 |
| 1.5.2 | 502 | 9/16/2025 |
| 1.5.1 | 433 | 8/25/2025 |
| 1.5.0 | 233 | 7/30/2025 |
| 1.4.5 | 345 | 7/10/2025 |
| 1.4.4 | 367 | 7/7/2025 |
| 1.4.3 | 378 | 6/23/2025 |
| 1.4.2 | 588 | 6/11/2025 |
| 1.4.1 | 271 | 6/2/2025 |
| 1.4.0 | 213 | 5/27/2025 |
| 1.3.1 | 642 | 5/19/2025 |
| 1.3.0 | 172 | 4/26/2025 |
* Renamed ``IProcessRunnerCreator`` to ``IProcessRunnerFactory``
* Adjusted ``IProcessRunnerFactory`` method signatures - These contain breaking changes
* Added abstract class ``RunnerProcessInvokerBase`` that inherits from ``IProcessInvoker``
* Annotated ``IProcessInvoker`` methods to indicate lack of support for IOS and tvOS