Uh oh!
There was an error while loading. Please reload this page.
Convert more COM interop MethodDescCallSite to UCO - #125508
Conversation
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
jkotas
commented
Mar 20, 2026
This was close to being merged, except the InvokeArgSlot one that needs more work so that we are confident about it. Would you like to resubmit the delta without InvokeArgSlot? |
Uh oh!
There was an error while loading. Please reload this page.
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
am11
commented
Mar 20, 2026
Failures are known/unrelated. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
| INT_PTR queriedInterface = reinterpret_cast<INT_PTR>(*ppUnkOut); | ||
| INT32 result = static_cast<INT32>(CustomQueryInterfaceResult::NotHandled); | ||
| UnmanagedCallersOnlyCaller callICustomQueryInterface(METHOD__STUBHELPERS__CALL_ICUSTOM_QUERY_INTERFACE); | ||
| callICustomQueryInterface.InvokeThrowing(&pObj, &guid, &queriedInterface, &result); |
There was a problem hiding this comment.
There is also InvokeThrowing_Ret that can be used to return primitives. We use it in a few places and in this case probably is easier to read. You can then also update the managed signature to be more "natural".
| DEFINE_METHOD(STUBHELPERS, GET_IENUMERATOR_TO_ENUM_VARIANT_MARSHALER, GetIEnumeratorToEnumVariantMarshaler, SM_PtrObj_PtrException_RetVoid) | ||
| DEFINE_METHOD(STUBHELPERS, GET_DISPATCH_EX_PROPERTY_FLAGS, GetDispatchExPropertyFlags, SM_PtrPropertyInfo_PtrInt_PtrException_RetVoid) | ||
| DEFINE_METHOD(STUBHELPERS, CALL_ICUSTOM_QUERY_INTERFACE, CallICustomQueryInterface, SM_PtrICustomQueryInterface_PtrGuid_PtrIntPtr_PtrInt_PtrException_RetVoid) | ||
| DEFINE_METHOD(STUBHELPERS, INVOKE_CONNECTION_POINT_PROVIDER_METHOD, InvokeConnectionPointProviderMethod, SM_PtrObj_IntPtr_PtrObj_IntPtr_PtrObj_IntPtr_Bool_PtrException_RetVoid) |
There was a problem hiding this comment.
| DEFINE_METHOD(STUBHELPERS, INVOKE_CONNECTION_POINT_PROVIDER_METHOD, InvokeConnectionPointProviderMethod, SM_PtrObj_IntPtr_PtrObj_IntPtr_PtrObj_IntPtr_Bool_PtrException_RetVoid) | |
| DEFINE_METHOD(STUBHELPERS, INVOKE_CONNECTION_POINT_PROVIDER_METHOD, InvokeConnectionPointProviderMethod, NoSig) |
This should be nosig now that it has unmanaged pointers in the signatures (encoding the unmanaged pointers in the signature here is not worth the pain).
| INT_PTR queriedInterface = reinterpret_cast<INT_PTR>(*ppUnkOut); | ||
| INT32 result = static_cast<INT32>(CustomQueryInterfaceResult::NotHandled); | ||
| UnmanagedCallersOnlyCaller callICustomQueryInterface(METHOD__STUBHELPERS__CALL_ICUSTOM_QUERY_INTERFACE); | ||
| callICustomQueryInterface.InvokeThrowing(&pObj, &guid, &queriedInterface, &result); | ||
| *ppUnkOut = reinterpret_cast<IUnknown*>(queriedInterface); |
There was a problem hiding this comment.
| INT_PTR queriedInterface = reinterpret_cast<INT_PTR>(*ppUnkOut); | |
| INT32 result = static_cast<INT32>(CustomQueryInterfaceResult::NotHandled); | |
| UnmanagedCallersOnlyCaller callICustomQueryInterface(METHOD__STUBHELPERS__CALL_ICUSTOM_QUERY_INTERFACE); | |
| callICustomQueryInterface.InvokeThrowing(&pObj, &guid, &queriedInterface, &result); | |
| *ppUnkOut = reinterpret_cast<IUnknown*>(queriedInterface); | |
| INT32 result = static_cast<INT32>(CustomQueryInterfaceResult::NotHandled); | |
| UnmanagedCallersOnlyCaller callICustomQueryInterface(METHOD__STUBHELPERS__CALL_ICUSTOM_QUERY_INTERFACE); | |
| callICustomQueryInterface.InvokeThrowing(&pObj, &guid, ppUnkOut, &result); | |
We do not need a local copy of the IUnknown. This should also reduce changes that the IUknown reference leak if an exception is thrown in a specific spot.
am11
commented
Mar 20, 2026
PR was already approved and we had a good checkpoint with all tests passing. Now I have to go back to debug the new issues in additional changes made in last two hours. I will park this for now from my side. If someone else has time, feel free to continue ( |
jkotas
commented
Mar 20, 2026
Asked copilot to continue: #125849 |
…UCO) (#125849) Continues the <a href="https://github.com/dotnet/runtime/issues/123864">COM interop UCO migration</a> (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`/`MethodTable` — `SetObjCreateDelegate` had no callers; the delegate-based `CreateAggregatedInstance` path was effectively dead <!-- START COPILOT CODING AGENT TIPS --> --- ⌨️ Start Copilot coding agent tasks without leaving your editor — available in [VS Code](https://gh.io/cca-vs-code-docs), [Visual Studio](https://gh.io/cca-visual-studio-docs), [JetBrains IDEs](https://gh.io/cca-jetbrains-docs) and [Eclipse](https://gh.io/cca-eclipse-docs). --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Jan Kotas <jkotas@microsoft.com> Co-authored-by: AaronRobinsonMSFT <30635565+AaronRobinsonMSFT@users.noreply.github.com>
Contributes to #123864 (group 5: except dispatchinfo.cpp)