Posts Tagged ‘C#’

0 26
05
2012

String Replace Ignore Case en C# y VB.NET

Sábado, mayo 26th, 2012

En el día a día del programador, suelen surgir multitud de dudas, que aunque parecen más que obvias, siempre te hacen acudir a internet a buscar la mejor solución.

Hace un par de días, me encontré ante la necesidad de algo tan sumamente sencillo como reemplazar un texto por otro en una cadena, pero ignorando mayúsculas y minúsculas, trabajando en C# .NET.

Lo primero en lo que pensé es que el método String.Replace de .NET permitiría añadir un parámetro opcional para indicar este modificador, pero no es así, por lo que tenemos que buscarnos las habichuelas por otra parte.

Cierto es que tampoco nos tenemos que ir muy lejos, y es nuevamente el poder de las expresiones regulares el que nos permite construir nuestro propio String Replace siendo insensible a mayúsculas y minúsculas.

Ejemplo de Replace Ignore Case en C#

    public string ReplaceIgnoreCase(string original, string search, string replace)
    {
	// Reemplazo habitual
        string value = original.Replace(search, replace);
	// Reemplazo utilizando expresiones regules ignorando mayúsculas y minúsculas
        string value2 = System.Text.RegularExpressions.Regex.Replace(original, search, replace, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        return value2;
    }

...
        string original = "La parte contratante de la primera parte";
        string search = "PaRtE";
        string replace = "cosa";
        string replaced = ReplaceIgnoreCase(original, search, replace);

...

Ejemplo de Replace Ignore Case en VB.NET

Public Function ReplaceIgnoreCase(original As String, search As String, replace As String) As String
	' Reemplazo habitual
	Dim value As String = original.Replace(search, replace)
	' Reemplazo utilizando expresiones regules ignorando mayúsculas y minúsculas
	Dim value2 As String = System.Text.RegularExpressions.Regex.Replace(original, search, replace, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
	Return value2
End Function
3 07
03
2012

Instalador Web: Instalación sin completar

Miércoles, marzo 7th, 2012

Tenemos el siguiente escenario: Windows 7 + IIS7.

Disponemos a su vez de una solución generada en Visual Studio 2008, con diversos proyectos, entre los que se encuentra un sitio web.

Y nos proponemos ahora, la creación de un proyecto de instalación para la aplicación web.

Hasta aquí sin problemas, hasta que una vez generados los archivos de instalación Setup.exe y WebSetup.msi, recibimos el siguiente mensaje de error al ejecutarlos:

Instalación sin completar

Se interrumpió el instalador antes de poder instalar (NOMBREDELPROYECTO). Debe reiniciar el instalador para intentarlo de nuevo.

Web Setup: Instalación sin completar

Web Setup: Instalación sin completar

Tras buscar por internet posibles soluciones, decidimos activar la compatibilidad de Internet Information Server con IIS6, y probar suerte.

Para ello, accedemos al Panel de Control de Windows 7, y pinchamos en la opción Activar o desactivar las características de Windows.

Panel de Control Windows 7

Panel de Control Windows 7

Buscamos la opción Internet Information Server, y expandimos su rama, hasta encontrar Compatibilidad con la Administración de IIS6.

Una vez ahí, activamos todas las opciones de Compatibilidad con la Administración de IIS6 como muestra la siguiente imagen:

Activar características de Windows - Compatibilidad IIS6

Activar características de Windows - Compatibilidad IIS6

Et voilà! Volvemos a intentar ejecutar los archivos de instalación del proyecto web generados anteriormente y conseguimos continuar la instalación sin los problemas generados con anterioridad.

Web Setup: Asistente de instalación

Web Setup: Asistente de instalación

1 23
01
2012

Cómo crear un Servicio de Windows

Lunes, enero 23rd, 2012

Hoy vamos a realizar un pequeño y rápido repaso de cómo crear un Servicio de Windows, en nuestro caso, desde Visual Studio 2008.

Tomaremos como base el siguiente enlace oficial de microsoft: http://msdn.microsoft.com/es-es/library/9k985bc9(v=VS.90).aspx

Creando Windows Service

En primer lugar, seleccionaremos el tipo de plantilla Windows Service o Servicio de Windows para nuestro proyecto.

Plantilla Visual Studio de Windows Service

Plantilla Visual Studio de Windows Service

Una vez generado el proyecto, Visual Studio generará a partir de plantilla los siguientes archivos:

  • Service1.cs (renombrado por manías del guión como Service.cs)
  • Program.cs
Nuevo proyecto de Windows Service

Nuevo proyecto de Windows Service

En la clase Service.cs (recordemos que originalmente se llamaba Service1.cs), creamos los siguientes métodos:

  • onstart
  • onstop
  • oncontinue

#region "Service Methods"
protected override void OnStart(string[] args)
{
Console.WriteLine("Inicio servicio");
}

protected override void OnStop()
{
Console.WriteLine("Fin servicio");
}

protected override void OnContinue()
{
Console.WriteLine("Servicio en ejecución");
}

#endregion "Service Methods"

En el ejemplo simplemente escribimos por consola una traza del método que estamos ejecutando.

Métodos (OnStart, OnStop, OnContinue) Windows Service

Métodos (OnStart, OnStop, OnContinue) Windows Service

Llegados a este punto, el servicio ya podría arrancar, pero dependiendo de la lógica que deba implementar el servicio, tomaremos diferentes formas de mantener vivo el servicio:

Ejemplo 1: Queremos que nuestro servicio se mantenga a la escucha de recibir mensajes de fuentes externas, el pseudocódigo sería algo así:


while (true) {

listener.receive();

}

Ejemplo 2: Queremos que nuestro servicio ejecute tareas cada x tiempo, para lo cual necesitaríamos un Timer para gestionar la ejecución temporal de dichas tareas. En futuros posts crearemos un ejemplo de este tipo de servicios de windows con timer.

Instalando Windows Service

Vamos a preparar ahora nuestro servicio de windows para que podamos instalarlo, para ello:

1. Añadimos los servicios de instalación, clickando sobre el botón derecho sobre el diseñador de Service y clickamos en “Add Installer” o “Añadir Instalador“.

Agregar instalador en Windows Service

Agregar instalador en Windows Service

2. El paso anterior nos genera un nuevo archivo ProjectInstaller.cs como el de la imagen siguiente, agregando 2 nuevos componentes.

Instalador Servicio de Windows

Instalador Servicio de Windows

En las propiedades de ambos componentes del servicio podremos editar el nombre del servicio, el tipo de arranque (manual, automático o deshabilitado), la cuenta con la que se ejecutará el servicio, etc.

Propiedades instalador Windows Service

Propiedades instalador Windows Service

Por último, vamos a preparar la Instalación del servicio de Windows

Crearnos 2 archivos .bat uno para instalación y otro desinstalación, que ejecutarán el comando InstallUtil

Por ejemplo para instalar y desinstalar respecticamente

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil “C:\Inetpub\wwwroot\myservice\bin\Release\myservice.exe”pause

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil -u “C:\Inetpub\wwwroot\myservice\bin\Release\myservice.exe”pause

1 09
05
2011

Cómo integrar WSE 3.0 en Visual Studio 2008

Lunes, mayo 9th, 2011

Recientemente en el trabajo, estamos desarrollando un proyecto en el que interactuar con un web services con WSE 3.0 integrada.

Por lo tanto, el primer paso fue instalar Web Service Enhancements (WSE) 3.0 for Microsoft .NET descargando el instalable desde esta dirección Web Service Enhancements (WSE) 3.0 for Microsoft .NET.

Una vez finalizada la instalación, no dispondremos todavía de esta herramienta integrada dentro de Visual Studio 2008. Para incorporar WSE 3.0 a nuestro entorno de trabajo Visual Studio 2008, podemos realizar los siguientes pasos:

1. Acudimos al directorio de instalación, en mi caso por ejemplo C:\Documents and Settings\All Users\Datos de programa\Microsoft\MSEnvShared\Addins

2. Editamos con el notepad (o similar) el archivo WSESettingsVS3.Addin (veréis que tiene formato xml)

3. Buscamos y sustituimos <Version>8.0</Version> por <Version>9.0</Version>, y finalmente guardamos los cambios.

4. Para terminar, abrimos Visual Studio 2008 y accedemos a: Tools (Herramientas) > Options (Opciones) > Add-in/Macros Security (Seguridad de Macros/Complementos)

5. Y añadimos nuestro directorio de instalación indicado en el punto 1 tal y como muestra la siguiente imagen.

Integrar WSE 3.0 en Visual Studio 2008

Integrar WSE 3.0 en Visual Studio 2008

No olvides “reiniciar” Visual Studio para contemplar los cambios realizados.

Ya podemos trabajar con WSE 3.0 integrado en Visual Studio 2008.

Integrar WSE 3.0 en Visual Studio 2008 - WSE 3.0 Settings

Integrar WSE 3.0 en Visual Studio 2008 - WSE 3.0 Settings

9 11
11
2010

DateDiff en C#

Jueves, noviembre 11th, 2010

Una de las funciones de Visual Basic que más echamos de menos a la hora de programar en C# es DateDiff.

Para aquellos que no la conozcan, la función DateDiff de Visual Basic (probablemente también os sonará de DateDiff de SQL Server) devuelve un valor numérico que especifica el número de intervalos de tiempo entre 2 fechas; o traducido al castellano, nos devuelve la diferencia entre 2 fechas.

Pues bien, ya que la función DateDiff no existe en sí en C#, vamos a proponer a continuación una alternativa a la misma:

/// <summary>
/// Demo DateTime.DateDiff
/// </summary>
public class DateTimeExtension
{

    /// <summary>
    /// Devuelve un valor Long que especifica el número de
    /// intervalos de tiempo entre dos valores Date.
    /// </summary>
    /// <param name="interval">Obligatorio. Valor de enumeración
    /// DateInterval o expresión String que representa el intervalo
    /// de tiempo que se desea utilizar como unidad de diferencia
    /// entre Date1 y Date2.</param>
    /// <param name="date1">Obligatorio. Date. Primer valor de
    /// fecha u hora que se desea utilizar en el cálculo.</param>
    /// <param name="date2">Obligatorio. Date. Segundo valor de
    /// fecha u hora que se desea utilizar en el cálculo.</param>
    /// <returns></returns>
    public static long DateDiff(DateInterval interval, DateTime date1, DateTime date2)
    {
        long rs = 0;
        TimeSpan diff = date2.Subtract(date1);
        switch (interval)
        {
            case DateInterval.Day:
            case DateInterval.DayOfYear:
                rs = (long)diff.TotalDays;
                break;
            case DateInterval.Hour:
                rs = (long)diff.TotalHours;
                break;
            case DateInterval.Minute:
                rs = (long)diff.TotalMinutes;
                break;
            case DateInterval.Month:
                rs = (date2.Month - date1.Month) + (12*DateTimeExtension.DateDiff(DateInterval.Year, date1, date2));
                break;
            case DateInterval.Quarter:
                rs = (long)Math.Ceiling((double)(DateTimeExtension.DateDiff(DateInterval.Month, date1, date2) / 3.0));
                break;
            case DateInterval.Second:
                rs = (long)diff.TotalSeconds;
                break;
            case DateInterval.Weekday:
            case DateInterval.WeekOfYear:
                rs = (long)(diff.TotalDays/7);
                break;
            case DateInterval.Year:
                rs = date2.Year - date1.Year;
                break;
        }//switch
        return rs;
    }//DateDiff
}

/// <summary>
/// Enumerados que definen los tipos de
/// intervalos de tiempo posibles.
/// </summary>
public enum DateInterval
{
    Day,
    DayOfYear,
    Hour,
    Minute,
    Month,
    Quarter,
    Second,
    Weekday,
    WeekOfYear,
    Year
}

Una vez que tengáis implementada vuestra función DateDiff en C#, podéis realizar alguna pequeña prueba comparativa con la función original DateDiff de Visual Basic para verificar que los resultados son los esperados en vuestras operaciones con fechas.

0 30
10
2010

Propiedades autoimplementadas en C#

Sábado, octubre 30th, 2010

A partir de C# 3.0 nos encontramos con una nueva forma de implementar las propiedades de nuestras clases con las propiedades autoimplementadas.

Las propiedades autoimplementadas nos permiten escribir la declaración de la propiedad de forma más concisa y sencilla cuando no es necesaria ninguna lógica adicional en los descriptores de acceso a la propiedad, o en otras palabras, cuando no se requiere personalizar los bloques Set y/o Get.

Para verlo de forma más clara, mostraremos a continuación un ejemplo de la declaración de propiedades clásica, y la declaración de propiedades autoimplementadas:

Sin Propiedades Autoimplementadas

/// <summary>
/// Car class
/// </summary>
public class Car
{

    #region "Attributes"

    /// <summary>Brand car</summary>
    private string brand;
    /// <summary>Model car</summary>
    private string model;
    /// <summary>Vehicle registration plate</summary>
    private string plate;

    #endregion

    #region "Properties"

    /// <summary>Gets & sets the brand of car</summary>
    public string Brand
    {
        get { return brand; }
        set { brand = value; }
    }

    /// <summary>Gets & sets the brand of car</summary>
    public string Model
    {
        get { return model; }
        set { model = value; }
    }

    /// <summary>Vehicle registration plate</summary>
    /// <remarks>read-only property</remarks>
    public string Plate
    {
        get { return plate; }
    }

    #endregion

    /// <summary>Constructor</summary>
    /// <param name="plate"></param>
    public Car(string plate)
    {
        this.plate = plate;
    }
}

En el código anterior, hemos creado una simple clase de ejemplo Car con 3 atributos privados, y sus correspondientes 3 propiedades públicas, siendo la tercera de ellas (platepropiedad de sólo lectura.

Comprobemos a continuación cómo declarar el código con propiedades autoimplementadas sobre la misma clase de ejemplo.

Con Propiedades Autoimplementadas

/// <summary>
/// Car class
/// </summary>
public class Car
{

    #region "Attributes"

    /// <summary>Brand car</summary>
    private string brand;
    /// <summary>Model car</summary>
    private string model;
    /// <summary>Vehicle registration plate</summary>
    private string plate;

    #endregion

    #region "Properties"

    /// <summary>Gets & sets the brand of car</summary>
    public string Brand { get; set; }

    /// <summary>Gets & sets the brand of car</summary>
    public string Model { get; set; }

    /// <summary>Vehicle registration plate</summary>
    /// <remarks>read-only property</remarks>
    public string Plate { get; private set; }

    #endregion

    /// <summary>Constructor</summary>
    /// <param name="plate"></param>
    public Car(string plate)
    {
        this.plate = plate;
    }
}