microsoft/semantic-kernel · error · KernelException

Unable to create inner step type from assembly qualified nam

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.

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)

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.