microsoft/semantic-kernel · error · KernelException

Unable to create inner step type from assembly qualified…

Error message

Unable to create inner step type from assembly qualified name `{this.InnerStepDotnetType}`

What it means

Thrown when Type.GetType cannot resolve the InnerStepDotnetType assembly-qualified name to a .NET Type. The Dapr runtime stores each step's fully qualified type name and must rehydrate it; if the assembly is missing or the name is malformed, type resolution returns null.

Solutions

  1. Ensure the assembly containing the KernelProcessStep type is deployed and loaded by the Dapr actor host process.
  2. Verify InnerStepDotnetType is a full assembly-qualified name (includes assembly, version, culture, PublicKeyToken) as Type.GetType requires.
  3. If the type was renamed/moved, register an AssemblyLoadContext or TypeForwardedFrom redirection, or re-persist the process with the new type name.
  4. Check for trimming/AOT settings that may have stripped the type metadata.
Defensive patterns

Strategy: validation

Validate before calling

foreach (var step in daprSteps)
{
    var t = Type.GetType(step.InnerStepDotnetType);
    if (t is null)
        throw new InvalidOperationException($"Cannot resolve type '{step.InnerStepDotnetType}'; load the assembly first.");
}

Type guard

public static bool IsResolvableStepType(string assemblyQualifiedTypeName) =>
    Type.GetType(assemblyQualifiedTypeName) is not null;

Try / catch

try
{
    var info = daprStepInfo.ToKernelProcessStepInfo();
}
catch (KernelException ex) when (ex.Message.Contains("Unable to create inner step type"))
{
    _logger.LogError(ex, "Step type assembly not loaded; verify deployment.");
    throw;
}

Prevention

When it happens

Trigger: DaprStepInfo.ToKernelProcessStepInfo() calls Type.GetType(this.InnerStepDotnetType); a null result means the runtime cannot find the assembly or the type within it.

Common situations: The step type lives in an assembly not loaded by the Dapr actor host, the assembly-qualified name was truncated/stored without assembly info, or the type was renamed/moved between versions. Common when deploying actors separately from the step definition assemblies.

Related errors


AI-assisted analysis of microsoft/semantic-kernel@c028a0c7dc (2026-08-13). Data as JSON: /api/errors/9b18558e01e89c32. Report an issue: GitHub.

Appendix: source

Thrown at dotnet/src/Experimental/Process.Runtime.Dapr/DaprStepInfo.cs:50

    /// </summary>
    public required KernelProcessStepState State { get; init; }

    /// <summary>
    /// A read-only dictionary of output edges from the Step.
    /// </summary>
    public required Dictionary<string, List<KernelProcessEdge>> Edges { get; init; }

    /// <summary>
    /// Builds an instance of <see cref="KernelProcessStepInfo"/> from the current object.
    /// </summary>
    /// <returns>An instance of <see cref="KernelProcessStepInfo"/></returns>
    /// <exception cref="KernelException"></exception>
    public KernelProcessStepInfo ToKernelProcessStepInfo()
    {
        Type? innerStepType = Type.GetType(this.InnerStepDotnetType);
        if (innerStepType is null)
        {
            throw new KernelException($"Unable to create inner step type from assembly qualified name `{this.InnerStepDotnetType}`");
        }

        if (!typeof(KernelProcessStep).IsAssignableFrom(innerStepType))
        {
            throw new KernelException($"Type '{this.InnerStepDotnetType}' is not a valid KernelProcessStep type.");
        }

        return new KernelProcessStepInfo(innerStepType, this.State, this.Edges);
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="DaprStepInfo"/> class from an instance of <see cref="KernelProcessStepInfo"/>.
    /// </summary>
    /// <returns>An instance of <see cref="DaprStepInfo"/></returns>
    public static DaprStepInfo FromKernelStepInfo(KernelProcessStepInfo kernelStepInfo)
    {
        Verify.NotNull(kernelStepInfo, nameof(kernelStepInfo));

View on GitHub (pinned to c028a0c7dc)