svick
svick

Reputation: 244767

COM interop interface casting

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

Answers (2)

Chris Dickson
Chris Dickson

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

sharptooth
sharptooth

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

Related Questions