Como consumir un Worflow desde .Net y desde fuera de .Net

jueves, 23 de abril de 2009

Ahora que el WWF esta disponible, tenemos mucha informacion de que es WWF pero en muy pocos lugares(sobre todo en español) no hay información de cómo consumir un workflow ya sea desde un entorno.Net como fuera de el, para ir directo al grano les mostrare un  poco de código que es el resultado de pelear con el WWF por unos días.

Primero vamos a crearnos un WF muy sencillo, un “hola mundo”.

inicio -->CodeActivity1(Comenzando)-->CodeActivity2(Medio)-->CodeActivity(Finalizando)-->end

El código que viene detrás de este WF es este:

Public class Workflow1

    Inherits SequentialWorkflowActivity

 

    Private Sub Comenzando(ByVal sender As System.Object, ByVal e As System.EventArgs)

        System.Diagnostics.Debug.WriteLine("Comanzando el Workflow")

    End Sub

 

    Private Sub Medio(ByVal sender As System.Object, ByVal e As System.EventArgs)

        System.Diagnostics.Debug.WriteLine("A Medio Workflow")

    End Sub

 

    Private Sub Finalizando(ByVal sender As System.Object, ByVal e As System.EventArgs)

        System.Diagnostics.Debug.WriteLine("Finalizando el Workflow")

    End Sub

End Class

 

Como verán nada del otro mundo, ahora para consumir este WF debemos crear un objeto de tipo WorkflowRuntime al que le pasaremos como parámetro en un objeto Type el WorkFlow que queremos ejecutar de la siguiente manera.

Para comenzar definir un objeto runtime de manera shared para toda la clase

Public Shared wr As New System.Workflow.Runtime.WorkflowRuntime

 

Luego el codigo para iniciar el workflow seria el siguiente:

 

        Dim t As Type = GetType(WFLibrary.Workflow1)

        Dim instance As System.Workflow.Runtime.WorkflowInstance = wr.CreateWorkflow(t)

        instance.Start()

 

ahora si necesitan pasarle parametros al momento de crear la instancia le pueden pasar un objeto Dictionary ademas del type con lo que se necesite.

Ahora, este ejemplo funciona bien desde un entorno .Net, pero que pasa si queremos usar el WF desde un entorno COM? Facil, creamos una clase que nos sirva de puente entre COM y .Net, y esta clase se la crea en .Net de tal manera que nos sea util en cualquier parte.

Para poder realizar tal azaña solo se necesita compilar un assembly con las propiedades COMVisible, ademas de unas pocas cosas mas en el codigo.

Para empezar veamos el codigo; necesitamos referenciar un namespace de .net de manera que tengamos disponibles algunas propiedades mas al momento de crear la estructura de la clase.

Imports System.Runtime.InteropServices

Luego creamos nuestra clase especificando el atributo COMVisible en verdadero para las clases que queremos que sean visibles desde COM.

 

<ComVisible(True)> _

Public Class MyInteropClass

    Public Property MyProperty() As String

        Get

            Return "Hola Mundo...!"

        End Get

        Set(ByVal value As String)

 

        End Set

    End Property

 

End Class

 

Con esto estamos casi listos, ahora necesitamos decirle al compilador de .net que haga esta clase visible en un entorno COM, esto es para que se creen todas las entradas de registro del sistema para nuestra libreria(dll)

Menu Project->Properties->Compile

              Seleccionar Register for COM Interop

Las pruebas fueron realizadas en vb.net y en c# en un entorno en ingles, y se comprobo que en un vs 2005 en español al momento de registrar la librería no se crea la llave de registro CodeBase en donde se almacena la ruta del dll, si ese fuese el caso hay 2 soluciones, crear la llave de registro o copiar el assembly a la carpeta System32 de Windows.

Bueno con todo esto lo unico que falta es unir la clase COMVisible con el proyecto ya sea web o desktop.

0 comments:

Publicar un comentario