AlastairLundy.CliInvoke.Core
2.0.0-rc.1
Prefix Reserved
dotnet add package AlastairLundy.CliInvoke.Core --version 2.0.0-rc.1
NuGet\Install-Package AlastairLundy.CliInvoke.Core -Version 2.0.0-rc.1
<PackageReference Include="AlastairLundy.CliInvoke.Core" Version="2.0.0-rc.1" />
<PackageVersion Include="AlastairLundy.CliInvoke.Core" Version="2.0.0-rc.1" />
<PackageReference Include="AlastairLundy.CliInvoke.Core" />
paket add AlastairLundy.CliInvoke.Core --version 2.0.0-rc.1
#r "nuget: AlastairLundy.CliInvoke.Core, 2.0.0-rc.1"
#:package AlastairLundy.CliInvoke.Core@2.0.0-rc.1
#addin nuget:?package=AlastairLundy.CliInvoke.Core&version=2.0.0-rc.1&prerelease
#tool nuget:?package=AlastairLundy.CliInvoke.Core&version=2.0.0-rc.1&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:
IProcessInvoker
IProcessConfigurationFactory
Piping:
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 buildProcessConfiguration
objects.IProcessExitConfigurationBuilder
- An interface to fluently configure and buildProcessExitConfiguration
objects.IProcessResourcePolicyBuilder
- An interface to fluently configure and buildProcessResourcePolicy
objects.IProcessTimeoutPolicyBuilder
IUserCredentialBuilder
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 (4)
Showing the top 4 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.Extensions
Adds a ``AddCliInvoke`` Dependency Injection extension method to enable easy CliInvoke setup when using the Microsoft.Extensions.DependencyInjection package. |
|
AlastairLundy.CliInvoke.Specializations
CliRunner Specializations is a library for providing Specializations of CliRunner's Commands. |
|
AlastairLundy.CliInvoke.Extensibility
Makes extending CliInvoke, and using custom Command Runners and Command Configurations easier. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last Updated |
---|---|---|
2.0.0-rc.1 | 38 | 10/19/2025 |
2.0.0-beta.7 | 114 | 10/15/2025 |
2.0.0-beta.6 | 169 | 10/14/2025 |
2.0.0-beta.5 | 153 | 10/11/2025 |
2.0.0-beta.4 | 156 | 10/9/2025 |
2.0.0-beta.3 | 141 | 10/5/2025 |
2.0.0-beta.2 | 198 | 10/1/2025 |
2.0.0-beta.1 | 188 | 9/27/2025 |
1.6.1 | 572 | 10/9/2025 |
1.6.0 | 332 | 10/1/2025 |
1.5.2 | 499 | 9/16/2025 |
1.5.1 | 431 | 8/25/2025 |
1.5.0 | 231 | 7/30/2025 |
1.4.5 | 342 | 7/10/2025 |
1.4.4 | 365 | 7/7/2025 |
1.4.3 | 376 | 6/23/2025 |
1.4.2 | 585 | 6/11/2025 |
1.4.1 | 266 | 6/2/2025 |
1.4.0 | 210 | 5/27/2025 |
1.3.1 | 639 | 5/19/2025 |
1.3.0 | 171 | 4/26/2025 |
## Changes since 2.0.0 Beta 7
* Update ``IProcessInvoker`` to allow specifying ``ProcessConfiguration`` disposal after invoker use
* Clarified OS support for ``IProcessResourcePolicyBuilder`` methods
* Renamed ``IEnvironmentVariablesBuilder`` methods to avoid ambiguous method usage