Buscar este blog

domingo, 17 de junio de 2012

Delegados anonimos asincronos

El titulo lo dice todo aquí esta el ejemplo:

Func<bool> async = () => {
    return false;
};
IAsyncResult res = async.BeginInvoke(null, null);
async.EndInvoke(res);
 
Lo único que hay que resaltar es que en el ejemplo use una función que retorna un bool como se observa claramente pero se pueden usar las diferentes variantes de Func y Action para cambiar los parámetros y resultados.

sábado, 16 de junio de 2012

MochaHost un buen hosting para Asp.Net

Si buscan un buen hosting para Asp.Net permitanme recomendarles MochaHost.
Yo llevo un tiempo con este servicio contratado para varios sitios, todos hechos en Asp.Net y me parece muy buena alternativa, el servicio es muy económico y tiene varios puntos a su favor en primer lugar todo es ilimitado: sitios ilimitados, subdominios ilimitados, trafico ilimitado y hasta bases de datos ilimitadas de tamaño ilimitado, incluyendo Sql Server.
Otra cosa es que actualizan la versión de .Net en cuanto aparece una nueva así que puedes empezar a usar nuevas características sin esperar meses para la actualización, esto es algo que casi nadie tiene.
Además el servicio es bueno, casi no falla y el soporte técnico responde rápido, por supuesto no esta libre de problemas, pero bueno yo he usado diferentes hostings y este no tiene tantos problemas como otros que son mas caros y lo limitan a uno en prestaciones.
Bueno sin más les dejo el link a MochaHost:

MochaHost - ASP.NET/MS SQL Hosting from $2.48/month !

domingo, 10 de junio de 2012

Usando dbus en .Net

Si programas para Linux una de las cosas que te serán muy útiles es usar dbus ya sea para implementar comunicación entre tus aplicaciones o para inspeccionar el estado del sistema.
En este ejemplo veremos como usar dbus para saber si el screensaver de gnome esta activo.
Usamos la dll dbus-sharp que se obtiene desde el git de mono, aquí esta la liga:
dbus-sharp en github
Yo use la ultima versión del repositorio no las descargas oficiales que son muy viejas.
Bueno lo mejor del proyecto es que te permite obtener la información con tipos de datos duros, nada de castear objects.
Lo primero que debes hacer es crear una interfaz que declare los miembros que exporta la clave de dbus que vas a usar por ejemplo para el screensaver en la siguiente pagina podemos ver los miembros exportados:
http://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html

Ahí podemos ver que tenemos un método y una señal (evento) para saber si el screensaver esta activo:
GetActive y ActiveChanged
Asi que nuestra interfaz declara los dos miembros un evento y una función:
public delegate void ActiveChangedHandler(bool active);
[Interface("org.gnome.ScreenSaver")]
public interface IScreenSaver {
    event ActiveChangedHandler ActiveChanged;
    bool GetActive();
}
Como podemos ver podemos declarar solo los miembros que necesitamos no es necesario declarar todos los miembros.
Ahora usamos la interface en nuestro codigo, solo es necesario conectarse a dbus y obtener un objeto que implementa la interfaz desde la conexión, no es necesario ningún código para el objeto la dll se encarga de implementar la interfaz automáticamente, después solo resta usar los miembros:
class Program {
    static Connection con = Bus.Session;
    static void Main(string[] args) {
        ObjectPath opath = new ObjectPath("/org/gnome/ScreenSaver");
        IScreenSaver bus = con.GetObject<IScreenSaver>
            ("org.gnome.ScreenSaver", opath);
        for(int i = 0; i < 100; i++) {
            Console.WriteLine(bus.GetActive().ToString() + "\t"
                + i.ToString());
            Thread.Sleep(1000);
        }
    }
}
Sencillisimo y muy útil!
Por supuesto también usar en Windows y otros sistemas operativos, aunque por supuesto dbus es mucho mas común en Linux

viernes, 20 de abril de 2012

Script# genera código para clases parciales marcadas como Imported

Este es un error difícil de encontrarle solución así que les pongo aquí la solución. El problema tenemos una clase parcial en Script# y la marcamos como Imported, Script# no deberia generar código para esta clase debido al atributo Imported sin embargo el código es generado, pues bien el problema es que no esta usando el atributo Imported. Bien lo que hay que hacer es abrir el archivo .csproj del proyecto en notepad e ir a la lista de archivos incluidos en el proyecto buscamos el último archivo listado de los que conforman la clase parcial y en ese archivo es en el que se debe incluir el atributo Imported por lo cual lo añadimos en ese archivo y lo eliminamos del otro u otros que conformen la clase. Después de esto el código se generara correctamente. Mucho ojo no se debe modificar el archivo del proyecto en Notepad.

lunes, 16 de abril de 2012

Tipos de proyecto de Script Sharp

Como ya había comentado en una entrada anterior la desimantación de Script Sharp esta muy desactualizada y se mencionan proyectos y referencias que ya no existen así que en esta entrada explicare brevemente los tipos de proyecto que se pueden crear en la versión mas nueva, en este momento es 0.7.4.0

Después de instalar Script Sharp nos aparece en Visual Studio un nuevo grupo de plantillas de proyecto: Script#. en la imagen vemos estas nuevas plantillas:
Estos proyectos se pueden clasificar en tres tipos, proyectos de scripts nuevos en los que crearemos funcionalidades totalmente nuevas, el proyecto de pruebas unitarias y el proyecto de librerías importadas que nos permite usar código javascript existente como si se hubiera escrito en C#.
En el primer grupo tenemos los proyectos JQuery Script Library y Script Library que son los más representativos de Script Sharp ya que nos permiten crear scripts que usaremos en nuestras paginas programadas en C# y luego convertidas en javascript, la diferencia entre ambas es que el proyecto JQuery nos permite usar dicho framework como si estuviera escrito en C# y usar su funcionalidad en nuestras páginas.
Cabe mencionar que los scripts resultantes no son para uso exclusivo en páginas web, podemos usarlos en cualquier aplicación que utilicé javascript.
El siguiente proyecto es el Sidebar Gadget que nos permite crear los scripts que usaremos en los gadgets de Windows Vista y Seven, la diferencia con los proyectos anteriores es que tiene incluida las funcionalidades disponibles en esos gadgets para usarlos directo en C#.
El proyecto Unit Test es para probar el código creado en los otros tipos de proyectos el más sencillo de explicar pero no menos importante que los otros.
Finalmente esta el proyecto Import Library, este proyecto se caracteriza por que no crea ningun script en absoluto, en lugar de eso se usa para crear una referencia a scripts existentes, al tener el código ya existente no necesitamos crearlo solo adaptarlo de tal forma que se pueda usar como si estuviera hecho en C# o más propiamente dicho escrito para .Net.

sábado, 31 de marzo de 2012

Script sharp JavaScript o C#?

Programar en javascript puede ser dificil para los que nos dedicamos a la programación en lenguajes como C#, además el codigo es dificil de mantener y de seguir, para estos casos tenemos compiladores como script# que nos permiten escribir el codigo de las páginas en C# y luego el compilador convertira el código en javascript dandonos todas las ventajas de C# para usar en javascript, por supuesto estamos limitados por lo que puede hacer javascript pero en general este compilador es de mucha ayuda.

El ejemplo: un simple hola mundo en script#


using System;
using System.Collections.Generic;
using System.Html;
 
namespace SC {
    public static class DefaultPage {
        public static void HelloWorld() {
            Script.Alert("Hello World");
        }
    }
}
 
 
Esto nos genera un script que podemos incluir en una página y usar el código que escribimos en C#, tal cual si lo hubieramos escrito en javascript:


<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="WTests._Default" %>
 
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
    <script type="text/javascript" src="/Scripts/mscorlib.js"></script>
    <script type="text/javascript" src="/Scripts/SC.js"></script>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <input id="Button1" type="button" value="button" onclick="SC.DefaultPage.helloWorld();" />
</asp:Content>

Hay que notar que debemos incluir otro script que viene con el compilador: mscorlib.js, aunque no siempre es necesario, también vemos que nos cambio la máyuscula al pricipio de la función pero este y otros aspectos de la programación se pueden configurar.

Script# se puede obtener en esta dirección: http://projects.nikhilk.net/ScriptSharp y tiene integración con Visual Studio 2010
De momento la documentación del proyecto es escasa y puede costar un poco de trabajo empezar a usarlo por lo que seguire publicando más tutoriales cortos acerca del tema en este blog.

martes, 13 de marzo de 2012

Web Services sin code behind

Hace unos días me encontré con la situación de querer publicar un servicio web sin tener que recompilar todo el sitio pues es un sitio muy complejo y un cambio muy pequeño no ameritaba subir todo otra vez.
Bueno afortunadamente se pueden escribir servicios sin code behind y al subir el archivo Asp.Net como todos sabemos lo compila automáticamente y queda disponible para su uso al instante.
Sin embargo si usas Visual Studio no permite crear este tipo de servicios directamente así que la forma de crearlo es agregar el servicio de la forma normal, cortas todo el contenido del code behind sin dejar ni una linea de código y el truco es abrir el archivo .asmx con el editor de xml (clic derecho al archivo  en el explorador de soluciones y seleccionar abrir con) y pegar el código copiado abajo de la única linea que tiene el archivo, también debemos quitar el atributo que hace referencia al code behind.

Aquí esta el ejemplo:


<%@ WebService Language="C#" Class="WebTest.HelloWorld" %>

using System;
using System.Web.Services;

namespace WebTest
{
    
    [WebService]
    internal class HelloWorld
    {
        [WebMethod]
        public string SayHello() {
            return "Hello World";
        }
    }
}