Come inviare un parametro evento di callback per un oggetto COM con .net
-
23-10-2019 - |
Domanda
Ho un riferimento a un DLL COM. Alcuni metodi si aspettano un parametro di callback. Ho controllato l'interop.MyComLib.dll riflettore:
public virtual extern void Foo([In, MarshalAs(UnmanagedType.IDispatch)] object pDispProgressCallBack);
Come faccio a inviare questo parametro? Non è possibile inviare un delegato (eccezione compilation). Ho provato l'invio this
e InvalidCastException
ricevuto.
Soluzione
IDispatch è un'interfaccia COM. Il CLR verrà automaticamente attuarlo se si usa [ComVisible (true)] e [ClassInterface (ClassInterfaceType.AutoDispatch)] attributi di classe. È quindi possibile passare un'istanza della classe e il cast avrà successo. Il codice viene poi probabilmente andando a chiamare un qualche tipo di metodo su quella classe in modo da assicurarsi che sia implementata. Non è chiaro dalla domanda quale metodo che potrebbe essere e ciò che la sua firma dovrebbe essere simile. Si deve corrispondere esattamente, una mancata corrispondenza è responsabile per evitare che il callback si verifichi mai, senza una diagnosi.
Altri suggerimenti
Si vuole passare a un oggetto che è un IDispatch e ha un metodo con un DISPID di 0. Vedere questo articolo per come creare un IDispatch, poi dare un unico metodo con DISPID (0).