Cómo enviar un parámetro de devolución de llamada de evento a un objeto COM con .NET
-
23-10-2019 - |
Pregunta
He referenciado un com dll. Algunos métodos esperan un parámetro de devolución de llamada. Revisé el interop.mycomlib.dll en reflector:
public virtual extern void Foo([In, MarshalAs(UnmanagedType.IDispatch)] object pDispProgressCallBack);
¿Cómo envío este parámetro? No puedo enviar un delegado (excepción de compilación). He intentado enviar this
y recibido InvalidCastException
.
Solución
Idispatch es una interfaz COM. El CLR lo implementará automáticamente si usa los atributos [Comvisible (true)] y [classInterfaceType.autodisPatch)] en su clase. Luego puede pasar una instancia de la clase y el elenco tendrá éxito. El código probablemente llamará a algún tipo de método en esa clase, así que asegúrese de que esté implementado. No está claro por la pregunta de qué método podría ser y cómo debería ser su firma. Debe coincidir exactamente, un desajuste puede evitar que la devolución de llamada se produzca sin diagnóstico.
Otros consejos
Desea pasar en un objeto que sea un idsispatch y tiene un método con una disputa de 0. ver Este artículo Para obtener cómo crear un idsispatch, dale un solo método con dispid (0).