Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO) - #125849

Merged
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback
Mar 24, 2026
Merged

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO)#125849
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback

Conversation

CopilotAI commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Continues the COM interop UCO migration (group 5), converting three MethodDescCallSite call sites to the UCO pattern and removing associated dead code. Addresses all pending feedback from #125508.

Description

New UCO helpers in StubHelpers.cs

  • GetDispatchExPropertyFlags – replaces two MethodDescCallSite calls for PropertyInfo.CanRead/CanWrite in DispatchEx_GetMemberProperties; returns int directly via InvokeThrowing_Ret at the callsite (no out-param)
  • CallICustomQueryInterface – replaces the InvokeICustomQueryInterfaceGetInterface_CallBack struct/callback pattern; returns int directly (uses InvokeThrowing_Ret)
  • InvokeConnectionPointProviderMethod – replaces two MethodDescCallSite calls in ConnectionPoint::InvokeProviderMethod; uses nint/UIntPtr ctor fallback for correctness; uses GetMultiCallableAddrOfCode() for the event target since it is stored for future invokes
  • Added [RequiresUnsafe] to the existing GetIEnumeratorToEnumVariantMarshaler UCO overload for consistency

Feedback addressed

  • INVOKE_CONNECTION_POINT_PROVIDER_METHOD registered as NoSig in corelib.h (has unmanaged fn-ptr params — encoding in metasig not worth the pain)
  • CallICustomQueryInterface uses InvokeThrowing_Ret<INT32> and passes ppUnkOut directly — no local copy needed
  • GetDispatchExPropertyFlags signature changed to return int directly; metasig (SM_PtrPropertyInfo_PtrException_RetInt) and corelib.h registration updated accordingly; callsite in stdinterfaces.cpp updated to use InvokeThrowing_Ret<INT32>
  • UIntPtr ctor fallback restored in ConnectionPoint::InvokeProviderMethod for correctness
  • Comment updated in comconnectionpoints.cpp to clarify why GetMultiCallableAddrOfCode() is used for the event target

Dead code removed

  • InvokeICustomQueryInterfaceGetInterface_CallBack + arg struct in comcallablewrapper.cpp
  • GetICustomQueryInterfaceGetInterfaceMD / m_pICustomQueryInterfaceGetInterfaceMD from ComCallWrapperTemplate
  • m_ohDelegate union field and GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate from EEClass/MethodTableSetObjCreateDelegate had no callers; the delegate-based CreateAggregatedInstance path was effectively dead

⌨️ Start Copilot coding agent tasks without leaving your editor — available in VS Code, Visual Studio, JetBrains IDEs and Eclipse.

Converts COM interop code from MethodDescCallSite to UnmanagedCallersOnly
(UCO) pattern for three sites:
1. DispatchEx_GetMemberProperties (Property case): replaces two
MethodDescCallSite invocations (for CanRead/CanWrite) with a single
UCO helper GetDispatchExPropertyFlags in StubHelpers.
2. ICustomQueryInterface.GetInterface: replaces the callback struct
pattern with a UCO helper CallICustomQueryInterface. Also removes
the cached MethodDesc field m_pICustomQueryInterfaceGetInterfaceMD
from ComCallWrapperTemplate.
3. ConnectionPoint.InvokeProviderMethod: replaces MethodDescCallSite
calls for delegate construction and provider invocation with a
single UCO helper InvokeConnectionPointProviderMethod. Removes the
UIntPtr ctor fallback path (addressing pending feedback).
Also removes the m_ohDelegate field and related methods
(GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate)
from EEClass/MethodTable since the delegate-based COM object creation
callback feature in CreateAggregatedInstance is removed.
Adds [RequiresUnsafe] to GetIEnumeratorToEnumVariantMarshaler UCO
overload to be consistent with the new UCO methods.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/vm/comcallablewrapper.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

@jkotas
jkotas marked this pull request as ready for review March 20, 2026 20:41

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR continues the CoreCLR COM interop migration away from MethodDescCallSite toward the UnmanagedCallersOnly (UCO) reverse-P/Invoke calling pattern, and removes now-dead COM interop callback/delegate infrastructure in the VM.

Changes:

  • Added new UCO helpers in StubHelpers.cs and updated native call sites to use UnmanagedCallersOnlyCaller.
  • Converted COM interop call paths in stdinterfaces.cpp, comconnectionpoints.cpp, and comcallablewrapper.cpp from MethodDescCallSite to UCO-based helpers.
  • Removed dead COM interop delegate/callback code paths and related cached fields/helpers in VM types.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
src/coreclr/vm/stdinterfaces.cppUses UCO helper to query PropertyInfo.CanRead/CanWrite flags instead of two MethodDescCallSite calls.
src/coreclr/vm/runtimecallablewrapper.cppRemoves unused delegate-based aggregated COM instance creation path and related logic.
src/coreclr/vm/methodtable.hRemoves delegate-handle-related APIs from MethodTable.
src/coreclr/vm/methodtable.cppRemoves implementations for COM object-creation delegate storage/retrieval.
src/coreclr/vm/metasig.hAdds COM-interp UCO metasig definitions for new StubHelpers methods.
src/coreclr/vm/corelib.hRegisters new StubHelpers methods (including a NoSig entry).
src/coreclr/vm/comconnectionpoints.cppUses a single UCO helper to construct delegate + invoke provider method.
src/coreclr/vm/comcallablewrapper.hRemoves cached ICustomQueryInterface.GetInterface MethodDesc field/API.
src/coreclr/vm/comcallablewrapper.cppReplaces callback/cached-MD pattern with UCO helper that calls ICustomQueryInterface.GetInterface.
src/coreclr/vm/class.hRemoves now-dead delegate handle storage from EEClass COM interop union.
src/coreclr/System.Private.CoreLib/src/System/StubHelpers.csAdds UCO helpers for DispatchEx property flags, ICustomQueryInterface, and connection point invocation.

Comment threadsrc/coreclr/vm/stdinterfaces.cpp

@AaronRobinsonMSFTAaronRobinsonMSFT 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.

Some minor nits. Otherwise, looks good when green.

Comment threadsrc/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs Outdated
Comment threadsrc/coreclr/vm/stdinterfaces.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
…InvokeThrowing_Ret
Co-authored-by: AaronRobinsonMSFT <30635565+AaronRobinsonMSFT@users.noreply.github.com>
Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/dde670ee-197d-4271-8596-d75d3cca3116
@AaronRobinsonMSFTAaronRobinsonMSFT added this to the 11.0.0 milestone Mar 23, 2026
@AaronRobinsonMSFT
AaronRobinsonMSFT enabled auto-merge (squash) March 23, 2026 23:06
@jkotas

Copy link
Copy Markdown
Member

/ba-g timeouts

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 63e88d1 into mainMar 24, 2026
96 of 104 checks passed
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the copilot/address-pending-feedback branch March 24, 2026 04:11
@am11

am11 commented Mar 24, 2026

Copy link
Copy Markdown
Member

@jkotas, it would be good to ask copilot to keep the author of original commit and add stuff on top.

am11@ae7563a has dispatchinfo conversions. I tested it last week but haven't retested after the cherry-pick (should be fine). Copilot can pick it and continue the next batch.

@jkotas

Copy link
Copy Markdown
Member

am11@ae7563a

Triggered copilot on it with explicit instruction to preserve the author name and some initial feedback, let's see how it does.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 24, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@jkotas@am11@AaronRobinsonMSFT
, '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

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO) - #125849

Merged
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback
Mar 24, 2026
Merged

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO)#125849
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback

Conversation

CopilotAI commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Continues the COM interop UCO migration (group 5), converting three MethodDescCallSite call sites to the UCO pattern and removing associated dead code. Addresses all pending feedback from #125508.

Description

New UCO helpers in StubHelpers.cs

  • GetDispatchExPropertyFlags – replaces two MethodDescCallSite calls for PropertyInfo.CanRead/CanWrite in DispatchEx_GetMemberProperties; returns int directly via InvokeThrowing_Ret at the callsite (no out-param)
  • CallICustomQueryInterface – replaces the InvokeICustomQueryInterfaceGetInterface_CallBack struct/callback pattern; returns int directly (uses InvokeThrowing_Ret)
  • InvokeConnectionPointProviderMethod – replaces two MethodDescCallSite calls in ConnectionPoint::InvokeProviderMethod; uses nint/UIntPtr ctor fallback for correctness; uses GetMultiCallableAddrOfCode() for the event target since it is stored for future invokes
  • Added [RequiresUnsafe] to the existing GetIEnumeratorToEnumVariantMarshaler UCO overload for consistency

Feedback addressed

  • INVOKE_CONNECTION_POINT_PROVIDER_METHOD registered as NoSig in corelib.h (has unmanaged fn-ptr params — encoding in metasig not worth the pain)
  • CallICustomQueryInterface uses InvokeThrowing_Ret<INT32> and passes ppUnkOut directly — no local copy needed
  • GetDispatchExPropertyFlags signature changed to return int directly; metasig (SM_PtrPropertyInfo_PtrException_RetInt) and corelib.h registration updated accordingly; callsite in stdinterfaces.cpp updated to use InvokeThrowing_Ret<INT32>
  • UIntPtr ctor fallback restored in ConnectionPoint::InvokeProviderMethod for correctness
  • Comment updated in comconnectionpoints.cpp to clarify why GetMultiCallableAddrOfCode() is used for the event target

Dead code removed

  • InvokeICustomQueryInterfaceGetInterface_CallBack + arg struct in comcallablewrapper.cpp
  • GetICustomQueryInterfaceGetInterfaceMD / m_pICustomQueryInterfaceGetInterfaceMD from ComCallWrapperTemplate
  • m_ohDelegate union field and GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate from EEClass/MethodTableSetObjCreateDelegate had no callers; the delegate-based CreateAggregatedInstance path was effectively dead

⌨️ Start Copilot coding agent tasks without leaving your editor — available in VS Code, Visual Studio, JetBrains IDEs and Eclipse.

Converts COM interop code from MethodDescCallSite to UnmanagedCallersOnly
(UCO) pattern for three sites:
1. DispatchEx_GetMemberProperties (Property case): replaces two
MethodDescCallSite invocations (for CanRead/CanWrite) with a single
UCO helper GetDispatchExPropertyFlags in StubHelpers.
2. ICustomQueryInterface.GetInterface: replaces the callback struct
pattern with a UCO helper CallICustomQueryInterface. Also removes
the cached MethodDesc field m_pICustomQueryInterfaceGetInterfaceMD
from ComCallWrapperTemplate.
3. ConnectionPoint.InvokeProviderMethod: replaces MethodDescCallSite
calls for delegate construction and provider invocation with a
single UCO helper InvokeConnectionPointProviderMethod. Removes the
UIntPtr ctor fallback path (addressing pending feedback).
Also removes the m_ohDelegate field and related methods
(GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate)
from EEClass/MethodTable since the delegate-based COM object creation
callback feature in CreateAggregatedInstance is removed.
Adds [RequiresUnsafe] to GetIEnumeratorToEnumVariantMarshaler UCO
overload to be consistent with the new UCO methods.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/vm/comcallablewrapper.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

@jkotas
jkotas marked this pull request as ready for review March 20, 2026 20:41

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR continues the CoreCLR COM interop migration away from MethodDescCallSite toward the UnmanagedCallersOnly (UCO) reverse-P/Invoke calling pattern, and removes now-dead COM interop callback/delegate infrastructure in the VM.

Changes:

  • Added new UCO helpers in StubHelpers.cs and updated native call sites to use UnmanagedCallersOnlyCaller.
  • Converted COM interop call paths in stdinterfaces.cpp, comconnectionpoints.cpp, and comcallablewrapper.cpp from MethodDescCallSite to UCO-based helpers.
  • Removed dead COM interop delegate/callback code paths and related cached fields/helpers in VM types.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
src/coreclr/vm/stdinterfaces.cppUses UCO helper to query PropertyInfo.CanRead/CanWrite flags instead of two MethodDescCallSite calls.
src/coreclr/vm/runtimecallablewrapper.cppRemoves unused delegate-based aggregated COM instance creation path and related logic.
src/coreclr/vm/methodtable.hRemoves delegate-handle-related APIs from MethodTable.
src/coreclr/vm/methodtable.cppRemoves implementations for COM object-creation delegate storage/retrieval.
src/coreclr/vm/metasig.hAdds COM-interp UCO metasig definitions for new StubHelpers methods.
src/coreclr/vm/corelib.hRegisters new StubHelpers methods (including a NoSig entry).
src/coreclr/vm/comconnectionpoints.cppUses a single UCO helper to construct delegate + invoke provider method.
src/coreclr/vm/comcallablewrapper.hRemoves cached ICustomQueryInterface.GetInterface MethodDesc field/API.
src/coreclr/vm/comcallablewrapper.cppReplaces callback/cached-MD pattern with UCO helper that calls ICustomQueryInterface.GetInterface.
src/coreclr/vm/class.hRemoves now-dead delegate handle storage from EEClass COM interop union.
src/coreclr/System.Private.CoreLib/src/System/StubHelpers.csAdds UCO helpers for DispatchEx property flags, ICustomQueryInterface, and connection point invocation.

Comment threadsrc/coreclr/vm/stdinterfaces.cpp

@AaronRobinsonMSFTAaronRobinsonMSFT 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.

Some minor nits. Otherwise, looks good when green.

Comment threadsrc/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs Outdated
Comment threadsrc/coreclr/vm/stdinterfaces.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
…InvokeThrowing_Ret
Co-authored-by: AaronRobinsonMSFT <30635565+AaronRobinsonMSFT@users.noreply.github.com>
Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/dde670ee-197d-4271-8596-d75d3cca3116
@AaronRobinsonMSFTAaronRobinsonMSFT added this to the 11.0.0 milestone Mar 23, 2026
@AaronRobinsonMSFT
AaronRobinsonMSFT enabled auto-merge (squash) March 23, 2026 23:06
@jkotas

Copy link
Copy Markdown
Member

/ba-g timeouts

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 63e88d1 into mainMar 24, 2026
96 of 104 checks passed
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the copilot/address-pending-feedback branch March 24, 2026 04:11
@am11

am11 commented Mar 24, 2026

Copy link
Copy Markdown
Member

@jkotas, it would be good to ask copilot to keep the author of original commit and add stuff on top.

am11@ae7563a has dispatchinfo conversions. I tested it last week but haven't retested after the cherry-pick (should be fine). Copilot can pick it and continue the next batch.

@jkotas

Copy link
Copy Markdown
Member

am11@ae7563a

Triggered copilot on it with explicit instruction to preserve the author name and some initial feedback, let's see how it does.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 24, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@jkotas@am11@AaronRobinsonMSFT
, '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

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO) - #125849

Merged
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback
Mar 24, 2026
Merged

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO)#125849
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback

Conversation

CopilotAI commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Continues the COM interop UCO migration (group 5), converting three MethodDescCallSite call sites to the UCO pattern and removing associated dead code. Addresses all pending feedback from #125508.

Description

New UCO helpers in StubHelpers.cs

  • GetDispatchExPropertyFlags – replaces two MethodDescCallSite calls for PropertyInfo.CanRead/CanWrite in DispatchEx_GetMemberProperties; returns int directly via InvokeThrowing_Ret at the callsite (no out-param)
  • CallICustomQueryInterface – replaces the InvokeICustomQueryInterfaceGetInterface_CallBack struct/callback pattern; returns int directly (uses InvokeThrowing_Ret)
  • InvokeConnectionPointProviderMethod – replaces two MethodDescCallSite calls in ConnectionPoint::InvokeProviderMethod; uses nint/UIntPtr ctor fallback for correctness; uses GetMultiCallableAddrOfCode() for the event target since it is stored for future invokes
  • Added [RequiresUnsafe] to the existing GetIEnumeratorToEnumVariantMarshaler UCO overload for consistency

Feedback addressed

  • INVOKE_CONNECTION_POINT_PROVIDER_METHOD registered as NoSig in corelib.h (has unmanaged fn-ptr params — encoding in metasig not worth the pain)
  • CallICustomQueryInterface uses InvokeThrowing_Ret<INT32> and passes ppUnkOut directly — no local copy needed
  • GetDispatchExPropertyFlags signature changed to return int directly; metasig (SM_PtrPropertyInfo_PtrException_RetInt) and corelib.h registration updated accordingly; callsite in stdinterfaces.cpp updated to use InvokeThrowing_Ret<INT32>
  • UIntPtr ctor fallback restored in ConnectionPoint::InvokeProviderMethod for correctness
  • Comment updated in comconnectionpoints.cpp to clarify why GetMultiCallableAddrOfCode() is used for the event target

Dead code removed

  • InvokeICustomQueryInterfaceGetInterface_CallBack + arg struct in comcallablewrapper.cpp
  • GetICustomQueryInterfaceGetInterfaceMD / m_pICustomQueryInterfaceGetInterfaceMD from ComCallWrapperTemplate
  • m_ohDelegate union field and GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate from EEClass/MethodTableSetObjCreateDelegate had no callers; the delegate-based CreateAggregatedInstance path was effectively dead

⌨️ Start Copilot coding agent tasks without leaving your editor — available in VS Code, Visual Studio, JetBrains IDEs and Eclipse.

Converts COM interop code from MethodDescCallSite to UnmanagedCallersOnly
(UCO) pattern for three sites:
1. DispatchEx_GetMemberProperties (Property case): replaces two
MethodDescCallSite invocations (for CanRead/CanWrite) with a single
UCO helper GetDispatchExPropertyFlags in StubHelpers.
2. ICustomQueryInterface.GetInterface: replaces the callback struct
pattern with a UCO helper CallICustomQueryInterface. Also removes
the cached MethodDesc field m_pICustomQueryInterfaceGetInterfaceMD
from ComCallWrapperTemplate.
3. ConnectionPoint.InvokeProviderMethod: replaces MethodDescCallSite
calls for delegate construction and provider invocation with a
single UCO helper InvokeConnectionPointProviderMethod. Removes the
UIntPtr ctor fallback path (addressing pending feedback).
Also removes the m_ohDelegate field and related methods
(GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate)
from EEClass/MethodTable since the delegate-based COM object creation
callback feature in CreateAggregatedInstance is removed.
Adds [RequiresUnsafe] to GetIEnumeratorToEnumVariantMarshaler UCO
overload to be consistent with the new UCO methods.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/vm/comcallablewrapper.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

@jkotas
jkotas marked this pull request as ready for review March 20, 2026 20:41

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR continues the CoreCLR COM interop migration away from MethodDescCallSite toward the UnmanagedCallersOnly (UCO) reverse-P/Invoke calling pattern, and removes now-dead COM interop callback/delegate infrastructure in the VM.

Changes:

  • Added new UCO helpers in StubHelpers.cs and updated native call sites to use UnmanagedCallersOnlyCaller.
  • Converted COM interop call paths in stdinterfaces.cpp, comconnectionpoints.cpp, and comcallablewrapper.cpp from MethodDescCallSite to UCO-based helpers.
  • Removed dead COM interop delegate/callback code paths and related cached fields/helpers in VM types.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
src/coreclr/vm/stdinterfaces.cppUses UCO helper to query PropertyInfo.CanRead/CanWrite flags instead of two MethodDescCallSite calls.
src/coreclr/vm/runtimecallablewrapper.cppRemoves unused delegate-based aggregated COM instance creation path and related logic.
src/coreclr/vm/methodtable.hRemoves delegate-handle-related APIs from MethodTable.
src/coreclr/vm/methodtable.cppRemoves implementations for COM object-creation delegate storage/retrieval.
src/coreclr/vm/metasig.hAdds COM-interp UCO metasig definitions for new StubHelpers methods.
src/coreclr/vm/corelib.hRegisters new StubHelpers methods (including a NoSig entry).
src/coreclr/vm/comconnectionpoints.cppUses a single UCO helper to construct delegate + invoke provider method.
src/coreclr/vm/comcallablewrapper.hRemoves cached ICustomQueryInterface.GetInterface MethodDesc field/API.
src/coreclr/vm/comcallablewrapper.cppReplaces callback/cached-MD pattern with UCO helper that calls ICustomQueryInterface.GetInterface.
src/coreclr/vm/class.hRemoves now-dead delegate handle storage from EEClass COM interop union.
src/coreclr/System.Private.CoreLib/src/System/StubHelpers.csAdds UCO helpers for DispatchEx property flags, ICustomQueryInterface, and connection point invocation.

Comment threadsrc/coreclr/vm/stdinterfaces.cpp

@AaronRobinsonMSFTAaronRobinsonMSFT 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.

Some minor nits. Otherwise, looks good when green.

Comment threadsrc/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs Outdated
Comment threadsrc/coreclr/vm/stdinterfaces.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
…InvokeThrowing_Ret
Co-authored-by: AaronRobinsonMSFT <30635565+AaronRobinsonMSFT@users.noreply.github.com>
Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/dde670ee-197d-4271-8596-d75d3cca3116
@AaronRobinsonMSFTAaronRobinsonMSFT added this to the 11.0.0 milestone Mar 23, 2026
@AaronRobinsonMSFT
AaronRobinsonMSFT enabled auto-merge (squash) March 23, 2026 23:06
@jkotas

Copy link
Copy Markdown
Member

/ba-g timeouts

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 63e88d1 into mainMar 24, 2026
96 of 104 checks passed
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the copilot/address-pending-feedback branch March 24, 2026 04:11
@am11

am11 commented Mar 24, 2026

Copy link
Copy Markdown
Member

@jkotas, it would be good to ask copilot to keep the author of original commit and add stuff on top.

am11@ae7563a has dispatchinfo conversions. I tested it last week but haven't retested after the cherry-pick (should be fine). Copilot can pick it and continue the next batch.

@jkotas

Copy link
Copy Markdown
Member

am11@ae7563a

Triggered copilot on it with explicit instruction to preserve the author name and some initial feedback, let's see how it does.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 24, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@jkotas@am11@AaronRobinsonMSFT
, '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

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO) - #125849

Merged
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback
Mar 24, 2026
Merged

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO)#125849
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback

Conversation

CopilotAI commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Continues the COM interop UCO migration (group 5), converting three MethodDescCallSite call sites to the UCO pattern and removing associated dead code. Addresses all pending feedback from #125508.

Description

New UCO helpers in StubHelpers.cs

  • GetDispatchExPropertyFlags – replaces two MethodDescCallSite calls for PropertyInfo.CanRead/CanWrite in DispatchEx_GetMemberProperties; returns int directly via InvokeThrowing_Ret at the callsite (no out-param)
  • CallICustomQueryInterface – replaces the InvokeICustomQueryInterfaceGetInterface_CallBack struct/callback pattern; returns int directly (uses InvokeThrowing_Ret)
  • InvokeConnectionPointProviderMethod – replaces two MethodDescCallSite calls in ConnectionPoint::InvokeProviderMethod; uses nint/UIntPtr ctor fallback for correctness; uses GetMultiCallableAddrOfCode() for the event target since it is stored for future invokes
  • Added [RequiresUnsafe] to the existing GetIEnumeratorToEnumVariantMarshaler UCO overload for consistency

Feedback addressed

  • INVOKE_CONNECTION_POINT_PROVIDER_METHOD registered as NoSig in corelib.h (has unmanaged fn-ptr params — encoding in metasig not worth the pain)
  • CallICustomQueryInterface uses InvokeThrowing_Ret<INT32> and passes ppUnkOut directly — no local copy needed
  • GetDispatchExPropertyFlags signature changed to return int directly; metasig (SM_PtrPropertyInfo_PtrException_RetInt) and corelib.h registration updated accordingly; callsite in stdinterfaces.cpp updated to use InvokeThrowing_Ret<INT32>
  • UIntPtr ctor fallback restored in ConnectionPoint::InvokeProviderMethod for correctness
  • Comment updated in comconnectionpoints.cpp to clarify why GetMultiCallableAddrOfCode() is used for the event target

Dead code removed

  • InvokeICustomQueryInterfaceGetInterface_CallBack + arg struct in comcallablewrapper.cpp
  • GetICustomQueryInterfaceGetInterfaceMD / m_pICustomQueryInterfaceGetInterfaceMD from ComCallWrapperTemplate
  • m_ohDelegate union field and GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate from EEClass/MethodTableSetObjCreateDelegate had no callers; the delegate-based CreateAggregatedInstance path was effectively dead

⌨️ Start Copilot coding agent tasks without leaving your editor — available in VS Code, Visual Studio, JetBrains IDEs and Eclipse.

Converts COM interop code from MethodDescCallSite to UnmanagedCallersOnly
(UCO) pattern for three sites:
1. DispatchEx_GetMemberProperties (Property case): replaces two
MethodDescCallSite invocations (for CanRead/CanWrite) with a single
UCO helper GetDispatchExPropertyFlags in StubHelpers.
2. ICustomQueryInterface.GetInterface: replaces the callback struct
pattern with a UCO helper CallICustomQueryInterface. Also removes
the cached MethodDesc field m_pICustomQueryInterfaceGetInterfaceMD
from ComCallWrapperTemplate.
3. ConnectionPoint.InvokeProviderMethod: replaces MethodDescCallSite
calls for delegate construction and provider invocation with a
single UCO helper InvokeConnectionPointProviderMethod. Removes the
UIntPtr ctor fallback path (addressing pending feedback).
Also removes the m_ohDelegate field and related methods
(GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate)
from EEClass/MethodTable since the delegate-based COM object creation
callback feature in CreateAggregatedInstance is removed.
Adds [RequiresUnsafe] to GetIEnumeratorToEnumVariantMarshaler UCO
overload to be consistent with the new UCO methods.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/vm/comcallablewrapper.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

@jkotas
jkotas marked this pull request as ready for review March 20, 2026 20:41

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR continues the CoreCLR COM interop migration away from MethodDescCallSite toward the UnmanagedCallersOnly (UCO) reverse-P/Invoke calling pattern, and removes now-dead COM interop callback/delegate infrastructure in the VM.

Changes:

  • Added new UCO helpers in StubHelpers.cs and updated native call sites to use UnmanagedCallersOnlyCaller.
  • Converted COM interop call paths in stdinterfaces.cpp, comconnectionpoints.cpp, and comcallablewrapper.cpp from MethodDescCallSite to UCO-based helpers.
  • Removed dead COM interop delegate/callback code paths and related cached fields/helpers in VM types.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
src/coreclr/vm/stdinterfaces.cppUses UCO helper to query PropertyInfo.CanRead/CanWrite flags instead of two MethodDescCallSite calls.
src/coreclr/vm/runtimecallablewrapper.cppRemoves unused delegate-based aggregated COM instance creation path and related logic.
src/coreclr/vm/methodtable.hRemoves delegate-handle-related APIs from MethodTable.
src/coreclr/vm/methodtable.cppRemoves implementations for COM object-creation delegate storage/retrieval.
src/coreclr/vm/metasig.hAdds COM-interp UCO metasig definitions for new StubHelpers methods.
src/coreclr/vm/corelib.hRegisters new StubHelpers methods (including a NoSig entry).
src/coreclr/vm/comconnectionpoints.cppUses a single UCO helper to construct delegate + invoke provider method.
src/coreclr/vm/comcallablewrapper.hRemoves cached ICustomQueryInterface.GetInterface MethodDesc field/API.
src/coreclr/vm/comcallablewrapper.cppReplaces callback/cached-MD pattern with UCO helper that calls ICustomQueryInterface.GetInterface.
src/coreclr/vm/class.hRemoves now-dead delegate handle storage from EEClass COM interop union.
src/coreclr/System.Private.CoreLib/src/System/StubHelpers.csAdds UCO helpers for DispatchEx property flags, ICustomQueryInterface, and connection point invocation.

Comment threadsrc/coreclr/vm/stdinterfaces.cpp

@AaronRobinsonMSFTAaronRobinsonMSFT 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.

Some minor nits. Otherwise, looks good when green.

Comment threadsrc/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs Outdated
Comment threadsrc/coreclr/vm/stdinterfaces.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
…InvokeThrowing_Ret
Co-authored-by: AaronRobinsonMSFT <30635565+AaronRobinsonMSFT@users.noreply.github.com>
Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/dde670ee-197d-4271-8596-d75d3cca3116
@AaronRobinsonMSFTAaronRobinsonMSFT added this to the 11.0.0 milestone Mar 23, 2026
@AaronRobinsonMSFT
AaronRobinsonMSFT enabled auto-merge (squash) March 23, 2026 23:06
@jkotas

Copy link
Copy Markdown
Member

/ba-g timeouts

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 63e88d1 into mainMar 24, 2026
96 of 104 checks passed
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the copilot/address-pending-feedback branch March 24, 2026 04:11
@am11

am11 commented Mar 24, 2026

Copy link
Copy Markdown
Member

@jkotas, it would be good to ask copilot to keep the author of original commit and add stuff on top.

am11@ae7563a has dispatchinfo conversions. I tested it last week but haven't retested after the cherry-pick (should be fine). Copilot can pick it and continue the next batch.

@jkotas

Copy link
Copy Markdown
Member

am11@ae7563a

Triggered copilot on it with explicit instruction to preserve the author name and some initial feedback, let's see how it does.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 24, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@jkotas@am11@AaronRobinsonMSFT
, '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

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO) - #125849

Merged
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback
Mar 24, 2026
Merged

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO)#125849
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback

Conversation

CopilotAI commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Continues the COM interop UCO migration (group 5), converting three MethodDescCallSite call sites to the UCO pattern and removing associated dead code. Addresses all pending feedback from #125508.

Description

New UCO helpers in StubHelpers.cs

  • GetDispatchExPropertyFlags – replaces two MethodDescCallSite calls for PropertyInfo.CanRead/CanWrite in DispatchEx_GetMemberProperties; returns int directly via InvokeThrowing_Ret at the callsite (no out-param)
  • CallICustomQueryInterface – replaces the InvokeICustomQueryInterfaceGetInterface_CallBack struct/callback pattern; returns int directly (uses InvokeThrowing_Ret)
  • InvokeConnectionPointProviderMethod – replaces two MethodDescCallSite calls in ConnectionPoint::InvokeProviderMethod; uses nint/UIntPtr ctor fallback for correctness; uses GetMultiCallableAddrOfCode() for the event target since it is stored for future invokes
  • Added [RequiresUnsafe] to the existing GetIEnumeratorToEnumVariantMarshaler UCO overload for consistency

Feedback addressed

  • INVOKE_CONNECTION_POINT_PROVIDER_METHOD registered as NoSig in corelib.h (has unmanaged fn-ptr params — encoding in metasig not worth the pain)
  • CallICustomQueryInterface uses InvokeThrowing_Ret<INT32> and passes ppUnkOut directly — no local copy needed
  • GetDispatchExPropertyFlags signature changed to return int directly; metasig (SM_PtrPropertyInfo_PtrException_RetInt) and corelib.h registration updated accordingly; callsite in stdinterfaces.cpp updated to use InvokeThrowing_Ret<INT32>
  • UIntPtr ctor fallback restored in ConnectionPoint::InvokeProviderMethod for correctness
  • Comment updated in comconnectionpoints.cpp to clarify why GetMultiCallableAddrOfCode() is used for the event target

Dead code removed

  • InvokeICustomQueryInterfaceGetInterface_CallBack + arg struct in comcallablewrapper.cpp
  • GetICustomQueryInterfaceGetInterfaceMD / m_pICustomQueryInterfaceGetInterfaceMD from ComCallWrapperTemplate
  • m_ohDelegate union field and GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate from EEClass/MethodTableSetObjCreateDelegate had no callers; the delegate-based CreateAggregatedInstance path was effectively dead

⌨️ Start Copilot coding agent tasks without leaving your editor — available in VS Code, Visual Studio, JetBrains IDEs and Eclipse.

Converts COM interop code from MethodDescCallSite to UnmanagedCallersOnly
(UCO) pattern for three sites:
1. DispatchEx_GetMemberProperties (Property case): replaces two
MethodDescCallSite invocations (for CanRead/CanWrite) with a single
UCO helper GetDispatchExPropertyFlags in StubHelpers.
2. ICustomQueryInterface.GetInterface: replaces the callback struct
pattern with a UCO helper CallICustomQueryInterface. Also removes
the cached MethodDesc field m_pICustomQueryInterfaceGetInterfaceMD
from ComCallWrapperTemplate.
3. ConnectionPoint.InvokeProviderMethod: replaces MethodDescCallSite
calls for delegate construction and provider invocation with a
single UCO helper InvokeConnectionPointProviderMethod. Removes the
UIntPtr ctor fallback path (addressing pending feedback).
Also removes the m_ohDelegate field and related methods
(GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate)
from EEClass/MethodTable since the delegate-based COM object creation
callback feature in CreateAggregatedInstance is removed.
Adds [RequiresUnsafe] to GetIEnumeratorToEnumVariantMarshaler UCO
overload to be consistent with the new UCO methods.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/vm/comcallablewrapper.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

@jkotas
jkotas marked this pull request as ready for review March 20, 2026 20:41

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR continues the CoreCLR COM interop migration away from MethodDescCallSite toward the UnmanagedCallersOnly (UCO) reverse-P/Invoke calling pattern, and removes now-dead COM interop callback/delegate infrastructure in the VM.

Changes:

  • Added new UCO helpers in StubHelpers.cs and updated native call sites to use UnmanagedCallersOnlyCaller.
  • Converted COM interop call paths in stdinterfaces.cpp, comconnectionpoints.cpp, and comcallablewrapper.cpp from MethodDescCallSite to UCO-based helpers.
  • Removed dead COM interop delegate/callback code paths and related cached fields/helpers in VM types.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
src/coreclr/vm/stdinterfaces.cppUses UCO helper to query PropertyInfo.CanRead/CanWrite flags instead of two MethodDescCallSite calls.
src/coreclr/vm/runtimecallablewrapper.cppRemoves unused delegate-based aggregated COM instance creation path and related logic.
src/coreclr/vm/methodtable.hRemoves delegate-handle-related APIs from MethodTable.
src/coreclr/vm/methodtable.cppRemoves implementations for COM object-creation delegate storage/retrieval.
src/coreclr/vm/metasig.hAdds COM-interp UCO metasig definitions for new StubHelpers methods.
src/coreclr/vm/corelib.hRegisters new StubHelpers methods (including a NoSig entry).
src/coreclr/vm/comconnectionpoints.cppUses a single UCO helper to construct delegate + invoke provider method.
src/coreclr/vm/comcallablewrapper.hRemoves cached ICustomQueryInterface.GetInterface MethodDesc field/API.
src/coreclr/vm/comcallablewrapper.cppReplaces callback/cached-MD pattern with UCO helper that calls ICustomQueryInterface.GetInterface.
src/coreclr/vm/class.hRemoves now-dead delegate handle storage from EEClass COM interop union.
src/coreclr/System.Private.CoreLib/src/System/StubHelpers.csAdds UCO helpers for DispatchEx property flags, ICustomQueryInterface, and connection point invocation.

Comment threadsrc/coreclr/vm/stdinterfaces.cpp

@AaronRobinsonMSFTAaronRobinsonMSFT 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.

Some minor nits. Otherwise, looks good when green.

Comment threadsrc/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs Outdated
Comment threadsrc/coreclr/vm/stdinterfaces.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
…InvokeThrowing_Ret
Co-authored-by: AaronRobinsonMSFT <30635565+AaronRobinsonMSFT@users.noreply.github.com>
Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/dde670ee-197d-4271-8596-d75d3cca3116
@AaronRobinsonMSFTAaronRobinsonMSFT added this to the 11.0.0 milestone Mar 23, 2026
@AaronRobinsonMSFT
AaronRobinsonMSFT enabled auto-merge (squash) March 23, 2026 23:06
@jkotas

Copy link
Copy Markdown
Member

/ba-g timeouts

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 63e88d1 into mainMar 24, 2026
96 of 104 checks passed
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the copilot/address-pending-feedback branch March 24, 2026 04:11
@am11

am11 commented Mar 24, 2026

Copy link
Copy Markdown
Member

@jkotas, it would be good to ask copilot to keep the author of original commit and add stuff on top.

am11@ae7563a has dispatchinfo conversions. I tested it last week but haven't retested after the cherry-pick (should be fine). Copilot can pick it and continue the next batch.

@jkotas

Copy link
Copy Markdown
Member

am11@ae7563a

Triggered copilot on it with explicit instruction to preserve the author name and some initial feedback, let's see how it does.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 24, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@jkotas@am11@AaronRobinsonMSFT
, '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

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO) - #125849

Merged
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback
Mar 24, 2026
Merged

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO)#125849
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback

Conversation

CopilotAI commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Continues the COM interop UCO migration (group 5), converting three MethodDescCallSite call sites to the UCO pattern and removing associated dead code. Addresses all pending feedback from #125508.

Description

New UCO helpers in StubHelpers.cs

  • GetDispatchExPropertyFlags – replaces two MethodDescCallSite calls for PropertyInfo.CanRead/CanWrite in DispatchEx_GetMemberProperties; returns int directly via InvokeThrowing_Ret at the callsite (no out-param)
  • CallICustomQueryInterface – replaces the InvokeICustomQueryInterfaceGetInterface_CallBack struct/callback pattern; returns int directly (uses InvokeThrowing_Ret)
  • InvokeConnectionPointProviderMethod – replaces two MethodDescCallSite calls in ConnectionPoint::InvokeProviderMethod; uses nint/UIntPtr ctor fallback for correctness; uses GetMultiCallableAddrOfCode() for the event target since it is stored for future invokes
  • Added [RequiresUnsafe] to the existing GetIEnumeratorToEnumVariantMarshaler UCO overload for consistency

Feedback addressed

  • INVOKE_CONNECTION_POINT_PROVIDER_METHOD registered as NoSig in corelib.h (has unmanaged fn-ptr params — encoding in metasig not worth the pain)
  • CallICustomQueryInterface uses InvokeThrowing_Ret<INT32> and passes ppUnkOut directly — no local copy needed
  • GetDispatchExPropertyFlags signature changed to return int directly; metasig (SM_PtrPropertyInfo_PtrException_RetInt) and corelib.h registration updated accordingly; callsite in stdinterfaces.cpp updated to use InvokeThrowing_Ret<INT32>
  • UIntPtr ctor fallback restored in ConnectionPoint::InvokeProviderMethod for correctness
  • Comment updated in comconnectionpoints.cpp to clarify why GetMultiCallableAddrOfCode() is used for the event target

Dead code removed

  • InvokeICustomQueryInterfaceGetInterface_CallBack + arg struct in comcallablewrapper.cpp
  • GetICustomQueryInterfaceGetInterfaceMD / m_pICustomQueryInterfaceGetInterfaceMD from ComCallWrapperTemplate
  • m_ohDelegate union field and GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate from EEClass/MethodTableSetObjCreateDelegate had no callers; the delegate-based CreateAggregatedInstance path was effectively dead

⌨️ Start Copilot coding agent tasks without leaving your editor — available in VS Code, Visual Studio, JetBrains IDEs and Eclipse.

Converts COM interop code from MethodDescCallSite to UnmanagedCallersOnly
(UCO) pattern for three sites:
1. DispatchEx_GetMemberProperties (Property case): replaces two
MethodDescCallSite invocations (for CanRead/CanWrite) with a single
UCO helper GetDispatchExPropertyFlags in StubHelpers.
2. ICustomQueryInterface.GetInterface: replaces the callback struct
pattern with a UCO helper CallICustomQueryInterface. Also removes
the cached MethodDesc field m_pICustomQueryInterfaceGetInterfaceMD
from ComCallWrapperTemplate.
3. ConnectionPoint.InvokeProviderMethod: replaces MethodDescCallSite
calls for delegate construction and provider invocation with a
single UCO helper InvokeConnectionPointProviderMethod. Removes the
UIntPtr ctor fallback path (addressing pending feedback).
Also removes the m_ohDelegate field and related methods
(GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate)
from EEClass/MethodTable since the delegate-based COM object creation
callback feature in CreateAggregatedInstance is removed.
Adds [RequiresUnsafe] to GetIEnumeratorToEnumVariantMarshaler UCO
overload to be consistent with the new UCO methods.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/vm/comcallablewrapper.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

@jkotas
jkotas marked this pull request as ready for review March 20, 2026 20:41

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR continues the CoreCLR COM interop migration away from MethodDescCallSite toward the UnmanagedCallersOnly (UCO) reverse-P/Invoke calling pattern, and removes now-dead COM interop callback/delegate infrastructure in the VM.

Changes:

  • Added new UCO helpers in StubHelpers.cs and updated native call sites to use UnmanagedCallersOnlyCaller.
  • Converted COM interop call paths in stdinterfaces.cpp, comconnectionpoints.cpp, and comcallablewrapper.cpp from MethodDescCallSite to UCO-based helpers.
  • Removed dead COM interop delegate/callback code paths and related cached fields/helpers in VM types.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
src/coreclr/vm/stdinterfaces.cppUses UCO helper to query PropertyInfo.CanRead/CanWrite flags instead of two MethodDescCallSite calls.
src/coreclr/vm/runtimecallablewrapper.cppRemoves unused delegate-based aggregated COM instance creation path and related logic.
src/coreclr/vm/methodtable.hRemoves delegate-handle-related APIs from MethodTable.
src/coreclr/vm/methodtable.cppRemoves implementations for COM object-creation delegate storage/retrieval.
src/coreclr/vm/metasig.hAdds COM-interp UCO metasig definitions for new StubHelpers methods.
src/coreclr/vm/corelib.hRegisters new StubHelpers methods (including a NoSig entry).
src/coreclr/vm/comconnectionpoints.cppUses a single UCO helper to construct delegate + invoke provider method.
src/coreclr/vm/comcallablewrapper.hRemoves cached ICustomQueryInterface.GetInterface MethodDesc field/API.
src/coreclr/vm/comcallablewrapper.cppReplaces callback/cached-MD pattern with UCO helper that calls ICustomQueryInterface.GetInterface.
src/coreclr/vm/class.hRemoves now-dead delegate handle storage from EEClass COM interop union.
src/coreclr/System.Private.CoreLib/src/System/StubHelpers.csAdds UCO helpers for DispatchEx property flags, ICustomQueryInterface, and connection point invocation.

Comment threadsrc/coreclr/vm/stdinterfaces.cpp

@AaronRobinsonMSFTAaronRobinsonMSFT 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.

Some minor nits. Otherwise, looks good when green.

Comment threadsrc/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs Outdated
Comment threadsrc/coreclr/vm/stdinterfaces.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
…InvokeThrowing_Ret
Co-authored-by: AaronRobinsonMSFT <30635565+AaronRobinsonMSFT@users.noreply.github.com>
Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/dde670ee-197d-4271-8596-d75d3cca3116
@AaronRobinsonMSFTAaronRobinsonMSFT added this to the 11.0.0 milestone Mar 23, 2026
@AaronRobinsonMSFT
AaronRobinsonMSFT enabled auto-merge (squash) March 23, 2026 23:06
@jkotas

Copy link
Copy Markdown
Member

/ba-g timeouts

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 63e88d1 into mainMar 24, 2026
96 of 104 checks passed
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the copilot/address-pending-feedback branch March 24, 2026 04:11
@am11

am11 commented Mar 24, 2026

Copy link
Copy Markdown
Member

@jkotas, it would be good to ask copilot to keep the author of original commit and add stuff on top.

am11@ae7563a has dispatchinfo conversions. I tested it last week but haven't retested after the cherry-pick (should be fine). Copilot can pick it and continue the next batch.

@jkotas

Copy link
Copy Markdown
Member

am11@ae7563a

Triggered copilot on it with explicit instruction to preserve the author name and some initial feedback, let's see how it does.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 24, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@jkotas@am11@AaronRobinsonMSFT
, '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

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO) - #125849

Merged
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback
Mar 24, 2026
Merged

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO)#125849
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback

Conversation

CopilotAI commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Continues the COM interop UCO migration (group 5), converting three MethodDescCallSite call sites to the UCO pattern and removing associated dead code. Addresses all pending feedback from #125508.

Description

New UCO helpers in StubHelpers.cs

  • GetDispatchExPropertyFlags – replaces two MethodDescCallSite calls for PropertyInfo.CanRead/CanWrite in DispatchEx_GetMemberProperties; returns int directly via InvokeThrowing_Ret at the callsite (no out-param)
  • CallICustomQueryInterface – replaces the InvokeICustomQueryInterfaceGetInterface_CallBack struct/callback pattern; returns int directly (uses InvokeThrowing_Ret)
  • InvokeConnectionPointProviderMethod – replaces two MethodDescCallSite calls in ConnectionPoint::InvokeProviderMethod; uses nint/UIntPtr ctor fallback for correctness; uses GetMultiCallableAddrOfCode() for the event target since it is stored for future invokes
  • Added [RequiresUnsafe] to the existing GetIEnumeratorToEnumVariantMarshaler UCO overload for consistency

Feedback addressed

  • INVOKE_CONNECTION_POINT_PROVIDER_METHOD registered as NoSig in corelib.h (has unmanaged fn-ptr params — encoding in metasig not worth the pain)
  • CallICustomQueryInterface uses InvokeThrowing_Ret<INT32> and passes ppUnkOut directly — no local copy needed
  • GetDispatchExPropertyFlags signature changed to return int directly; metasig (SM_PtrPropertyInfo_PtrException_RetInt) and corelib.h registration updated accordingly; callsite in stdinterfaces.cpp updated to use InvokeThrowing_Ret<INT32>
  • UIntPtr ctor fallback restored in ConnectionPoint::InvokeProviderMethod for correctness
  • Comment updated in comconnectionpoints.cpp to clarify why GetMultiCallableAddrOfCode() is used for the event target

Dead code removed

  • InvokeICustomQueryInterfaceGetInterface_CallBack + arg struct in comcallablewrapper.cpp
  • GetICustomQueryInterfaceGetInterfaceMD / m_pICustomQueryInterfaceGetInterfaceMD from ComCallWrapperTemplate
  • m_ohDelegate union field and GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate from EEClass/MethodTableSetObjCreateDelegate had no callers; the delegate-based CreateAggregatedInstance path was effectively dead

⌨️ Start Copilot coding agent tasks without leaving your editor — available in VS Code, Visual Studio, JetBrains IDEs and Eclipse.

Converts COM interop code from MethodDescCallSite to UnmanagedCallersOnly
(UCO) pattern for three sites:
1. DispatchEx_GetMemberProperties (Property case): replaces two
MethodDescCallSite invocations (for CanRead/CanWrite) with a single
UCO helper GetDispatchExPropertyFlags in StubHelpers.
2. ICustomQueryInterface.GetInterface: replaces the callback struct
pattern with a UCO helper CallICustomQueryInterface. Also removes
the cached MethodDesc field m_pICustomQueryInterfaceGetInterfaceMD
from ComCallWrapperTemplate.
3. ConnectionPoint.InvokeProviderMethod: replaces MethodDescCallSite
calls for delegate construction and provider invocation with a
single UCO helper InvokeConnectionPointProviderMethod. Removes the
UIntPtr ctor fallback path (addressing pending feedback).
Also removes the m_ohDelegate field and related methods
(GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate)
from EEClass/MethodTable since the delegate-based COM object creation
callback feature in CreateAggregatedInstance is removed.
Adds [RequiresUnsafe] to GetIEnumeratorToEnumVariantMarshaler UCO
overload to be consistent with the new UCO methods.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/vm/comcallablewrapper.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

@jkotas
jkotas marked this pull request as ready for review March 20, 2026 20:41

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR continues the CoreCLR COM interop migration away from MethodDescCallSite toward the UnmanagedCallersOnly (UCO) reverse-P/Invoke calling pattern, and removes now-dead COM interop callback/delegate infrastructure in the VM.

Changes:

  • Added new UCO helpers in StubHelpers.cs and updated native call sites to use UnmanagedCallersOnlyCaller.
  • Converted COM interop call paths in stdinterfaces.cpp, comconnectionpoints.cpp, and comcallablewrapper.cpp from MethodDescCallSite to UCO-based helpers.
  • Removed dead COM interop delegate/callback code paths and related cached fields/helpers in VM types.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
src/coreclr/vm/stdinterfaces.cppUses UCO helper to query PropertyInfo.CanRead/CanWrite flags instead of two MethodDescCallSite calls.
src/coreclr/vm/runtimecallablewrapper.cppRemoves unused delegate-based aggregated COM instance creation path and related logic.
src/coreclr/vm/methodtable.hRemoves delegate-handle-related APIs from MethodTable.
src/coreclr/vm/methodtable.cppRemoves implementations for COM object-creation delegate storage/retrieval.
src/coreclr/vm/metasig.hAdds COM-interp UCO metasig definitions for new StubHelpers methods.
src/coreclr/vm/corelib.hRegisters new StubHelpers methods (including a NoSig entry).
src/coreclr/vm/comconnectionpoints.cppUses a single UCO helper to construct delegate + invoke provider method.
src/coreclr/vm/comcallablewrapper.hRemoves cached ICustomQueryInterface.GetInterface MethodDesc field/API.
src/coreclr/vm/comcallablewrapper.cppReplaces callback/cached-MD pattern with UCO helper that calls ICustomQueryInterface.GetInterface.
src/coreclr/vm/class.hRemoves now-dead delegate handle storage from EEClass COM interop union.
src/coreclr/System.Private.CoreLib/src/System/StubHelpers.csAdds UCO helpers for DispatchEx property flags, ICustomQueryInterface, and connection point invocation.

Comment threadsrc/coreclr/vm/stdinterfaces.cpp

@AaronRobinsonMSFTAaronRobinsonMSFT 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.

Some minor nits. Otherwise, looks good when green.

Comment threadsrc/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs Outdated
Comment threadsrc/coreclr/vm/stdinterfaces.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
…InvokeThrowing_Ret
Co-authored-by: AaronRobinsonMSFT <30635565+AaronRobinsonMSFT@users.noreply.github.com>
Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/dde670ee-197d-4271-8596-d75d3cca3116
@AaronRobinsonMSFTAaronRobinsonMSFT added this to the 11.0.0 milestone Mar 23, 2026
@AaronRobinsonMSFT
AaronRobinsonMSFT enabled auto-merge (squash) March 23, 2026 23:06
@jkotas

Copy link
Copy Markdown
Member

/ba-g timeouts

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 63e88d1 into mainMar 24, 2026
96 of 104 checks passed
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the copilot/address-pending-feedback branch March 24, 2026 04:11
@am11

am11 commented Mar 24, 2026

Copy link
Copy Markdown
Member

@jkotas, it would be good to ask copilot to keep the author of original commit and add stuff on top.

am11@ae7563a has dispatchinfo conversions. I tested it last week but haven't retested after the cherry-pick (should be fine). Copilot can pick it and continue the next batch.

@jkotas

Copy link
Copy Markdown
Member

am11@ae7563a

Triggered copilot on it with explicit instruction to preserve the author name and some initial feedback, let's see how it does.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 24, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@jkotas@am11@AaronRobinsonMSFT
, '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

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO) - #125849

Merged
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback
Mar 24, 2026
Merged

Convert more COM interop MethodDescCallSite to UnmanagedCallersOnly (UCO)#125849
AaronRobinsonMSFT merged 8 commits into
mainfrom
copilot/address-pending-feedback

Conversation

CopilotAI commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Continues the COM interop UCO migration (group 5), converting three MethodDescCallSite call sites to the UCO pattern and removing associated dead code. Addresses all pending feedback from #125508.

Description

New UCO helpers in StubHelpers.cs

  • GetDispatchExPropertyFlags – replaces two MethodDescCallSite calls for PropertyInfo.CanRead/CanWrite in DispatchEx_GetMemberProperties; returns int directly via InvokeThrowing_Ret at the callsite (no out-param)
  • CallICustomQueryInterface – replaces the InvokeICustomQueryInterfaceGetInterface_CallBack struct/callback pattern; returns int directly (uses InvokeThrowing_Ret)
  • InvokeConnectionPointProviderMethod – replaces two MethodDescCallSite calls in ConnectionPoint::InvokeProviderMethod; uses nint/UIntPtr ctor fallback for correctness; uses GetMultiCallableAddrOfCode() for the event target since it is stored for future invokes
  • Added [RequiresUnsafe] to the existing GetIEnumeratorToEnumVariantMarshaler UCO overload for consistency

Feedback addressed

  • INVOKE_CONNECTION_POINT_PROVIDER_METHOD registered as NoSig in corelib.h (has unmanaged fn-ptr params — encoding in metasig not worth the pain)
  • CallICustomQueryInterface uses InvokeThrowing_Ret<INT32> and passes ppUnkOut directly — no local copy needed
  • GetDispatchExPropertyFlags signature changed to return int directly; metasig (SM_PtrPropertyInfo_PtrException_RetInt) and corelib.h registration updated accordingly; callsite in stdinterfaces.cpp updated to use InvokeThrowing_Ret<INT32>
  • UIntPtr ctor fallback restored in ConnectionPoint::InvokeProviderMethod for correctness
  • Comment updated in comconnectionpoints.cpp to clarify why GetMultiCallableAddrOfCode() is used for the event target

Dead code removed

  • InvokeICustomQueryInterfaceGetInterface_CallBack + arg struct in comcallablewrapper.cpp
  • GetICustomQueryInterfaceGetInterfaceMD / m_pICustomQueryInterfaceGetInterfaceMD from ComCallWrapperTemplate
  • m_ohDelegate union field and GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate from EEClass/MethodTableSetObjCreateDelegate had no callers; the delegate-based CreateAggregatedInstance path was effectively dead

⌨️ Start Copilot coding agent tasks without leaving your editor — available in VS Code, Visual Studio, JetBrains IDEs and Eclipse.

Converts COM interop code from MethodDescCallSite to UnmanagedCallersOnly
(UCO) pattern for three sites:
1. DispatchEx_GetMemberProperties (Property case): replaces two
MethodDescCallSite invocations (for CanRead/CanWrite) with a single
UCO helper GetDispatchExPropertyFlags in StubHelpers.
2. ICustomQueryInterface.GetInterface: replaces the callback struct
pattern with a UCO helper CallICustomQueryInterface. Also removes
the cached MethodDesc field m_pICustomQueryInterfaceGetInterfaceMD
from ComCallWrapperTemplate.
3. ConnectionPoint.InvokeProviderMethod: replaces MethodDescCallSite
calls for delegate construction and provider invocation with a
single UCO helper InvokeConnectionPointProviderMethod. Removes the
UIntPtr ctor fallback path (addressing pending feedback).
Also removes the m_ohDelegate field and related methods
(GetOHDelegate/SetOHDelegate/GetObjCreateDelegate/SetObjCreateDelegate)
from EEClass/MethodTable since the delegate-based COM object creation
callback feature in CreateAggregatedInstance is removed.
Adds [RequiresUnsafe] to GetIEnumeratorToEnumVariantMarshaler UCO
overload to be consistent with the new UCO methods.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/vm/comcallablewrapper.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

@jkotas
jkotas marked this pull request as ready for review March 20, 2026 20:41

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR continues the CoreCLR COM interop migration away from MethodDescCallSite toward the UnmanagedCallersOnly (UCO) reverse-P/Invoke calling pattern, and removes now-dead COM interop callback/delegate infrastructure in the VM.

Changes:

  • Added new UCO helpers in StubHelpers.cs and updated native call sites to use UnmanagedCallersOnlyCaller.
  • Converted COM interop call paths in stdinterfaces.cpp, comconnectionpoints.cpp, and comcallablewrapper.cpp from MethodDescCallSite to UCO-based helpers.
  • Removed dead COM interop delegate/callback code paths and related cached fields/helpers in VM types.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
src/coreclr/vm/stdinterfaces.cppUses UCO helper to query PropertyInfo.CanRead/CanWrite flags instead of two MethodDescCallSite calls.
src/coreclr/vm/runtimecallablewrapper.cppRemoves unused delegate-based aggregated COM instance creation path and related logic.
src/coreclr/vm/methodtable.hRemoves delegate-handle-related APIs from MethodTable.
src/coreclr/vm/methodtable.cppRemoves implementations for COM object-creation delegate storage/retrieval.
src/coreclr/vm/metasig.hAdds COM-interp UCO metasig definitions for new StubHelpers methods.
src/coreclr/vm/corelib.hRegisters new StubHelpers methods (including a NoSig entry).
src/coreclr/vm/comconnectionpoints.cppUses a single UCO helper to construct delegate + invoke provider method.
src/coreclr/vm/comcallablewrapper.hRemoves cached ICustomQueryInterface.GetInterface MethodDesc field/API.
src/coreclr/vm/comcallablewrapper.cppReplaces callback/cached-MD pattern with UCO helper that calls ICustomQueryInterface.GetInterface.
src/coreclr/vm/class.hRemoves now-dead delegate handle storage from EEClass COM interop union.
src/coreclr/System.Private.CoreLib/src/System/StubHelpers.csAdds UCO helpers for DispatchEx property flags, ICustomQueryInterface, and connection point invocation.

Comment threadsrc/coreclr/vm/stdinterfaces.cpp

@AaronRobinsonMSFTAaronRobinsonMSFT 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.

Some minor nits. Otherwise, looks good when green.

Comment threadsrc/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs Outdated
Comment threadsrc/coreclr/vm/stdinterfaces.cpp Outdated
Comment threadsrc/coreclr/vm/comconnectionpoints.cpp
…InvokeThrowing_Ret
Co-authored-by: AaronRobinsonMSFT <30635565+AaronRobinsonMSFT@users.noreply.github.com>
Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/dde670ee-197d-4271-8596-d75d3cca3116
@AaronRobinsonMSFTAaronRobinsonMSFT added this to the 11.0.0 milestone Mar 23, 2026
@AaronRobinsonMSFT
AaronRobinsonMSFT enabled auto-merge (squash) March 23, 2026 23:06
@jkotas

Copy link
Copy Markdown
Member

/ba-g timeouts

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit 63e88d1 into mainMar 24, 2026
96 of 104 checks passed
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the copilot/address-pending-feedback branch March 24, 2026 04:11
@am11

am11 commented Mar 24, 2026

Copy link
Copy Markdown
Member

@jkotas, it would be good to ask copilot to keep the author of original commit and add stuff on top.

am11@ae7563a has dispatchinfo conversions. I tested it last week but haven't retested after the cherry-pick (should be fine). Copilot can pick it and continue the next batch.

@jkotas

Copy link
Copy Markdown
Member

am11@ae7563a

Triggered copilot on it with explicit instruction to preserve the author name and some initial feedback, let's see how it does.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 24, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@jkotas@am11@AaronRobinsonMSFT