Fix COMDelegate::BindToMethod with static virtuals - #125875

Merged
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58
Mar 26, 2026
Merged

Fix COMDelegate::BindToMethod with static virtuals#125875
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

The code was incorrectly using VSD stubs for them which led to runtime asserts.

The code was incorrectly using VSD stubs for them which led to runtime asserts.
@jkotas

Copy link
Copy Markdown
Member

Do we need a test?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do we need a test?

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all (I hit the asserts while working on another PR that hit it differently).

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@jkotas

jkotas commented Mar 21, 2026

Copy link
Copy Markdown
Member

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all

I think it should work. @MichalStrehovsky Do you agree?

Removed TODO comment regarding VSD compilation and virtuals.
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

If there's no trim/AOT warning, the code should work with NAOT. There was a TODO that was unnecessarily blocking this, I pushed out a change to remove it (we still don't allow invoking these virtually but that's because there's no reflection API for that; we'd fix that if there ever is an API).

@jkotas

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Removed comments about NativeAOT behavior and kept attributes.
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky The assertion failure in NAOT after your changes seem related, do you want to look into it yourself or should I try to do it myself?

2026-03-24T01:11:08.3931510Z Generating native code
2026-03-24T01:11:15.0790590Z Process terminated.
2026-03-24T01:11:15.0794205Z Assertion failed.
2026-03-24T01:11:15.0794593Z method.IsVirtual || (method.Signature.IsStatic && !method.OwningType.IsInterface)
2026-03-24T01:11:15.0795212Z at ILCompiler.DependencyAnalysis.GenericVirtualMethodImplNode..ctor(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericVirtualMethodImplNode.cs:line 27
2026-03-24T01:11:15.0795939Z at ILCompiler.DependencyAnalysis.NodeFactory.<>c.<CreateNodeCaches>b__47_20(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs:line 339
2026-03-24T01:11:15.0796840Z at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
2026-03-24T01:11:15.0797506Z at ILCompiler.DependencyAnalysis.GVMDependenciesNode.SearchDynamicDependencies(List`1 markedNodes, Int32 firstNode, NodeFactory factory) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GVMDependenciesNode.cs:line 155
2026-03-24T01:11:15.0798355Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.DynamicDependencyNode.MarkNewDynamicDependencies(DependencyAnalyzer`2 analyzer) in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 92
2026-03-24T01:11:15.0799083Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ProcessMarkStack() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 286
2026-03-24T01:11:15.0799731Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ComputeMarkedNodes() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 308
2026-03-24T01:11:15.0800320Z at ILCompiler.ILScanner.ILCompiler.IILScanner.Scan() in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ILScanner.cs:line 155
2026-03-24T01:11:15.0800854Z at ILCompiler.Program.<Run>g__RunScanner|4_0(<>c__DisplayClass4_0&) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 530
2026-03-24T01:11:15.0801348Z at ILCompiler.Program.Run() in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 511
2026-03-24T01:11:15.0801859Z at ILCompiler.ILCompilerRootCommand.<>c__DisplayClass264_0.<.ctor>b__0(ParseResult result) in /_/src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.cs:line 318
2026-03-24T01:11:15.0802369Z at System.CommandLine.Invocation.InvocationPipeline.Invoke(ParseResult parseResult)
2026-03-24T01:11:15.0802820Z at ILCompiler.Program.Main(String[] args) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 847
2026-03-24T01:11:16.8314035Z ##[error]artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: (NETCORE_ENGINEERING_TELEMETRY=Build) The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134.
2026-03-24T01:11:16.8315773Z /__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134. [/__w/1/s/src/libraries/System.Runtime/tests/System.Runtime.Tests/System.Runtime.Tests.csproj::TargetFramework=net11.0-unix]

The assert is only trying to approximate the thing it's asserting since we lack the API to check "is this method a MethodImpl?".
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NAOT failures seem unrelated now, is this good to merge?

@MichalStrehovskyMichalStrehovsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM but I did half of the change :)

@jkotas

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

They are known, the Pri1 test tree is not buildable (not specific to native AOT): #126108 (comment)

@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the pri1 test run looked good in the previous outerloop iteration and we only relaxed an assert since then. the pri1 break is known.

@MichalStrehovsky
MichalStrehovsky merged commit ac11e33 into dotnet:mainMar 26, 2026
165 of 174 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community memberlinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MichalPetryka@jkotas@MichalStrehovsky
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Fix COMDelegate::BindToMethod with static virtuals - #125875

Merged
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58
Mar 26, 2026
Merged

Fix COMDelegate::BindToMethod with static virtuals#125875
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

The code was incorrectly using VSD stubs for them which led to runtime asserts.

The code was incorrectly using VSD stubs for them which led to runtime asserts.
@jkotas

Copy link
Copy Markdown
Member

Do we need a test?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do we need a test?

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all (I hit the asserts while working on another PR that hit it differently).

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@jkotas

jkotas commented Mar 21, 2026

Copy link
Copy Markdown
Member

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all

I think it should work. @MichalStrehovsky Do you agree?

Removed TODO comment regarding VSD compilation and virtuals.
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

If there's no trim/AOT warning, the code should work with NAOT. There was a TODO that was unnecessarily blocking this, I pushed out a change to remove it (we still don't allow invoking these virtually but that's because there's no reflection API for that; we'd fix that if there ever is an API).

@jkotas

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Removed comments about NativeAOT behavior and kept attributes.
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky The assertion failure in NAOT after your changes seem related, do you want to look into it yourself or should I try to do it myself?

2026-03-24T01:11:08.3931510Z Generating native code
2026-03-24T01:11:15.0790590Z Process terminated.
2026-03-24T01:11:15.0794205Z Assertion failed.
2026-03-24T01:11:15.0794593Z method.IsVirtual || (method.Signature.IsStatic && !method.OwningType.IsInterface)
2026-03-24T01:11:15.0795212Z at ILCompiler.DependencyAnalysis.GenericVirtualMethodImplNode..ctor(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericVirtualMethodImplNode.cs:line 27
2026-03-24T01:11:15.0795939Z at ILCompiler.DependencyAnalysis.NodeFactory.<>c.<CreateNodeCaches>b__47_20(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs:line 339
2026-03-24T01:11:15.0796840Z at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
2026-03-24T01:11:15.0797506Z at ILCompiler.DependencyAnalysis.GVMDependenciesNode.SearchDynamicDependencies(List`1 markedNodes, Int32 firstNode, NodeFactory factory) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GVMDependenciesNode.cs:line 155
2026-03-24T01:11:15.0798355Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.DynamicDependencyNode.MarkNewDynamicDependencies(DependencyAnalyzer`2 analyzer) in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 92
2026-03-24T01:11:15.0799083Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ProcessMarkStack() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 286
2026-03-24T01:11:15.0799731Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ComputeMarkedNodes() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 308
2026-03-24T01:11:15.0800320Z at ILCompiler.ILScanner.ILCompiler.IILScanner.Scan() in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ILScanner.cs:line 155
2026-03-24T01:11:15.0800854Z at ILCompiler.Program.<Run>g__RunScanner|4_0(<>c__DisplayClass4_0&) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 530
2026-03-24T01:11:15.0801348Z at ILCompiler.Program.Run() in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 511
2026-03-24T01:11:15.0801859Z at ILCompiler.ILCompilerRootCommand.<>c__DisplayClass264_0.<.ctor>b__0(ParseResult result) in /_/src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.cs:line 318
2026-03-24T01:11:15.0802369Z at System.CommandLine.Invocation.InvocationPipeline.Invoke(ParseResult parseResult)
2026-03-24T01:11:15.0802820Z at ILCompiler.Program.Main(String[] args) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 847
2026-03-24T01:11:16.8314035Z ##[error]artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: (NETCORE_ENGINEERING_TELEMETRY=Build) The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134.
2026-03-24T01:11:16.8315773Z /__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134. [/__w/1/s/src/libraries/System.Runtime/tests/System.Runtime.Tests/System.Runtime.Tests.csproj::TargetFramework=net11.0-unix]

The assert is only trying to approximate the thing it's asserting since we lack the API to check "is this method a MethodImpl?".
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NAOT failures seem unrelated now, is this good to merge?

@MichalStrehovskyMichalStrehovsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM but I did half of the change :)

@jkotas

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

They are known, the Pri1 test tree is not buildable (not specific to native AOT): #126108 (comment)

@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the pri1 test run looked good in the previous outerloop iteration and we only relaxed an assert since then. the pri1 break is known.

@MichalStrehovsky
MichalStrehovsky merged commit ac11e33 into dotnet:mainMar 26, 2026
165 of 174 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community memberlinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MichalPetryka@jkotas@MichalStrehovsky
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix COMDelegate::BindToMethod with static virtuals - #125875

Merged
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58
Mar 26, 2026
Merged

Fix COMDelegate::BindToMethod with static virtuals#125875
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

The code was incorrectly using VSD stubs for them which led to runtime asserts.

The code was incorrectly using VSD stubs for them which led to runtime asserts.
@jkotas

Copy link
Copy Markdown
Member

Do we need a test?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do we need a test?

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all (I hit the asserts while working on another PR that hit it differently).

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@jkotas

jkotas commented Mar 21, 2026

Copy link
Copy Markdown
Member

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all

I think it should work. @MichalStrehovsky Do you agree?

Removed TODO comment regarding VSD compilation and virtuals.
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

If there's no trim/AOT warning, the code should work with NAOT. There was a TODO that was unnecessarily blocking this, I pushed out a change to remove it (we still don't allow invoking these virtually but that's because there's no reflection API for that; we'd fix that if there ever is an API).

@jkotas

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Removed comments about NativeAOT behavior and kept attributes.
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky The assertion failure in NAOT after your changes seem related, do you want to look into it yourself or should I try to do it myself?

2026-03-24T01:11:08.3931510Z Generating native code
2026-03-24T01:11:15.0790590Z Process terminated.
2026-03-24T01:11:15.0794205Z Assertion failed.
2026-03-24T01:11:15.0794593Z method.IsVirtual || (method.Signature.IsStatic && !method.OwningType.IsInterface)
2026-03-24T01:11:15.0795212Z at ILCompiler.DependencyAnalysis.GenericVirtualMethodImplNode..ctor(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericVirtualMethodImplNode.cs:line 27
2026-03-24T01:11:15.0795939Z at ILCompiler.DependencyAnalysis.NodeFactory.<>c.<CreateNodeCaches>b__47_20(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs:line 339
2026-03-24T01:11:15.0796840Z at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
2026-03-24T01:11:15.0797506Z at ILCompiler.DependencyAnalysis.GVMDependenciesNode.SearchDynamicDependencies(List`1 markedNodes, Int32 firstNode, NodeFactory factory) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GVMDependenciesNode.cs:line 155
2026-03-24T01:11:15.0798355Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.DynamicDependencyNode.MarkNewDynamicDependencies(DependencyAnalyzer`2 analyzer) in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 92
2026-03-24T01:11:15.0799083Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ProcessMarkStack() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 286
2026-03-24T01:11:15.0799731Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ComputeMarkedNodes() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 308
2026-03-24T01:11:15.0800320Z at ILCompiler.ILScanner.ILCompiler.IILScanner.Scan() in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ILScanner.cs:line 155
2026-03-24T01:11:15.0800854Z at ILCompiler.Program.<Run>g__RunScanner|4_0(<>c__DisplayClass4_0&) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 530
2026-03-24T01:11:15.0801348Z at ILCompiler.Program.Run() in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 511
2026-03-24T01:11:15.0801859Z at ILCompiler.ILCompilerRootCommand.<>c__DisplayClass264_0.<.ctor>b__0(ParseResult result) in /_/src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.cs:line 318
2026-03-24T01:11:15.0802369Z at System.CommandLine.Invocation.InvocationPipeline.Invoke(ParseResult parseResult)
2026-03-24T01:11:15.0802820Z at ILCompiler.Program.Main(String[] args) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 847
2026-03-24T01:11:16.8314035Z ##[error]artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: (NETCORE_ENGINEERING_TELEMETRY=Build) The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134.
2026-03-24T01:11:16.8315773Z /__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134. [/__w/1/s/src/libraries/System.Runtime/tests/System.Runtime.Tests/System.Runtime.Tests.csproj::TargetFramework=net11.0-unix]

The assert is only trying to approximate the thing it's asserting since we lack the API to check "is this method a MethodImpl?".
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NAOT failures seem unrelated now, is this good to merge?

@MichalStrehovskyMichalStrehovsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM but I did half of the change :)

@jkotas

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

They are known, the Pri1 test tree is not buildable (not specific to native AOT): #126108 (comment)

@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the pri1 test run looked good in the previous outerloop iteration and we only relaxed an assert since then. the pri1 break is known.

@MichalStrehovsky
MichalStrehovsky merged commit ac11e33 into dotnet:mainMar 26, 2026
165 of 174 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community memberlinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MichalPetryka@jkotas@MichalStrehovsky
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix COMDelegate::BindToMethod with static virtuals - #125875

Merged
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58
Mar 26, 2026
Merged

Fix COMDelegate::BindToMethod with static virtuals#125875
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

The code was incorrectly using VSD stubs for them which led to runtime asserts.

The code was incorrectly using VSD stubs for them which led to runtime asserts.
@jkotas

Copy link
Copy Markdown
Member

Do we need a test?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do we need a test?

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all (I hit the asserts while working on another PR that hit it differently).

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@jkotas

jkotas commented Mar 21, 2026

Copy link
Copy Markdown
Member

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all

I think it should work. @MichalStrehovsky Do you agree?

Removed TODO comment regarding VSD compilation and virtuals.
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

If there's no trim/AOT warning, the code should work with NAOT. There was a TODO that was unnecessarily blocking this, I pushed out a change to remove it (we still don't allow invoking these virtually but that's because there's no reflection API for that; we'd fix that if there ever is an API).

@jkotas

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Removed comments about NativeAOT behavior and kept attributes.
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky The assertion failure in NAOT after your changes seem related, do you want to look into it yourself or should I try to do it myself?

2026-03-24T01:11:08.3931510Z Generating native code
2026-03-24T01:11:15.0790590Z Process terminated.
2026-03-24T01:11:15.0794205Z Assertion failed.
2026-03-24T01:11:15.0794593Z method.IsVirtual || (method.Signature.IsStatic && !method.OwningType.IsInterface)
2026-03-24T01:11:15.0795212Z at ILCompiler.DependencyAnalysis.GenericVirtualMethodImplNode..ctor(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericVirtualMethodImplNode.cs:line 27
2026-03-24T01:11:15.0795939Z at ILCompiler.DependencyAnalysis.NodeFactory.<>c.<CreateNodeCaches>b__47_20(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs:line 339
2026-03-24T01:11:15.0796840Z at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
2026-03-24T01:11:15.0797506Z at ILCompiler.DependencyAnalysis.GVMDependenciesNode.SearchDynamicDependencies(List`1 markedNodes, Int32 firstNode, NodeFactory factory) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GVMDependenciesNode.cs:line 155
2026-03-24T01:11:15.0798355Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.DynamicDependencyNode.MarkNewDynamicDependencies(DependencyAnalyzer`2 analyzer) in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 92
2026-03-24T01:11:15.0799083Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ProcessMarkStack() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 286
2026-03-24T01:11:15.0799731Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ComputeMarkedNodes() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 308
2026-03-24T01:11:15.0800320Z at ILCompiler.ILScanner.ILCompiler.IILScanner.Scan() in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ILScanner.cs:line 155
2026-03-24T01:11:15.0800854Z at ILCompiler.Program.<Run>g__RunScanner|4_0(<>c__DisplayClass4_0&) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 530
2026-03-24T01:11:15.0801348Z at ILCompiler.Program.Run() in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 511
2026-03-24T01:11:15.0801859Z at ILCompiler.ILCompilerRootCommand.<>c__DisplayClass264_0.<.ctor>b__0(ParseResult result) in /_/src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.cs:line 318
2026-03-24T01:11:15.0802369Z at System.CommandLine.Invocation.InvocationPipeline.Invoke(ParseResult parseResult)
2026-03-24T01:11:15.0802820Z at ILCompiler.Program.Main(String[] args) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 847
2026-03-24T01:11:16.8314035Z ##[error]artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: (NETCORE_ENGINEERING_TELEMETRY=Build) The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134.
2026-03-24T01:11:16.8315773Z /__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134. [/__w/1/s/src/libraries/System.Runtime/tests/System.Runtime.Tests/System.Runtime.Tests.csproj::TargetFramework=net11.0-unix]

The assert is only trying to approximate the thing it's asserting since we lack the API to check "is this method a MethodImpl?".
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NAOT failures seem unrelated now, is this good to merge?

@MichalStrehovskyMichalStrehovsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM but I did half of the change :)

@jkotas

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

They are known, the Pri1 test tree is not buildable (not specific to native AOT): #126108 (comment)

@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the pri1 test run looked good in the previous outerloop iteration and we only relaxed an assert since then. the pri1 break is known.

@MichalStrehovsky
MichalStrehovsky merged commit ac11e33 into dotnet:mainMar 26, 2026
165 of 174 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community memberlinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MichalPetryka@jkotas@MichalStrehovsky
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Fix COMDelegate::BindToMethod with static virtuals - #125875

Merged
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58
Mar 26, 2026
Merged

Fix COMDelegate::BindToMethod with static virtuals#125875
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

The code was incorrectly using VSD stubs for them which led to runtime asserts.

The code was incorrectly using VSD stubs for them which led to runtime asserts.
@jkotas

Copy link
Copy Markdown
Member

Do we need a test?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do we need a test?

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all (I hit the asserts while working on another PR that hit it differently).

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@jkotas

jkotas commented Mar 21, 2026

Copy link
Copy Markdown
Member

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all

I think it should work. @MichalStrehovsky Do you agree?

Removed TODO comment regarding VSD compilation and virtuals.
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

If there's no trim/AOT warning, the code should work with NAOT. There was a TODO that was unnecessarily blocking this, I pushed out a change to remove it (we still don't allow invoking these virtually but that's because there's no reflection API for that; we'd fix that if there ever is an API).

@jkotas

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Removed comments about NativeAOT behavior and kept attributes.
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky The assertion failure in NAOT after your changes seem related, do you want to look into it yourself or should I try to do it myself?

2026-03-24T01:11:08.3931510Z Generating native code
2026-03-24T01:11:15.0790590Z Process terminated.
2026-03-24T01:11:15.0794205Z Assertion failed.
2026-03-24T01:11:15.0794593Z method.IsVirtual || (method.Signature.IsStatic && !method.OwningType.IsInterface)
2026-03-24T01:11:15.0795212Z at ILCompiler.DependencyAnalysis.GenericVirtualMethodImplNode..ctor(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericVirtualMethodImplNode.cs:line 27
2026-03-24T01:11:15.0795939Z at ILCompiler.DependencyAnalysis.NodeFactory.<>c.<CreateNodeCaches>b__47_20(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs:line 339
2026-03-24T01:11:15.0796840Z at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
2026-03-24T01:11:15.0797506Z at ILCompiler.DependencyAnalysis.GVMDependenciesNode.SearchDynamicDependencies(List`1 markedNodes, Int32 firstNode, NodeFactory factory) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GVMDependenciesNode.cs:line 155
2026-03-24T01:11:15.0798355Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.DynamicDependencyNode.MarkNewDynamicDependencies(DependencyAnalyzer`2 analyzer) in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 92
2026-03-24T01:11:15.0799083Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ProcessMarkStack() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 286
2026-03-24T01:11:15.0799731Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ComputeMarkedNodes() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 308
2026-03-24T01:11:15.0800320Z at ILCompiler.ILScanner.ILCompiler.IILScanner.Scan() in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ILScanner.cs:line 155
2026-03-24T01:11:15.0800854Z at ILCompiler.Program.<Run>g__RunScanner|4_0(<>c__DisplayClass4_0&) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 530
2026-03-24T01:11:15.0801348Z at ILCompiler.Program.Run() in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 511
2026-03-24T01:11:15.0801859Z at ILCompiler.ILCompilerRootCommand.<>c__DisplayClass264_0.<.ctor>b__0(ParseResult result) in /_/src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.cs:line 318
2026-03-24T01:11:15.0802369Z at System.CommandLine.Invocation.InvocationPipeline.Invoke(ParseResult parseResult)
2026-03-24T01:11:15.0802820Z at ILCompiler.Program.Main(String[] args) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 847
2026-03-24T01:11:16.8314035Z ##[error]artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: (NETCORE_ENGINEERING_TELEMETRY=Build) The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134.
2026-03-24T01:11:16.8315773Z /__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134. [/__w/1/s/src/libraries/System.Runtime/tests/System.Runtime.Tests/System.Runtime.Tests.csproj::TargetFramework=net11.0-unix]

The assert is only trying to approximate the thing it's asserting since we lack the API to check "is this method a MethodImpl?".
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NAOT failures seem unrelated now, is this good to merge?

@MichalStrehovskyMichalStrehovsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM but I did half of the change :)

@jkotas

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

They are known, the Pri1 test tree is not buildable (not specific to native AOT): #126108 (comment)

@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the pri1 test run looked good in the previous outerloop iteration and we only relaxed an assert since then. the pri1 break is known.

@MichalStrehovsky
MichalStrehovsky merged commit ac11e33 into dotnet:mainMar 26, 2026
165 of 174 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community memberlinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MichalPetryka@jkotas@MichalStrehovsky
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix COMDelegate::BindToMethod with static virtuals - #125875

Merged
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58
Mar 26, 2026
Merged

Fix COMDelegate::BindToMethod with static virtuals#125875
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

The code was incorrectly using VSD stubs for them which led to runtime asserts.

The code was incorrectly using VSD stubs for them which led to runtime asserts.
@jkotas

Copy link
Copy Markdown
Member

Do we need a test?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do we need a test?

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all (I hit the asserts while working on another PR that hit it differently).

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@jkotas

jkotas commented Mar 21, 2026

Copy link
Copy Markdown
Member

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all

I think it should work. @MichalStrehovsky Do you agree?

Removed TODO comment regarding VSD compilation and virtuals.
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

If there's no trim/AOT warning, the code should work with NAOT. There was a TODO that was unnecessarily blocking this, I pushed out a change to remove it (we still don't allow invoking these virtually but that's because there's no reflection API for that; we'd fix that if there ever is an API).

@jkotas

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Removed comments about NativeAOT behavior and kept attributes.
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky The assertion failure in NAOT after your changes seem related, do you want to look into it yourself or should I try to do it myself?

2026-03-24T01:11:08.3931510Z Generating native code
2026-03-24T01:11:15.0790590Z Process terminated.
2026-03-24T01:11:15.0794205Z Assertion failed.
2026-03-24T01:11:15.0794593Z method.IsVirtual || (method.Signature.IsStatic && !method.OwningType.IsInterface)
2026-03-24T01:11:15.0795212Z at ILCompiler.DependencyAnalysis.GenericVirtualMethodImplNode..ctor(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericVirtualMethodImplNode.cs:line 27
2026-03-24T01:11:15.0795939Z at ILCompiler.DependencyAnalysis.NodeFactory.<>c.<CreateNodeCaches>b__47_20(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs:line 339
2026-03-24T01:11:15.0796840Z at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
2026-03-24T01:11:15.0797506Z at ILCompiler.DependencyAnalysis.GVMDependenciesNode.SearchDynamicDependencies(List`1 markedNodes, Int32 firstNode, NodeFactory factory) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GVMDependenciesNode.cs:line 155
2026-03-24T01:11:15.0798355Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.DynamicDependencyNode.MarkNewDynamicDependencies(DependencyAnalyzer`2 analyzer) in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 92
2026-03-24T01:11:15.0799083Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ProcessMarkStack() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 286
2026-03-24T01:11:15.0799731Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ComputeMarkedNodes() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 308
2026-03-24T01:11:15.0800320Z at ILCompiler.ILScanner.ILCompiler.IILScanner.Scan() in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ILScanner.cs:line 155
2026-03-24T01:11:15.0800854Z at ILCompiler.Program.<Run>g__RunScanner|4_0(<>c__DisplayClass4_0&) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 530
2026-03-24T01:11:15.0801348Z at ILCompiler.Program.Run() in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 511
2026-03-24T01:11:15.0801859Z at ILCompiler.ILCompilerRootCommand.<>c__DisplayClass264_0.<.ctor>b__0(ParseResult result) in /_/src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.cs:line 318
2026-03-24T01:11:15.0802369Z at System.CommandLine.Invocation.InvocationPipeline.Invoke(ParseResult parseResult)
2026-03-24T01:11:15.0802820Z at ILCompiler.Program.Main(String[] args) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 847
2026-03-24T01:11:16.8314035Z ##[error]artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: (NETCORE_ENGINEERING_TELEMETRY=Build) The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134.
2026-03-24T01:11:16.8315773Z /__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134. [/__w/1/s/src/libraries/System.Runtime/tests/System.Runtime.Tests/System.Runtime.Tests.csproj::TargetFramework=net11.0-unix]

The assert is only trying to approximate the thing it's asserting since we lack the API to check "is this method a MethodImpl?".
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NAOT failures seem unrelated now, is this good to merge?

@MichalStrehovskyMichalStrehovsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM but I did half of the change :)

@jkotas

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

They are known, the Pri1 test tree is not buildable (not specific to native AOT): #126108 (comment)

@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the pri1 test run looked good in the previous outerloop iteration and we only relaxed an assert since then. the pri1 break is known.

@MichalStrehovsky
MichalStrehovsky merged commit ac11e33 into dotnet:mainMar 26, 2026
165 of 174 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community memberlinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MichalPetryka@jkotas@MichalStrehovsky
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix COMDelegate::BindToMethod with static virtuals - #125875

Merged
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58
Mar 26, 2026
Merged

Fix COMDelegate::BindToMethod with static virtuals#125875
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

The code was incorrectly using VSD stubs for them which led to runtime asserts.

The code was incorrectly using VSD stubs for them which led to runtime asserts.
@jkotas

Copy link
Copy Markdown
Member

Do we need a test?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do we need a test?

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all (I hit the asserts while working on another PR that hit it differently).

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@jkotas

jkotas commented Mar 21, 2026

Copy link
Copy Markdown
Member

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all

I think it should work. @MichalStrehovsky Do you agree?

Removed TODO comment regarding VSD compilation and virtuals.
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

If there's no trim/AOT warning, the code should work with NAOT. There was a TODO that was unnecessarily blocking this, I pushed out a change to remove it (we still don't allow invoking these virtually but that's because there's no reflection API for that; we'd fix that if there ever is an API).

@jkotas

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Removed comments about NativeAOT behavior and kept attributes.
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky The assertion failure in NAOT after your changes seem related, do you want to look into it yourself or should I try to do it myself?

2026-03-24T01:11:08.3931510Z Generating native code
2026-03-24T01:11:15.0790590Z Process terminated.
2026-03-24T01:11:15.0794205Z Assertion failed.
2026-03-24T01:11:15.0794593Z method.IsVirtual || (method.Signature.IsStatic && !method.OwningType.IsInterface)
2026-03-24T01:11:15.0795212Z at ILCompiler.DependencyAnalysis.GenericVirtualMethodImplNode..ctor(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericVirtualMethodImplNode.cs:line 27
2026-03-24T01:11:15.0795939Z at ILCompiler.DependencyAnalysis.NodeFactory.<>c.<CreateNodeCaches>b__47_20(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs:line 339
2026-03-24T01:11:15.0796840Z at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
2026-03-24T01:11:15.0797506Z at ILCompiler.DependencyAnalysis.GVMDependenciesNode.SearchDynamicDependencies(List`1 markedNodes, Int32 firstNode, NodeFactory factory) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GVMDependenciesNode.cs:line 155
2026-03-24T01:11:15.0798355Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.DynamicDependencyNode.MarkNewDynamicDependencies(DependencyAnalyzer`2 analyzer) in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 92
2026-03-24T01:11:15.0799083Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ProcessMarkStack() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 286
2026-03-24T01:11:15.0799731Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ComputeMarkedNodes() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 308
2026-03-24T01:11:15.0800320Z at ILCompiler.ILScanner.ILCompiler.IILScanner.Scan() in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ILScanner.cs:line 155
2026-03-24T01:11:15.0800854Z at ILCompiler.Program.<Run>g__RunScanner|4_0(<>c__DisplayClass4_0&) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 530
2026-03-24T01:11:15.0801348Z at ILCompiler.Program.Run() in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 511
2026-03-24T01:11:15.0801859Z at ILCompiler.ILCompilerRootCommand.<>c__DisplayClass264_0.<.ctor>b__0(ParseResult result) in /_/src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.cs:line 318
2026-03-24T01:11:15.0802369Z at System.CommandLine.Invocation.InvocationPipeline.Invoke(ParseResult parseResult)
2026-03-24T01:11:15.0802820Z at ILCompiler.Program.Main(String[] args) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 847
2026-03-24T01:11:16.8314035Z ##[error]artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: (NETCORE_ENGINEERING_TELEMETRY=Build) The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134.
2026-03-24T01:11:16.8315773Z /__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134. [/__w/1/s/src/libraries/System.Runtime/tests/System.Runtime.Tests/System.Runtime.Tests.csproj::TargetFramework=net11.0-unix]

The assert is only trying to approximate the thing it's asserting since we lack the API to check "is this method a MethodImpl?".
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NAOT failures seem unrelated now, is this good to merge?

@MichalStrehovskyMichalStrehovsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM but I did half of the change :)

@jkotas

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

They are known, the Pri1 test tree is not buildable (not specific to native AOT): #126108 (comment)

@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the pri1 test run looked good in the previous outerloop iteration and we only relaxed an assert since then. the pri1 break is known.

@MichalStrehovsky
MichalStrehovsky merged commit ac11e33 into dotnet:mainMar 26, 2026
165 of 174 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community memberlinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MichalPetryka@jkotas@MichalStrehovsky
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Fix COMDelegate::BindToMethod with static virtuals - #125875

Merged
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58
Mar 26, 2026
Merged

Fix COMDelegate::BindToMethod with static virtuals#125875
MichalStrehovsky merged 12 commits into
dotnet:mainfrom
MichalPetryka:patch-58

Conversation

@MichalPetryka

Copy link
Copy Markdown
Contributor

The code was incorrectly using VSD stubs for them which led to runtime asserts.

The code was incorrectly using VSD stubs for them which led to runtime asserts.
@jkotas

Copy link
Copy Markdown
Member

Do we need a test?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do we need a test?

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all (I hit the asserts while working on another PR that hit it differently).

Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
Comment threadsrc/coreclr/vm/comdelegate.cpp Outdated
@jkotas

jkotas commented Mar 21, 2026

Copy link
Copy Markdown
Member

Added a test via reflection, but I'm not sure if you should be able to CreateDelegate like this at all

I think it should work. @MichalStrehovsky Do you agree?

Removed TODO comment regarding VSD compilation and virtuals.
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Should I mark the test as skipped in NAOT or should it understand the case here?

If there's no trim/AOT warning, the code should work with NAOT. There was a TODO that was unnecessarily blocking this, I pushed out a change to remove it (we still don't allow invoking these virtually but that's because there's no reflection API for that; we'd fix that if there ever is an API).

@jkotas

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Removed comments about NativeAOT behavior and kept attributes.
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky The assertion failure in NAOT after your changes seem related, do you want to look into it yourself or should I try to do it myself?

2026-03-24T01:11:08.3931510Z Generating native code
2026-03-24T01:11:15.0790590Z Process terminated.
2026-03-24T01:11:15.0794205Z Assertion failed.
2026-03-24T01:11:15.0794593Z method.IsVirtual || (method.Signature.IsStatic && !method.OwningType.IsInterface)
2026-03-24T01:11:15.0795212Z at ILCompiler.DependencyAnalysis.GenericVirtualMethodImplNode..ctor(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericVirtualMethodImplNode.cs:line 27
2026-03-24T01:11:15.0795939Z at ILCompiler.DependencyAnalysis.NodeFactory.<>c.<CreateNodeCaches>b__47_20(MethodDesc method) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs:line 339
2026-03-24T01:11:15.0796840Z at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
2026-03-24T01:11:15.0797506Z at ILCompiler.DependencyAnalysis.GVMDependenciesNode.SearchDynamicDependencies(List`1 markedNodes, Int32 firstNode, NodeFactory factory) in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GVMDependenciesNode.cs:line 155
2026-03-24T01:11:15.0798355Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.DynamicDependencyNode.MarkNewDynamicDependencies(DependencyAnalyzer`2 analyzer) in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 92
2026-03-24T01:11:15.0799083Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ProcessMarkStack() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 286
2026-03-24T01:11:15.0799731Z at ILCompiler.DependencyAnalysisFramework.DependencyAnalyzer`2.ComputeMarkedNodes() in /_/src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/DependencyAnalyzer.cs:line 308
2026-03-24T01:11:15.0800320Z at ILCompiler.ILScanner.ILCompiler.IILScanner.Scan() in /_/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ILScanner.cs:line 155
2026-03-24T01:11:15.0800854Z at ILCompiler.Program.<Run>g__RunScanner|4_0(<>c__DisplayClass4_0&) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 530
2026-03-24T01:11:15.0801348Z at ILCompiler.Program.Run() in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 511
2026-03-24T01:11:15.0801859Z at ILCompiler.ILCompilerRootCommand.<>c__DisplayClass264_0.<.ctor>b__0(ParseResult result) in /_/src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.cs:line 318
2026-03-24T01:11:15.0802369Z at System.CommandLine.Invocation.InvocationPipeline.Invoke(ParseResult parseResult)
2026-03-24T01:11:15.0802820Z at ILCompiler.Program.Main(String[] args) in /_/src/coreclr/tools/aot/ILCompiler/Program.cs:line 847
2026-03-24T01:11:16.8314035Z ##[error]artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: (NETCORE_ENGINEERING_TELEMETRY=Build) The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134.
2026-03-24T01:11:16.8315773Z /__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/build/Microsoft.NETCore.Native.targets(311,5): error MSB3073: The command ""/__w/1/s/artifacts/bin/coreclr/linux.arm64.Checked/x64/ilc/ilc" @"/__w/1/s/artifacts/obj/System.Runtime.Tests/Release/net11.0-unix/native/System.Runtime.Tests.ilc.rsp"" exited with code 134. [/__w/1/s/src/libraries/System.Runtime/tests/System.Runtime.Tests/System.Runtime.Tests.csproj::TargetFramework=net11.0-unix]

The assert is only trying to approximate the thing it's asserting since we lack the API to check "is this method a MethodImpl?".
@MichalStrehovsky

Copy link
Copy Markdown
Member

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NAOT failures seem unrelated now, is this good to merge?

@MichalStrehovskyMichalStrehovsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM but I did half of the change :)

@jkotas

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

@MichalStrehovsky

Copy link
Copy Markdown
Member

@MichalStrehovsky Are the test build breaks known or already fixed by some other PR?

They are known, the Pri1 test tree is not buildable (not specific to native AOT): #126108 (comment)

@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the pri1 test run looked good in the previous outerloop iteration and we only relaxed an assert since then. the pri1 break is known.

@MichalStrehovsky
MichalStrehovsky merged commit ac11e33 into dotnet:mainMar 26, 2026
165 of 174 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community memberlinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MichalPetryka@jkotas@MichalStrehovsky