Skip to content

Crash using extension property in expression evaluator #81171

@333fred

Description

@333fred

Discussed in #81170

Originally posted by nathan130200 November 11, 2025
I opened an discussion because i don't know if this is related to VS2026 debugger or roslyn/C# compiler.

Basically if we add any expression to Watch window or try view in Immediate Window an expression (not critical beause program keeps running) when trying to inspect an extension property:

element.TagName
Internal error in the C# compiler
    Compiler Exception Type: System.InvalidCastException
    Compiler Exception Message: Não é possível converter um objeto do tipo 'PENamedTypeSymbolNonGeneric' no tipo 'Microsoft.CodeAnalysis.CSharp.Symbols.SourceMemberContainerTypeSymbol'.
    Compiler Exception Stack Trace: Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol.Microsoft.Cci.ITypeMemberReference.GetContainingType(EmitContext)+0x76
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.CodeGen.ReferenceDependencyWalker.VisitMethodReference(IMethodReference, EmitContext)+0x0
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.CodeGen.ReferenceDependencyWalker.VisitReference(IReference, EmitContext)+0x36
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.<EmitInstanceCallExpression>g__emitArgumentsAndCallEpilogue|163_2(BoundCall, CallKind, UseKind)+0x0
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.EmitInstanceCallExpression(BoundCall, UseKind)+0x19D
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.EmitExpressionCore(BoundExpression, Boolean)+0x1CE
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.EmitExpressionCoreWithStackGuard(BoundExpression, Boolean)+0x0
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.EmitExpression(BoundExpression, Boolean)+0x7D
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.EmitReturnStatement(BoundReturnStatement)+0xF
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.EmitStatement(BoundStatement)+0x135
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.EmitStatements(ImmutableArray`1)+0x19
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.EmitUninstrumentedBlock(BoundBlock)+0x8D
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.EmitStatement(BoundStatement)+0x96
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.GenerateImpl()+0x33
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.MethodCompiler.GenerateMethodBody(PEModuleBuilder, MethodSymbol, Int32, BoundStatement, ImmutableArray`1, ImmutableArray`1, ImmutableArray`1, ImmutableArray`1, StateMachineTypeSymbol, VariableSlotAllocator, BindingDiagnosticBag, DebugDocumentProvider, ImportChain, Boolean, ImmutableArray`1, AsyncForwardEntryPoint)+0xF9
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileSynthesizedMethods(TypeCompilationState)+0x125
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileSynthesizedMethods(ImmutableArray`1, BindingDiagnosticBag)+0x61
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethodBodies(CSharpCompilation, PEModuleBuilder, Boolean, Boolean, Boolean, BindingDiagnosticBag, Predicate`1, CancellationToken)+0x93
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CompileMethods(CommonPEModuleBuilder, Boolean, DiagnosticBag, Predicate`1, CancellationToken)+0x159
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.Compilation.Compile(CommonPEModuleBuilder, Boolean, DiagnosticBag, Predicate`1, CancellationToken)+0x0
Microsoft.CodeAnalysis.CSharp.ExpressionEvaluator.ExpressionCompiler.dll!Microsoft.CodeAnalysis.CSharp.ExpressionEvaluator.CompilationContext.TryCompileExpression(CSharpSyntaxNode, String, String, ImmutableArray`1, CompilationTestData, DiagnosticBag, CommonPEModuleBuilder&, EEMethodSymbol&)+0x3C
Microsoft.CodeAnalysis.CSharp.ExpressionEvaluator.ExpressionCompiler.dll!Microsoft.CodeAnalysis.CSharp.ExpressionEvaluator.EvaluationContext.CompileExpression(String, DkmEvaluationFlags, ImmutableArray`1, DiagnosticBag, ResultProperties&, CompilationTestData)+0xEB
Microsoft.CodeAnalysis.ExpressionEvaluator.ExpressionCompiler.dll!Microsoft.CodeAnalysis.ExpressionEvaluator.ExpressionCompiler+<>c__DisplayClass6_1.<Microsoft.VisualStudio.Debugger.ComponentInterfaces.IDkmClrExpressionCompiler.CompileExpression>b__1(EvaluationContextBase, DiagnosticBag)+0x0
Microsoft.CodeAnalysis.ExpressionEvaluator.ExpressionCompiler.dll!Microsoft.CodeAnalysis.ExpressionEvaluator.ExpressionCompiler.TryCompileWithRetry<TResult>(ImmutableArray`1, DiagnosticFormatter, CreateContextDelegate, CompileDelegate`1, GetMetadataBytesPtrFunction, TResult&, String&)+0x4B
Microsoft.CodeAnalysis.ExpressionEvaluator.ExpressionCompiler.dll!Microsoft.CodeAnalysis.ExpressionEvaluator.ExpressionCompiler.Microsoft.VisualStudio.Debugger.ComponentInterfaces.IDkmClrExpressionCompiler.CompileExpression(DkmLanguageExpression, DkmClrInstructionAddress, DkmInspectionContext, String&, DkmCompiledClrInspectionQuery&)+0x0
Microsoft.VisualStudio.Debugger.Engine.dll!Microsoft.VisualStudio.Debugger.EntryPoint.IDkmClrExpressionCompiler_CompileExpression(IntPtr, IntPtr, IntPtr, IntPtr, IntPtr&, IntPtr&)+0x44
mscorlib.dll!System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()+0xC
Microsoft.VisualStudio.Debugger.Engine.dll!XapiExceptionProcessing.ThrowHR(Int32, Boolean)+0x14
Microsoft.VisualStudio.Debugger.Engine.dll!Microsoft.VisualStudio.Debugger.Evaluation.DkmLanguageExpression.CompileExpression(DkmClrInstructionAddress, DkmInspectionContext, String&, DkmCompiledClrInspectionQuery&)+0x5D
vsdebugeng.manimpl.dll!VSDebugEngine.ManagedEE.EntryPoint.Microsoft.VisualStudio.Debugger.ComponentInterfaces.IDkmLanguageExpressionEvaluator.EvaluateExpression(DkmInspectionContext, DkmWorkList, DkmLanguageExpression, DkmStackWalkFrame, DkmCompletionRoutine`1)+0x194

The code by the way (using .NET with extension members):

Details
using System.Diagnostics;
using System.Xml.Linq;

var element = XElement.Parse("<s:foo xmlns:s='urn:xml:foo'><bar/></s:foo>");

Debugger.Break();

element.TagName = "s:bar";

// even after setting TagName property, the exception still throw in debugger window.
// But all changes is done to XElement instance, only throw in debugger, because this i opened an
// discussion instead of an issue and since it don't crash application we can just ignore.

Debugger.Break();


public static class XmlLinqExtensions
{
    static string? ExtractPrefix(string s, out int ofs)
    {
        ofs = s.IndexOf(':');
        return ofs > 0 ? s[0..ofs] : null;
    }

    extension(XElement element)
    {
        public string TagName
        {
            get
            {
                var name = element.Name;
                var prefix = element.GetPrefixOfNamespace(name.Namespace);

                if (prefix == null)
                    return name.LocalName;

                return string.Concat(prefix, ':', name.LocalName);
            }
            set
            {
                var prefix = ExtractPrefix(value, out int ofs);

                string localName = ofs > 0 ? value[(ofs + 1)..] : value;

                var ns = element.GetNamespaceOfPrefix(prefix ?? string.Empty) ?? XNamespace.None;

                element.Name = ns + localName;
            }
        }
    }
}

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions