Accediendo a tus ensamblados de .NET desde Silverlight–Parte 2
Posted on : 27-07-2011 | By : Rodrigo | In : Silverlight, Silverlight 4, Silverlight 5
Tags: AutomationFactory, interop, Silverlight
0
En el artículo anterior, vimos el uso de la clase AutomationFactory para poder crear objetos de tus ensamblados creados con el .NET Framework 4.0, y utilizarlos en Silverlight.
En el ejemplo, invocamos un método como cualquier otro y efectivamente obtenemos los resultados esperados, en este caso, la lista de unidades lógicas del equipo del usuario en donde está ejecutando la aplicación. Pero ¿qué pasaría si necesitáramos manejar un evento que es disparado por el componente (tu ensamblado) de .NET? En este caso la implementación debe cumplir con ciertos requisitos.
Atributo ComSourceInterfacesAttribute
Para que podamos exponer un evento en nuestro ensamblado, y que pueda ser manejado por la aplicación de Silverlight a través de automatización, debemos marcar nuestra clase que implementa el evento con el atributo ComSourceInterfacesAttribute, el cual indica una lista de interfaces que contienen los eventos a exponer en dicha clase.
Por lo tanto, en nuestro proyecto necesitamos crear una inteface que tenga la signatura del evento que deseamos exponer y disparar en la clase. Asimismo, esta inteface debe ser de tipo IDispatch.
En el proyecto, he agregado la interface IInformacion, con la siguiente implementación:
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] [ComVisible(true)] public interface IInformacion { void OnGetLogicalDrivesInfo(int count); }
El método OnGetLogicalDrivesInfo incluye como argumento un int que tendrá el conteo de cuántas unidades físicas han sido encontradas.
Una vez implementada la interface, la clase Informacion la decoramos con el atributo ComSourceInterfacesAttribute, indicando el tipo de interface que la clase expone, en este caso la interface IInformacion que creamos anteriormente:
[ComSourceInterfaces(typeof(IInformacion))] [ComVisible(true)] public class Informacion { ... }
Ahora bien, debemos implementar un delegado que empate la signatura del método incluido en la interface IINotificacion, y un evento que esté basado en dicho delegado. Será este evento que el que dispararemos dentro de la clase Notificacion.
public delegate void GetLogicalDrivesInfoEventHandler(int count); public event GetLogicalDrivesInfoEventHandler OnGetLogicalDrivesInfo;
Finalmente, disparamos el evento adecuadamente. Esto lo estoy haciendo dentro del método GetLogicalDrivesInfo() una vez cargada la lista de unidades lógicas.
if (OnGetLogicalDrivesInfo != null) { OnGetLogicalDrivesInfo(result.Count); }
El ensamblado está listo para recompilarse y re-registrarse.
Clase AutomationEvent
Del lado de la aplicación de Silverlight, necesitamos manejar el evento expuesto por el componente: les presento la clase AutomationEvent.
La clase AutomationEvent representa un evento de automatización. Necesitamos obtener una referencia del evento OnGetLogicalDrivesInfo, el cual disparará el componente de .NET una vez que hayamos obtenido la lista de todas las unidades lógicas. Esto lo podemos hacer a través del método GetEvent() de la clase AutomationFactory, indicando primeramente el objeto que incluye el evento, seguido del nombre del evento como tal. El método GetEvent() nos regresará un objeto de tipo AutomationEvent.
La clase AutomationEvent incluye un evento llamado EventRaised, el cual es disparado como resultado del evento del componente. En los argumentos del evento EventRaised podremos obtener la lista de argumentos originales. El siguiente código muestra el manejo del evento OnGetLogicalDrivesInfo, el cual una vez manejado obtenemos el conteo del total de unidades lógicas leídas.
dynamic obj = AutomationFactory.CreateObject("Utilerias.Informacion"); AutomationEvent ev = AutomationFactory.GetEvent(obj, "OnGetLogicalDrivesInfo"); ev.EventRaised += (s, a) => { MessageBox.Show(string.Format("Total de unidades: {0}", a.Arguments[0])); };
Al ejecutar la aplicación con los cambios que hemos implementado, podremos obtener el valor del argumento del evento que se ha disparado.







