miércoles, 20 de octubre de 2010

Cambio de blog

He decidido cambiarme a wordpress... asi que esta es la nueva dirección..

New Blog !!

lunes, 18 de octubre de 2010

Utilizando el namespace My

Bueno, una de las grandes ventajas (a mi parecer) para todos aquellos que desarrollamos con visual basic.net es la posibilidad de poder usar el namespace my para algunas tareas comunes como acceder a la información del equipo, operacion de entrada y salida de archivos y capertas, acceso a puertos, entre otras.

Aunque es posible usarlo tambien con C# referenciando la libreria Microsoft.VisualBasic.dll para el lenguaje visua basic .net digamos que es nativo...

Esta vez no explicare todo el código, ya que el uso es realmente sencillo, además que podemos extender este namespace para agregarle nuevas funcionalidades, lo cual hare en un proximo post... por el momento solo comentar que el ejemplo obtengo información del sistema, realizo operaciones comunes con archivos como abrir, crear, copiar y eliminar un archivo y por último accedo al folder de música, se cargan las canciones en un listbox y tenemos dos botones uno para escuchar y el otro para detener la canción, lo único a tener en cuenta es que las canciones deben ser de tipo wav (en un proximo post veremos como hacer un reproductor de mp3 de una manera bastante fácil).

Sin más les dejo el ejemplo con una cancion en formato wav, solo deben copearla a la carpeta de música predefinida... espero que les sea de utilidad !!

Descarga del ejemplo !!

jueves, 7 de octubre de 2010

Creando un servicio windows...

Primero que todo, voy a explicar de una manera muy coloquial lo que es un servicio windows. Un servicio windows es una aplicación cliente sin interfaz de usuario, la cual se ejecuta de manera "transparente" al usuario, generalmente un servicio windows se inicia con la carga del sistema operativo.

Se puede decir que un servicio windows es un proceso que corre en background. Un servicio windows es una aplicación que se ejecuta constantemente sin interacción con el usuario.

Un aspecto muy importante, es que para probar un servicio windows este debe estar instalado en el equipo, no es posible ejecutarlo simplemente con f5 como con una aplicación asp.net o de escritorio.

Bueno ahora si a lo q te truje..jajaja

1. Crear un prpyecto de servicio windows:
Bueno en mi caso tengo el vs 2010, asi que vamos a File > New Project > seleccionamos windows, luego windows service, le asignamos un nombre y por último damos clic en ok.



2. Luego que Visual Studio ha creado el proyecto, se muestra una pantalla azul con un texto en el centro, el cual ofrece dos posibilidades: a) Arrastrar objetos desde la barra de herramientas (toolbox) y b) cambiar a la vista de código, siendo está la opción a usar.

3.En la pantalla de diseño del servicio, dar clic en cualquier area limpia para poder mostrar en el panel de propiedades las propiedades del prpyecto, y en las propiedades cambiamos el nombre del servicio, y establacemos las propiedades CanPauseAndContinue y CanShutdown en true, estas propiedades indican si el servicio puede ser pausaso y reinicicado, y si puede ser detenido respectivamente.

4.Ahora para este ejemplo, se debe agregar como referencia el namespace System.Net.

Se da clic derecho sobre el nombre del proyecto y luego seleccionar Add reference...



5. Ahora si seleccionamos la opción cambiar a vista de código, y automaticamente se cambia al editor de código donde se visualizan dos métodos a) OnStart y b) OnStop.

Adicionalmenete vamos a adicionar el código necesario para sobreescribir los métodos a) OnContinue y b)OnPause.

Aunque se sobreentiede lo que realiza cada método, lo voy a mencionar:
a)OnStart: código a ejecutar cuando se inicia el servicio.
b)OnStop: código a ejecutar cuando se detiene el servicio.
c)OnContinue: código a ejecutar cuando se reinicia el servicio.
d)OnPause: código a ejecutar cuando se pausa el servicio.

Adicionalmente importamos el espacio de nombres System.Timers, System.IO, Imports System.Diagnostics.Process y Imports System.Text, luego creamos de manera global un objeto de tipo Timer.



6.Ahora en el constructor de la clase, instanciamos la variable timer y le pasamos como argumento el valor en milisegundos del tiempo de espera para realizar un nuevo evento.

Un objeto de tipo Timer realiza una acción cada cierto tiempo, así que se define el tiempo ente cada "pasada".

Luego adicionamos un manejador para el timer.

Public Sub New()
InitializeComponent()
oTimer = New Timer(8000)
AddHandler oTimer.Elapsed, New ElapsedEventHandler(AddressOf Me.oTimer_Elapsed)
End Sub

Luego en los 4 eventos antes mencionados simplemente iniciamos el timer o lo detenemos respectivamente.

Inciar/Reiniciar: oTimer.Start()
Detener/Pausar: oTimer.Stop()

7.Ahora creamos el método Elapsed del timer, debajo de donde dice Me.oTimer_Elapsed vemos una rayita roja, la cual indica que el método no esta definido, así que para aprovechar una de las nuevas características de visual studio 2010 nos paramos con el mouse sobre la linea, expandemos las opciones y seleccionamos generar método para....y visual studio on genera la definición del método:



8.Ahora lo interesante, la idea es q el servicio windows cada 8 segundos abra el explorador de internet en una página específica y genere un documento en el cual se guarde la hra y fecha de intento de acceso a internet.


Private Sub oTimer_Elapsed(ByVal sender As System.Object, ByVal e As ElapsedEventArgs)

        Dim sUrl As String = "http://jtodonet.blogspot.com/"

        Dim sTexto As New StringBuilder

        Dim sRuta As String = AppDomain.CurrentDomain.SetupInformation.ApplicationBase & "MyLog.txt"



        If My.Computer.Network.IsAvailable Then

            sTexto.AppendLine("FECHA: " & Now)

            sTexto.AppendLine("ESTADO DE RED: disponible")

            sTexto.AppendLine("----------------------------------------------------------")

        Else

            sTexto.AppendLine("FECHA: " & Now)

            sTexto.AppendLine("ESTADO DE RED: no disponible")

            sTexto.AppendLine("----------------------------------------------------------")

        End If



        Try

            Dim oTextWriter As TextWriter = New StreamWriter(sRuta, True)

            oTextWriter.WriteLine(sTexto.ToString)

            oTextWriter.Close()

        Catch ex As Exception

            EventLog.WriteEntry("MyWindowsService", "Error: " & ex.Message.ToString)

        End Try

    End Sub


Bueno aunque el post es sobre crear un servicio windows, explicare brevemente el código:
a) Se crea una variable que tenga la dirección de la página web.
b) Variable que almacenara los datos a escribier en el archivo
c) Variable que tiene la ruta para el archivo de texto
d) Se verifica si el pc tiene acceso a internet (Con el espacio de nombres My que veremos en un proximo post)
e) Se crean los datos para escribir en el archivo
f) Se intenta crear y escribir en el archivo
g) Se controla todas las posibloes execpcionesy se mandar al visor de sucesos (Lo trataré en un proximo post).

Ahora que ya tenemos todos, hacemos un build al proyecto y verificamos que todo este bien.

En mi caso obtuve el siguiente error:

'Sub Main' was not found in 'MyWindowsService.Service1', el cual me indica que mi servicio no tiene un punto de entrada, asi que doy doble clic sobre el error y selecciono el método:



Ahora que tenemos el servicio listo, vamos a crear un instalador para el servicio:

1. En la vista de diseño, sobre la parte azul damos clic derecho y seleccionamos Add Installer...



Y automaticamente en el Solution Explorer vemos un elemento llamado ProjectInstaller.vb y se carga la vista de diseño del mismo.

2. Ahora a configurar el ServiceInstaller:

a) StartType: Indica el modo de inicio del servicio, manual quiere decir que el servicio debe ser iniciado por el usuario (panel de control > servicios), automatico que el servicio se iniciará cuando se cargue el sistema operativo y deshabilitado. Vamos a dejarlo en automático.

b)Description: Descripción del servicio. Para nuestro caso "Mi servicio windows". Está serpa la descripción que se verá en panel de control > servicios

c)DisplayName: Nombre del servicio mostrado el panel de control > servicios. Para el ejemplo "MyService"

d)Account: Indica la cuenta que maneja el servicio. Para el ejemplo LocalSystem. [Esta opción la vemos al seleccionar ServiceProcessInstaller1]

Luego y ya para terminar adicionamos un proyecto de instalador a la solución y lo usamos para generar el instalador de nuestro servicio (en el proximo post lo explicare en forma detallada)

Descarga del ejemplo !!