dotnet/BenchmarkDotNet · error · InvalidOperationException
Unable to invoke 'GetRunnerPath'.
Error message
Unable to invoke 'GetRunnerPath'.
What it means
GetRunnerPath's final guard for dotTrace: GetRunnerPath was found and invoked but returned null / not castable to string. The method exists but produced no usable runner path, usually because the prerequisite runner binary was never extracted.
Source
Thrown at src/BenchmarkDotNet.Diagnostics.dotTrace/DotTraceDiagnoser.cs:68
protected override string GetRunnerPath()
{
var consoleRunnerPackageField = typeof(DotTrace).GetField("ConsoleRunnerPackage", BindingFlags.NonPublic | BindingFlags.Static);
if (consoleRunnerPackageField == null)
throw new InvalidOperationException("Field 'ConsoleRunnerPackage' not found.");
object? consoleRunnerPackage = consoleRunnerPackageField.GetValue(null);
if (consoleRunnerPackage == null)
throw new InvalidOperationException("Unable to get value of 'ConsoleRunnerPackage'.");
var consoleRunnerPackageType = consoleRunnerPackage.GetType();
var getRunnerPathMethod = consoleRunnerPackageType.GetMethod("GetRunnerPath");
if (getRunnerPathMethod == null)
throw new InvalidOperationException("Method 'GetRunnerPath' not found.");
string? runnerPath = getRunnerPathMethod.Invoke(consoleRunnerPackage, null) as string;
if (runnerPath == null)
throw new InvalidOperationException("Unable to invoke 'GetRunnerPath'.");
return runnerPath;
}
internal override bool IsSupported(RuntimeMoniker runtimeMoniker)
{
switch (runtimeMoniker)
{
case RuntimeMoniker.HostProcess:
case RuntimeMoniker.Net461:
case RuntimeMoniker.Net462:
case RuntimeMoniker.Net47:
case RuntimeMoniker.Net471:
case RuntimeMoniker.Net472:
case RuntimeMoniker.Net48:
case RuntimeMoniker.Net481:
case RuntimeMoniker.Net50:
case RuntimeMoniker.Net60:View on GitHub (pinned to b515068b61)
Solutions
- Delete the cached prerequisite directory and re-run InitAsync to re-download and extract cleanly.
- Verify disk space and write permissions for the cache path.
- Check/reconfigure antivirus that may quarantine the JetBrains runner.
- Align the SelfApi version with your BDN build.
Defensive patterns
Strategy: fallback
Try / catch
try { /* use dotTrace diagnoser */ }
catch (InvalidOperationException ex) when (ex.Message.Contains("Unable to invoke 'GetRunnerPath'"))
{
log.Error("dotTrace runner not extracted; check disk/AV/cache and re-run InitAsync.");
} Prevention
- Clear the prerequisite cache so InitAsync re-extracts the runner cleanly.
- Ensure disk space and write permissions for the cache path.
- Check antivirus quarantine rules for the JetBrains runner exe.
When it happens
Trigger: InitAsync downloaded the prerequisite but the runner executable was not extracted to the expected location, so GetRunnerPath returns null; or the invocation failed internally and SelfApi swallowed it into a null return.
Common situations: Corrupted/interrupted prerequisite download or extraction; antivirus quarantining the runner exe; insufficient disk space/permissions; leftover partial state from a prior failed run.
Related errors
- Unable to get value of 'ConsoleRunnerPackage'.
- Unable to get value of 'ConsoleRunnerPackage'.
- Unable to invoke 'GetRunnerPath'.
- Field 'ConsoleRunnerPackage' not found.
- Method 'GetRunnerPath' not found.
AI-assisted analysis of dotnet/BenchmarkDotNet@b515068b61 (2026-08-13).
Data as JSON: /api/errors/0b2b48310ed7b19d.
Report an issue: GitHub.