2011-04-11 4 views
1

Après this article, j'ai réussi à traduire classe C++ COM/déclaration d'interface en C# comme ceci:interface COM Interop coulée

[InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid(IfaceGuid)] 
public interface IFoo 
{ 
    void Bar(); 
} 

[ComImport, Guid(ClassGuid)] 
public class Foo 
{ } 

je l'utilise comme ceci:

var foo = new Foo(); 
var ifoo = (IFoo)foo; 

ifoo.Bar(); 

Ma question est, comment cela peut-il fonctionner, étant donné que Foo n'implémente pas IFoo (même à l'exécution, typeof(Foo).GetInterfaces() est vide) et que les conversions définies par l'utilisateur vers des interfaces sont interdites?

Est-ce un traitement spécial réservé à COM? Qu'est-ce que la spécification C# a à dire à ce sujet?

Répondre

2

ComImport les types sont traités différemment par rapport aux classes .NET «normales», car elles constituent un wrapper appelable à l'exécution autour d'une coclasse COM sous-jacente. La fusion d'une instance de l'un d'entre eux dans un type d'interface COM est mappée de façon transparente dans un appel à l'implémentation de l'objet de la méthode d'interface COM IUnknown.QueryInterface.

Si QI pour l'interface demandée réussit au niveau COM, la conversion C# réussira également.

1

Eh bien, oui, les jets pour les classes marquées avec ComImport aux interfaces COM donnent un QueryInterface() sous le capot - que je suppose est fait à l'intérieur du RCW.

De cette façon, new appelle CoCreateInstance() étant appelé, puis la conversion conduit à l'appel QueryInterface().