Reputation: 244767
Following this article, I have successfully translated C++ COM class/interface declaration into C# like this:
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid(IfaceGuid)]
public interface IFoo
{
void Bar();
}
[ComImport, Guid(ClassGuid)]
public class Foo
{ }
I use it like this:
var foo = new Foo();
var ifoo = (IFoo)foo;
ifoo.Bar();
My question is, how can this possibly work, considering that Foo
doesn't implement IFoo
(even at runtime, typeof(Foo).GetInterfaces()
is empty) and that user-defined conversions to interfaces are forbidden?
Is this some special handling reserved just for COM? What does the C# specification have to say about this?
Upvotes: 1
Views: 1608
Reputation: 12135
ComImport
types are treated differently compared to "normal" .NET classes, as they constitute a runtime-callable wrapper around an underlying COM coclass. Casting an instance of one of these into a COM interface type is transparently mapped into a call to the object's implementation of the COM interface method IUnknown.QueryInterface
.
If QI for the requested interface succeeds at the COM level, then the C# cast will also succeed.
Upvotes: 2
Reputation: 170499
Well, yes, casts for classes marked with ComImport
to COM interfaces result in a QueryInterface()
under the hood - that I guess is done inside the RCW.
This way new
leads to CoCreateInstance()
being called and then the cast leads to QueryInterface()
being called.
Upvotes: 1