2008-10-22 8 views
1

Je l'ai vu à quelques reprises en utilisant des classes Bureau InteropComment créer une instance d'interface dans Office Interop?

this.CustomXMLParts.Add(MyResources.Data, new Office.CustomXMLSchemaCollection()); 

Si je passe la souris sur la classe CustomXMLSchemaCollection, il apparaît comme une interface. Alors comment je peux en faire un nouveau? Ce qui donne? BTW ce code compile et fonctionne.

Répondre

2

Vous ne créez pas une instance de l'interface CustomXMLSchemaCollection mais une instance de la coclasse CustomXMLSchemaCollectionClass.

La définition de l'interface CustomXMLSchemaCollection est:

[Guid("000CDB02-0000-0000-C000-000000000046")] 
[CoClass(typeof(CustomXMLSchemaCollectionClass))] 
public interface CustomXMLSchemaCollection : _CustomXMLSchemaCollection 
{ 
} 

Cela signifie que le coclasse désigné qui implémente l'interface est CustomXMLSchemaCollectionClass. Ma conjecture est que lorsque le compilateur C# voit la nouvelle interface pour CustomXMLSchemaCollection il le traduit pour créer une instance COM du CustomXMLSchemaCollectionClass en fonction des attributs fournis avec l'interface.

Après avoir écrit cet exemple simple:

namespace ConsoleApplication2 
{ 
    using System; 
    using Office = Microsoft.Office.Core; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Office.CustomXMLSchemaCollection test = new Office.CustomXMLSchemaCollection(); 
     } 
    } 
} 

Je viens couru ildasm et obtenir le MSIL suivant:

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  8 (0x8) 
    .maxstack 1 
    .locals init ([0] class [Interop.Microsoft.Office.Core]Microsoft.Office.Core.CustomXMLSchemaCollection test) 
    IL_0000: nop 
    IL_0001: newobj  instance void [Interop.Microsoft.Office.Core]Microsoft.Office.Core.CustomXMLSchemaCollectionClass::.ctor() 
    IL_0006: stloc.0 
    IL_0007: ret 
} // end of method Program::Main 

Comme vous pouvez le voir la classe qui est construit est CustomXMLSchemaCollectionClass pour prouver mon hypothèse de départ .

+0

OK COM Magic à nouveau au travail. - On dirait que l'attribut CoClass est la clé de ce comportement hors-piste. THX – Gishu

Questions connexes