2009-12-30 4 views
6

Credo che la creazione di un oggetto COM che aggrega un oggetto COM esistente implichi l'implementazione della logica di reindirizzamento nel metodo IUnknown.QueryInterface dell'oggetto esterno.Aggregazione COM gestita

La domanda che ho è come farlo se l'oggetto che stai costruendo è gestito. Su oggetti gestiti IUnknown non è implementato in modo esplicito COM Interop lo fa per te. Quindi, come faccio a comunicare a COM Interop che l'oggetto che creo è un'aggregazione di un altro oggetto COM?

Finora l'unico modo che ho trovato è quello di implementare tutte le interfacce dell'oggetto interno all'esterno e di reindirizzarle esplicitamente. Questo è un) brutto eb) presume che tu conosca tutte le interfacce per implementare ciò che non è il caso nella mia situazione.

Qualche idea?

risposta

7

Se si utilizza .NET 4, è possibile utilizzare ICustomQueryInterface per sovrascrivere la logica predefinita IUnknown.QueryInterface. C'è un sample for COM aggregation su CodePlex - l'implementazione è molto semplice:

CustomQueryInterfaceResult ICustomQueryInterface.GetInterface(ref Guid iid, out IntPtr ppv) 
{ 
    if(iid.Equals(new Guid("00000000-0000-0000-0000-0000000"))) 
    { 
     ppv = Marshal.GetComInterfaceForObject(this.innerObject, typeof(IInnerInterface), CustomQueryInterfaceMode.Ignore); 
     return CustomQueryInterfaceResult.Handled; 
    } 
    ppv = IntPtr.Zero; 
    return CustomQueryInterfaceResult.NotHandled; 
} 
+1

Bene, questo è bene sapere, ma per ora il mio obiettivo è 3,5 – mfeingold

+0

come implementare correttamente l'interfaccia COM richiesta? GetComInterfaceForObject non fallisce, ma IRibbonExtensibility.GetCustomUI non viene mai chiamato. La mia domanda: http://stackoverflow.com/questions/15921925/requirements-for-com-aggregate-my-custom-iribbonextensibility-implementation – sputnik