icsharpcode/ILSpy · error · NotSupportedException
Extension member {extMember} is not supported for decompilat
Error message
Extension member {extMember} is not supported for decompilation. What it means
NotSupportedException from DoDecompileExtensionMembers' default case: an extension-group member that is neither IProperty nor IMethod. Extension members in this codebase are decompiled only for properties and methods; anything else (an event or field marked as an extension member) is unsupported.
Source
Thrown at ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs:2076
var prop = DoDecompile(p, decompileRun, decompilationContext.WithCurrentMember(p), extensionInfo);
RemoveAttribute(prop, KnownAttribute.ExtensionMarker);
if (p.Getter != null)
{
RemoveAttribute(prop.GetChild(Slots.Getter)!, KnownAttribute.ExtensionMarker);
}
if (p.Setter != null)
{
RemoveAttribute(prop.GetChild(Slots.Setter)!, KnownAttribute.ExtensionMarker);
}
extMemberDecl = prop;
break;
case IMethod m:
var meth = DoDecompile(m, decompileRun, decompilationContext.WithCurrentMember(m), extensionInfo);
RemoveAttribute(meth, KnownAttribute.ExtensionMarker);
extMemberDecl = meth;
break;
default:
throw new NotSupportedException($"Extension member {extMember} is not supported for decompilation.");
}
ext.Members.Add(extMemberDecl);
entityMap.Add(extMember, extMemberDecl);
}
}
}
EnumValueDisplayMode DetectBestEnumValueDisplayMode(ITypeDefinition typeDef, MetadataFile module)
{
if (typeDef.HasAttribute(KnownAttribute.Flags))
return EnumValueDisplayMode.AllHex;
bool first = true;
long firstValue = 0, previousValue = 0;
bool allPowersOfTwo = true;
bool allConsecutive = true;
foreach (var field in typeDef.Fields)
{
if (MemberIsHidden(module, field.MetadataToken, settings))
View on GitHub (pinned to 60c08fcb74)
Solutions
- Catch NotSupportedException around per-extension-member decompilation and skip the offending member.
- Disable settings.ExtensionMembers if extension-block decompilation is not required.
Defensive patterns
Strategy: try-catch
Validate before calling
// If you do not need VB-style extension blocks, disable the feature to make the path unreachable: settings.ExtensionMembers = false;
Try / catch
try {
var tree = decompiler.Decompile(handle);
} catch (NotSupportedException ex) when (ex.Message.Contains("Extension member")) {
logger.Warning("Skipping unsupported extension member: {Message}", ex.Message);
} Prevention
- Set DecompilerSettings.ExtensionMembers = false unless you specifically need VB-style extension blocks.
- Catch NotSupportedException per extension member so one bad member does not abort the type.
When it happens
Trigger: Decompiling an assembly (typically VB.NET) whose extension group contains an event or field member, with settings.ExtensionMembers enabled.
Common situations: VB assemblies with extension members beyond methods/properties; experimental metadata that marks unusual members with the extension marker.
Related errors
- types contains null element
- Could not find type definition {fullTypeName} in type system
- definitions contains null element
- handle
- HandleKind {handle.Kind} is not supported!
AI-assisted analysis of icsharpcode/ILSpy@60c08fcb74 (2026-08-13).
Data as JSON: /api/errors/8f87101f669d87ac.
Report an issue: GitHub.