https://bugs.winehq.org/show_bug.cgi?id=51459
--- Comment #8 from Esme Povirk madewokherd@gmail.com --- This seems a bit complicated so I'm not going to work on it right now, I'll just leave some pointers for the future or in case anyone else wants to work on it. InvokeMember is in referencesource/mscorlib/system/rttype.cs. We'll need to do something similar to cominterop_ccw_invoke_impl but in reverse. We can use Marshal.GetNativeVariantForObject in managed code to translate parameters into an array of VARIANT structures. Then we'll need an icall that maps names to ids, and calls IDispatch::Invoke. The managed part can then translate any reference parameters and the result back to objects from VARIANT.