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

  1. Catch NotSupportedException around per-extension-member decompilation and skip the offending member.
  2. 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

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


AI-assisted analysis of icsharpcode/ILSpy@60c08fcb74 (2026-08-13). Data as JSON: /api/errors/8f87101f669d87ac. Report an issue: GitHub.