Programa tus envíos de correo con Outlook 2010

Acabo de descubrir un feature bastante interesante de Outlook 2010. Cuando estén escribiendo un nuevo correo, si seleccionan el tab de “Options” (Opciones si está en español) y presionan  el botón de “Delay Delivery” (Retraso de Entrega), verán una serie de opciones para programar o retrasar la entrga del correo que están escribiendo. De esta forma, pueden escribir un correo a las 10 de la mañana, pero programarlo para que sea enviado a las 5 de la tarde, o incluso el día siguiente.

A mí este feature se me hace de los más útil, especialmente para esos correos que escribo a mitad de la noche, pero que quiero que sean enviados a las 10 de la mañana del día siguiente (y que así estén hasta arriba de la lista ;) )

 

image

- Ramiro Berrelleza

Visual Studio 2010 RC disponible al público

Visual Studio 2010 A partir de hoy esta disponible al público el Release Candidate de Visual Studio 2010 (y del .NET Framework 2010). Los suscriptores de MSDN tienen acceso al Release Candidate desde el día de hoy,  mientras que el acceso al público al general lo puede descargar aquí. 

Les recomiendo mucho que, si no lo han echo antes, instalen ya Visual Studio y empiecen a trabajar con la nueva versión  del .NET Framework, especialmente porque el Release Candidate incluye una licencia Go-live. Esto quiere decir que Microsoft garantiza que lo que desarrollen contra esta versión del .NET Framework funcionará de forma idéntica con la versión final de Visual Studio 2010 / .NET Framework.

En las próximas semanas estaré escribiendo un poco sobre los nuevo que trae el .NET Framework, así que váyanla instalando! Mientras tanto, para cualquier duda los invito a que visiten los foros de MSDN , donde la comunidad .NET (y algunos developers) siempre estamos dispuestos a ayudarlos.

- Ramiro Berrelleza

PD: Aclaración: Yo soy miembro del equipo de desarrollo del .NET Framework 4.0

Tutorial: Agrega TextBox dinámicos en tus páginas ASP.NET

En este tutorial aprenderás a agregar TextBox de manera dinámica en tus páginas ASP.NET. No es difícil hacerlo, pero no es tan trivial como parece. Si tu alguna vez lo haz intado te habrás topado con el problema de mantener el número de TextBox ya creados y sus valores a través de ‘postbacks’ de la página.

A través de las herramientas que ASP.NET proporciona, te mostraré como agregar estos TextBox, mantener sus propiedades, agregarles Validadores a los inputs y también almacenar sus valores a través de los ‘N postbacks’ que sufra la página. Mas...

Cambia la vista de tus posts dinámicamente en BE.NET

Al Nyveldt, uno de los programadores principales de BlogEngine.NET, publicó un artículo sobre ¿Cómo hacer que la página principal de tu blog se vea diferente? (traducción semi-literal a su título).

En su artículo Al Nyveldt propone modificar el archivo PostView.ascx de nuestro ‘tema’ con el fin de agregar unas cuantas líneas de código que determinen si el artículo será servido a la página frontal o a la página de posts.

Recuerda que BlogEngine.NET lee este archivo para ‘renderear’ los posts, ya se para las listas (como la página principal) o para la vista de detalle (vista del post como tal).

Mas...

Llama web services .asmx con jQuery

Me enfocaré principalmente en llamar estos servicios web desde sistemas que aún manejan el Framework 2.0 de .NET. Esto es esencial que lo notes por que en algunos otros tutoriales en línea te encontrarás muchas discrepancias sobre qué es lo que debes y que es lo que no debes colocar en los llamados de jQuery. Te guiaré paso por paso y te diré cónde están las discrepancias que puedes encontar.

Antecedentes

  1. Estamos utilizando un proyecto de ASP.NET con el Framework 2.0
  2. La página de trabajo es Default.aspx
  3. El ejemplo es un sencillo Hola Mundo que incluye código HTML

Mas...

Utiliza el registro de eventos desde tus aplicaciones

Durante el desarrollo de una aplicación, siempre debemos de ponernos en los zapatos de nuestros usarios. Algo en lo que debemos de poner especial atención es en la información que les damos cuando nuestra aplicación no funciona como esperamos. En estos casos es indispensable que proveeamos información suficiente para evitar frustración a nuestros usuarios, y facilitarnos la tarea de diagnosticar el problema.

Dentro de los recursos con los que contamos para registrar errores, uno muy útil es el Registro de Eventos, el cual es parte de Windows. Si bien la mayoría de nuestros usuarios nunca buscarán ahí información sobre su problema (por lo que es importante que les demos información más básica por otros medios), es conveniente registrar ahí información detallada y de bajo nivel que nos pueda ayudar a diagnosticar y resolver el por qué nuestra aplicación está fallando cuando otros métodos de diagnóstico (como el debuggeo) no están disponibles.

Para crear un registro requerimos de 2 cosas, un origen y un mensaje a registrar. El origen es quien genera el registro (nuestra aplicación), y su nombre debe ser lo suficientemente único como para poder identificar fácilmente a quien pertenece el mensaje. El mensaje, por su parte, aparte del texto, también contiene el tipo de evento (que va desde Información hasta Falla Fatal), y un çódigo de error.

El primer paso es registrar nuestro origen de eventos (“EventSource”). Les recuerdo que la fuente debe ser única, por lo que es importante elegir bien el nombre. Revisar si ya existe la fuente y registrarla requiere permisos de administrador, por lo que recomiendo que lo hagan durante la instalación de su aplicación:

//verificamos si el origen existe
if (!EventLog.SourceExists("Alfador.RegistroEventos"))
{        
    //si no existe, la creamos        
    EventLog.CreateEventSource("Alfador.RegistroEventos", "Aplicacion");
} 


Ya durante la ejecución de nuestra aplicación, podemos escribir al registro de eventos con el siguiente código. Nótese que el tipo de entrada (EvetLogEntryType) y el código de error dependerán del tipo de evento que estemos registrando:

string mensaje = string.Format("Registro generado por {0} a las {1}", "Demo", DateTime.Now.ToString());

//escribimos en el registro de eventos
EventLog.WriteEntry("Alfador.RegistroEventos", mensaje, EventLogEntryType.Information, 10); 

Ejecutar el código arriba mostrado resulta en el siguiente evento, el cual pueden ver usando el visor de eventos. Noten como lo que está en recuadros rojos corresponde con la información del registro que creamos.

Eventlog

Como pueden ver, es bastante sencillo lograr que sus aplicaciones usen el registro de eventos. Sí deciden usar este método de registro de erores les recomiendo que tengan una lista de cada código de error que usan, y que sean concistentes en su uso. De esta forma beneficiarán a sus usuarios (que podrían consultar la lsita de errores para entender lo que pasa) y a ustedes (es mucho más fácil cuando su usuario les dice “Error número 10” a “Mi aplicación no sirve”). 

¡Espero  les sirva!

Comprime urls con TinyUrl programáticamente

Twitter ha ayudado a popularizar enormemente el uso de comprimidores de urls. Si nunca los han usado, lo que yo llamo “comprimidores de url” son servicios que se encargan de comprimir url muy largos (que tradicionalmente han sido difíciles de compartir) , como  http://myurlelcualesdemasiadolargo.com/yauntienemasinformacion en urls más pequeños y manejables, como http://tinyurl.com/abcd .   Entre los más populares tenemos a  TinyUrl, bit.lyy is.gd, entre otros.

Incorporar estos servicios en nuestras aplicaciones es muy sencillo,  aquí les va una muestra de como hacerlo con TinyUrl:

string urlAComprimir = "http://alfador.com.mx/post/Reinicia-tu-equipo-desde-la-linea-de-consola.aspx";
string apiTinyUrl = "http://tinyurl.com/api-create.php?url={0}";
string urlConParametros = string.Format(apiTinyUrl, urlAComprimir);

HttpWebRequest peticion = WebRequest.Create(urlConParametros) as HttpWebRequest;
HttpWebResponse respuesta = null;

Uri uriComprimido = null;

try
{    
    respuesta = peticion.GetResponse() as HttpWebResponse;    
    StreamReader sr = new StreamReader(respuesta.GetResponseStream());    
    uriComprimido = new Uri(sr.ReadToEnd());
}
catch (Exception ex)
{    
    //manejamos la excepcion
} 

//imprime el url comprimido: http://tinyurl.com/l3tj5e
Console.WriteLine(uriComprimido);

¡Espero  les sirva!

- Ramiro Berrelleza

Reinicia tu equipo desde la línea de consola

Este comando me ha sido muy útil ultimamente, especialmente cuando estoy conectado a un equipo remoto y la opción de reinciar o apagar no está en el menú de inicio de Windows. Todo lo que necesitan para que funcione es tener derechos de administrador sobre el equipo. Se los comparto, en caso de que les pueda llegar a servir:

Desde una línea de comando con derechos de administrador: 

  • Reiniciar el equipo inmediatamente:
    shutdown /r /t 0 
  • Apagar el equipo inmediatamente:
     shutdown /s /t 0 

¡Espero les sirva!

- Ramiro Berrelleza

OpenSearch: Customiza tus búsquedas en IE y Windows 7

OpenSearch es un protocolo creado por Amazon a través de su filial de investigación, A9,  con el objetivo de facilitar el intercambio de resultados de búsquedas a través de diferentes motores de búsqueda.  A través de una simple especificación basada en xml, OpenSearch permite que clientes y servidores sepan como realizar búsquedas, y cómo interpretar sus resultados de uan forma sorprendentemente sencilla.

OpenSearch no es muy famoso, pero sus implementaciones se encuentran en todos lados. Simplemente volteen a ver la parte superior derecha de su navegador. En esa cajita a través de la cual realizamos búsquedas es la implementación más popular que hay de OpenSearch. Tomemos el caso del IE. Por default, todas las búsquedas que realizemos se irán a Live Search, qué si bien es un buen navegador, no tiene tanta fama como su competencia, Google. Y gracias a OpenSearch, esto es muy sencillo de modificar. Simplemente presionamos la flecha a la derecha de la caja de búsqueda, y seleccionamos la opción de “Encontrar más proveedores” (Find more providers, en inglés). Esto nos llevará a una página donde podremos elegir entre diferentes motores de búsqueda:

searchproviders

Al agregar uno, seleccionarlo, y realizar una búsqueda, vemos que en lugar de ir a Live Search, irá a la página del proveedor de búsqueda que elegimos. ¿Pero cómo sabe IE como hacer una búsqueda en la página del New York Times? Pues ahí entra OpenSearch. A través de su formato de especificación podemos tomar cualquier sitio que queramos, agregarlo como proveedor de búsqueda, e IE (o Firefox) sabrá como realizar una búsqueda. ¿Cómo hacerlo?  Tomemos como ejemplo a nuestro queridísimo blog, Alfador en punto net:

En la página que lista los proveedores de búsqueda nos vamos hasta la parte de abajo, y damos click en el link que dice “Create your own search provider”. La primera caja de texto nos pide el URL de búsqueda del sitio que queremos agregar. Para hacer esto, en otra ventana, vamos a la página de Alfador, escribimos TEST en el campo de búsqueda y presionamos buscar. No nos importa el resultado de la búsqueda, sino el url que se genera: http://alfador.com.mx/search.aspx?q=TEST Pegamos el url de la búsqueda en la caja correspondiente, escribimos Alfador en punto NET en la caja siguiente, y presionamos “Install Search Provider”. alfadorsearchprovider

Al presionar el botón, nos aparece un diálogo de confirmación. Una vez que seleccionemos “Agregar”, podemos ver como en la caja de búsqueda de nuestro navegador aparece la opción de “Alfador en punto NET”. Escribir una búsqueda (digamos, silverlight) y presionar enter nos llevará directamente a la página de búsquedas de Alfador. ¿Pero dónde quedó OpenSearch? Pues muy fácil, simplemente presionen View XML en la página donde creamos el proveedor de búsqueda, y obtendrán lo siguiente:

alfadorsearchproviderxml

Y eso, es el formato de descripción de búsquedas creado por OpenSearch. Cómo pueden ver, el formato es bastante sencillo, pero sorprendentemente funcional. Prúebenlo con cualquier sitio, y verán que bien funciona.

Pero ahí no queda todo. Algo muy grato es que Windows 7 soporta este formato de manera nativa, permitiéndonos hacer búsquedas a casi cualquier sitio desde Windows Explorer. Digo que casi cualquiera porque a diferencia del IE, Windows explorer muestra los resultados directamente, en lugar de dirigirnos a la página de búsquedas del sitio. Por esto tiene una restricción adicional, y es que el resultado de las búsquedas deben de estar en RSS.  Pero así como nos presenta restricciones, también nos da más flexibilidad. Para enterarse de todo lo que se puede hacer, les recomiendo lean la Guía de implementación de proveedores de búsqueda.

Para instalar su proveedor de búsqueda en Windows 7 lo único que tienen que hacer es guardar el archivo xml que generamos con terminación osdx. Al darle click, Windows 7 les preguntará si desean agregar el provedor. Presionar “Agregar” creará un shortcut dentro de su lista de Links, además de llevarlos a la página de búsquedas. Al escribir un término de búsqueda, Windows 7 irá a la página por el resultado de la búsqueda y la presentará directamente en el explorador:

smugmugsearchresult

Para que vean Open Search en acción les dejo este par de proveedores de búsqueda que creé. Uno para los amantes de la fotografía (y de Smugmug), y otro para los que no pueden dejar de usar Twitter

Espero que está introducción/demo de OpenSearch les haya gustado. En la segunda parte de este artículo hablaré en más detalle sobre como podemos sacar provecho de este formato y generar soluciones realmente innovadoras.

- Ramiro Berrelleza

PD: Los dos ejemplos sólo funcionan en Windows 7.  De tecnólogo a tecnólogo les recomiendo ampliamente que lo prueben. Yo llevo usándolo ya cerca de un mes y sin duda es la mejor versión a la fecha.

Administra IIS 7 programáticamente

El api de IIS 7 vuelve muy sencillo el administrar programáticamente nuestros servidores web. A través del nuevo api podemos hacer todo lo que haríamos a través de la interfaz gráfica, pero desde nuestro código. Esto se vuelve muy conveniente para escenarios de automatización, o para nuestras pruebas. A continuación enumero algunos escenarios, y el código necesario para lograrlo.

Escenario 1: Crear un nuevo sitio de internet.

using (ServerManager serverManager = new ServerManager())
{
    string nombreSitio = "sitio_alfador";
    string pathSitio = Path.Combine(@"C:\sitios", nombreSitio);
 
    Directory.CreateDirectory(pathSitio);
    serverManager.Sites.Add(nombreSitio, pathSitio, 8080);
    serverManager.CommitChanges();                
    //Es importante que recordemos siempre llamar serverManager.CommitChanges() después de realizar cambios.De lo contrario, los cambios que hagamos no serán realizados.
}

Escenario 2: Crear una aplicación en el sitio creado en el paso anterior.

using (ServerManager serverManager = new ServerManager())
{
    string nombreSitio = "sitio_alfador";
    string pathSitio = Path.Combine(@"C:\sitios", nombreSitio);
    string pathAplicacion = Path.Combine(pathSitio, "aplicacion_alfador");
    string nombreAplicacion = "/aplicacion";
 
    serverManager.Sites[nombreSitio].Applications.Add(nombreAplicacion, pathAplicacion);
    serverManager.CommitChanges();
}

Escenario 3: Eliminar la aplicación y el sitio, dejando todo como estaba al principio.

using (ServerManager serverManager = new ServerManager())
{
    string nombreSitio = "sitio_alfador";
    Site sitioABorrar = null;
    foreach (var site in serverManager.Sites)
    {
        if (site.Name.Equals(nombreSitio))
        {
            sitioABorrar = site;
            break;
        }
    }
 
    serverManager.Sites.Remove(sitioABorrar);
    serverManager.CommitChanges();
}

Hay muchas más cosas que se pueden hacer con este API. Si ustedes trabajan con IIS les recomiendo que revisen la documentación de ServerManagerpara que conozcan todo lo que este api puede hacer.

Y por supuesto, ¡compartan los scripts interesantes que conozcan con nosotros!

Aplicaciones y Mejores Prácticas de Silverlight

Cada que se lanza una nueva tecnología los desarrolladores tardamos un rato en trabajar con ella de manera óptima. Normalmente lo primero que hacemos es trabajar con la tecnología bajo los paradigmas con los que nos sentimos cómodos(este fenómeno fue definido por Jeff Atwood como Puedes programar Fortran en cualquier lenguaje), para después, una vez que ya estamos más familiarizados con la tecnología, entonces sí al programar bajo la ideología de la nueva tecnología y poder sacarle todo el provecho. Y no me negarán que con Silverlight ha sido igual (¿A poco al principio no lo usaban como si fueran WinForms?).

Dado que es una tecnología joven, hasta ahora todo lo que hemos visto de Silverlight han sido ejemplos atómicos, los cuales nos sirven mucho para aprender la tecnología de manera básica, pero que nos deja con muchas carencias a la hora de crear aplicaciones complejas. Estos ejemplos tan básicos difícilmente nos ayudan a la hora de enfrentarnos a problemas de eficiencia, de escalabilidad, o como guía de mejores prácticas.

Por fortuna, Tim Heureracaba de anunciar en su sitio una nueva sección para encargarse de cubrir dicho vacío. A través de aplicaciones completas (de las cuales podemos bajar todo el código fuente)  los desarrolladores podremos aprender como hacer una aplicación de Silverlight de forma correcta (mucho más allá del aspecto visual), como enfrentar problemas de deployment, conocer las mejores prácticas de Silverlight y aprender como enfrentar y resolver problemas típicos del desarrollo de aplicaciones empresariales para Silverlight, entre otras cosas. Actualmente sólo existe un ejemplo (es una sección nueva), pero que con el paso del tiempo se irá llenando de aplicaciones-demo de diferentes perfiles.

Una lectura ampliamente recomendada para todo desarrollador de aplicaciones en Silverlight.

Estimados lectores, ¿ustedes han hecho algo con Silverlight?, ¿a qué problemas se han enfrentado?

Web Service Studio Express

Día con día la arquitectura orientada a objetos (SOA) se va afianzando como la plataforma a seguir, particularmente en el desarrollo de soluciones empresariales altamente escalables.

Dentro de los SOAs, el pilar principal son los Web Services. Lamentablemente estos no son lo más fácil de debuggear, gracias a su naturaleza distribuida. Aquí es donde herramientas como Web Services Studio nos ayudan muchísimo.

Esta herramienta lo que nos permite es invocar cualquier Web Service al que tengamos acceso ya sea local o remoto. Una vez invocado, podemos ver la respuesta de este, en formato SOAP. Su uso es muy sencillo. Primero colocamos la dirección del WSDL del servicio y presionamos Get. Esto hace que la herramienta procese el WSDL, y nos despliegue las operaciones existentes.

Una vez seleccionada la función, colocamos los parámetros correspondientes e invocamos el servicio para ver el SOAP resultante.

web service studio 2

Hasta aquí, todo esto lo podemos hacer desde el navegador (para servicios locales). Su grandísima virtud es que (a diferencia de otras herramientas), nos permite invocar servicios con tipos de datos complejos, como pueden ser estructuras de datos u objetos (a ver, hagan esto en su navegador). Todos los que hayan tenido que debuggear este tipo de servicios estarán de acuerdo en la maravilla que esto es.

Web Service Studio Express lo pueden descargar en: http://www.codeplex.com/wsstudioexpress

Tips y más tips de Visual Studio

Para mí Visual Studio es el mejor ambiente de desarrollo que existe. Siendo uno de los productos más maduros y completos que ofrece Microsoft para el desarrollo, es muy complicado conocer cada una de las cosas que esta herramienta puede o no hacer. Sin embargo, como desarrolladores es algo que tenemos que hacer, pues es una de las “armas” principales que tenemos a la hora de crear software.

Por fortuna hay gente como Sara Ford que nos simplifican la tarea publicando tips y más tips de Visual Studio.  El blog de Sara consiste principalmente en tips no tan obvios de Visual Studio, por lo que conviene estarlo checando de forma frecuente.

El link a seguir es: http://blogs.msdn.com/saraford/default.aspx . Agreguenlo a su lector de RSS favorito (si no tienes uno, lean esto), y ayúdense revisándolo de vez en cuando.

¿Querido lector, cuál es su tip favorito de Visual Studio?

Evita páginas vacías y links obsoletos con redirecciones

Ayer en la noche me puse a hacer un poco de jardinería en mi sitio personal. Originalmente en la raíz del sitio estaba mi blog en inglés, y de ahí había ligas a toda mi presencia web (twitter, linked in, etc…), lo cual me funcionó muy bien por mucho tiempo. Sin embargo, ahora que me estoy involucrando en varios projectos e iniciativas decidí mejor mover mi blog a un subdominio (blog.esponjasoft.com), y dejar en la raíz de mi dominio una página con información sobre mi presencia web y proyectos personales.

Mover el blog fue cosa sencilla, pero al hacerlo me quedé con una página de inicio vacía y poco atractiva:

404

Eventualmente habrá una página de inicio atractiva y emocionante, pero en lo que eso sucede no podía permitir que mis visitantes que se encontran con eso. 

¿Qué hacer?

La opción más básica sobre qué hacer sería simplemente una redirección vía html o javascript. Sin embargo, lo correcto para estas situaciones es entregarle al navegador un aviso de redirección temporal (http status 302) con el link al cual redirigirse. Hacer esto nos permite que  navegadores y buscadores entiendan que esto es algo temporal, y que eventualmente habrá información diferente.

¿Cómo hacerle?

En ASP.NET esto es muy sencillo. Lo que hay que hacer es colgarnos del evento Page Load y enviar el status y el link, de la siguiente forma:

///nota aclaratoria: usaré ejemplos hipotéticos con urls de alfador

protected void Page_Load(object sender, EventArgs e)
{
    Response.Clear();
    Response.Status = "302 Moved Temporaly";
    Response.StatusCode = 302;
    Response.AddHeader("Location", "http://blog.alfador.com.mx");
    Response.End();
}

Si la relocalización es permanente, lo único que hay que hacer diferente es cambiar el código de status por 301, y el mensaje por algo similar.

Un uso muy interesante que tienen este tipo de redirecciones es para cuando cambiamos el formato de url. Digamos que antes de la modificación las rutas a los posts en alfador  eran http://alfador.com.mx/post/10 , y que ahora serán http://blog.alfador.com.mx/post/10 . En estas situaciones no hacer algun tipo de redirección equivaldría a tener un monton de links muertos por todos lados, algo que, si queremos mantener nuestros niveles de audiencia, debemos de evitar a toda costa.  Este tipo de soluciones las podemos resolver agregando  una clase global en nuestra aplicación web (Global.asax) e implementando la siguiente redirección permanente:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    string path = Request.Path.ToLower();
    string oldBlogUrl = "/post/";
    string newPathFormat = "http://blog.alfador.com.mx/post/{0}";
 
    if (path.StartsWith(oldBlogUrl))
    {
        string postID = path.Substring(oldBlogUrl.Length);
        string newBlogUrl = string.Format(newPathFormat, postID);
 
        Response.Clear();
        Response.Status = "301 Moved Permanently";
        Response.StatusCode = 301;
        Response.AddHeader("Location", newBlogUrl);
        Response.End();
    }
}

///nota aclaratoria: El código que está en el evento Page Load se ejecuta solo cuando la página en particular se carga. Si está  en el evento Application_BeginRequest entonces se ejecuta cuando cualquier página de la aplicación se carga.

Ya con esto tenemos lista nuestra redirección, y cualquier link que apunte al viejo estilo será automáticamente redirigido a su nuevo lugar.

Este tipo de redirecciones son muy útiles, pero tienen un cierto costo en desempeño (por el procesmiento de los links y lo que tarda el navegador en hacer la redirección), por lo que hay que pensarle bien a la hora de usarlos.

¿Cómo hacer que tu aplicación corra desde el arranque de Windows?

Para hacer que nuestras aplicaciones se ejecuten desde un inicio lo único que hay que hacer es modificar el registro, agregando la ruta de ejecución de nuestro programa a la llave HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Run .

En C# se hace con el siguiente código:

RegistryKey startup = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
startup.SetValue("alfador", Application.ExecutablePath);

Al ejecutar este código hay que tener cuidado con el nombre que le damos al valor, pues este debe ser único. De lo contrario, estaríamos sobreescribiendo un valor previamente establecido.

Para quitar nuestra aplicación de la lista de aplicaciones que se ejecutan en el arranque de Windows lo que hay que hacer es eliminar el valor de la llave del registro arriba mencionada.

En C# se haría así:

RegistryKey startup = Registry.CurrentUser.OpenSubKey(@" software\microsoft\windows\currentversion\run",="" true);="" startup.deletevalue("alfador");="">

Cabe mencionar que los ejemplos arriba mencionados  están pensados para que el programa sólo se agregue a la lista de aplicaciones del usuario que está ejecutando en ese momento la aplicación. Si queremos que la aplicación se ejecute al arranque de Windows para todos los usuarios, hay que agregar el valor en la llave  HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Run. 

En C#, solo hay que reemplazar la línea primera línea de los dos ejemplos anteriores con el siguiente código:

RegistryKey startup = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);