Oct 21 2008

C# Añadir icono RSS en la barra de direcciones de nuestro navegador (rss feed icon)

Category: ProgramacionIndigo @ 2:06 PM

Completando mi artículo anterior sobre generar RSS en nuestra pagina ASP.NET ahora veremos que tenemos que añadir nuestra página para que nuestro navegador detecte que se puede sindicar contenido rss.

Para hacer esto tan sólo debemos añadir la siguiente linea a nuestra pagina

[sourcecode language='html'] type="application/rss+xml" rel="alternate">
[/sourcecode]

Si lo quisieramos hacer desde nuestro código, lo haríamos de la siguiente manera

[sourcecode language='csharp']HtmlGenericControl link = new HtmlGenericControl(”LINK”);
link.Attributes.Add(”title”, “Ultimas artículos”);
link.Attributes.Add(”href”, “http://www.microcode.es/feed”);
link.Attributes.Add(”rel”, “alternate”);
link.Attributes.Add(”type”, “application/rss+xml”);
this.Controls.Add(link);[/sourcecode]

Como vemos es bastante fácil…

Tags: , , ,


Oct 20 2008

C# Generar RSS en nuestra pagina ASP.NET (rss feed)

Category: ProgramacionIndigo @ 2:56 PM

Según la wikipediaRSS es un sencillo formato de datos que es utilizado para redifundir contenidos a suscriptores de un sitio web. El formato permite distribuir contenido sin necesidad de un navegador, utilizando un software diseñado para leer estos contenidos RSS (agregador). A pesar de eso, es posible utilizar el mismo navegador para ver los contenidos RSS. Las últimas versiones de los principales navegadores permiten leer los RSS sin necesidad de software adicional.”

El código para generar rss es realmente sencillo y tan sólo debemos escribirlo en el Page_Load de nuestra página:

[sourcecode language='csharp']protected void Page_Load(object sender, EventArgs e)
{
Response.Clear();
Response.ContentType = “text/xml”;
XmlTextWriter xmlTextWrite = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
xmlTextWrite.WriteStartDocument();
xmlTextWrite.WriteStartElement(”rss”);
xmlTextWrite.WriteAttributeString(”version”,”2.0″);
xmlTextWrite.WriteStartElement(”channel”);
xmlTextWrite.WriteElementString(”title”, “indigo blog rss example.”);
xmlTextWrite.WriteElementString(”link”, “http://www.microcode.es/index.php”);
xmlTextWrite.WriteElementString(”description”, “Ultimas noticias.”);
xmlTextWrite.WriteElementString(”copyright”, “(c) 2008, microcode blog.”);
xmlTextWrite.WriteElementString(”ttl”, “5″);

// Este bucle es el encargado de generar los item del rss. Aquí podríamos a nuestra base de datos para obtener los elementos
// que se quieres mostrar en el rss.
for (int i = 0; i < 5; i++)
{
xmlTextWrite.WriteStartElement(”item”);
xmlTextWrite.WriteElementString(”title”, string.Format(”Title-{0}”, i));
xmlTextWrite.WriteElementString(”description”, string.Format(”Description-{0}”, i));
xmlTextWrite.WriteElementString(”link”, string.Format(”http://www.microcode.es/index.php#{0}”, i));
xmlTextWrite.WriteElementString(”pubDate”, DateTime.Now.ToString(”dd/MM/yyyy HH:mm”));
xmlTextWrite.WriteElementString(”guid”, string.Format(”http://www.microcode.es/index.php#{0}”, i));
xmlTextWrite.WriteEndElement();
}

xmlTextWrite.WriteEndElement();
xmlTextWrite.WriteEndElement();
xmlTextWrite.WriteEndDocument();
xmlTextWrite.Flush();
xmlTextWrite.Close();

Response.End();
}

[/sourcecode]

Saludos.

Tags: , ,


Oct 14 2008

C# Codificar la url (UrlEncode y UrlDecode)

Category: ProgramacionIndigo @ 10:19 AM

Supongamos que hemos desarrollado nuestro propio sistema de blog o de noticias, y que siguiendo las normas básicas de posicionamiento hemos hecho que nuestras url sean amigables.

Si nuestra entrada en el blog fuera “este es mi primer post”, nos gustaría que la url fuera “~/post/este es mi primer post” pero esta url no es válida porque contiene espacios en blanco. Para evitar esto podemos usar los método UrlEncode y UrlDecode.

Para el caso anterior obtendríamos la dirección “~/post/este+es+mi+primer+post” que ya es una dirección valida.

Para poder utilizar los métodos UrlEncode y UrlDecode desde una aplicación windows debeís usar la clase HttpUtility que se encuentra en el espacio de nombres System.Web. En aplicaciones web, estos métodos los podeís encontrar en la clase Server.

Tags: , , ,


Oct 13 2008

C# Ejecutar un procedimiento de almacenado (store procedure)

Category: ProgramacionIndigo @ 10:20 AM

Una característica de muchos gestores de bases de datos como Sql Server, es que permiten guardar las consultas para poder ejecutarlas desde nuestro código. Asi conseguimos abstraer nuestra lógica de datos de nuestra lógica de negocio. En Sql Server estas consultas se llaman procedimientos de almacenado. Un ejemplo de esto es

[sourcecode language='sql']SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE dbo.sp_test
– Add the parameters for the stored procedure here
@IdFoo int
AS
BEGIN
SELECT
*
FROM
Foo
WHERE
IdFoo = @IdFoo
END
GO[/sourcecode]

Este procedimiento recibe como parametro el entero @IdFoo, y busca en la tabla Foo, un registro que tenga el campo IdFoo igual al parametro de entrada @IdFoo. Para llamar este procedimiento de almacenado desde nuestro código tan sólo debemos hacer lo siguiente

[sourcecode language='csharp']public void ExecuteStoreProcedure(int idFoo)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand())
{
connection.Open();

command.Connection = connection;
command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = “sp_test”;
command.CommandTimeout = 10;

command.Parameters.AddWithValue(”@IdFoo”, idFoo);

SqlDataReader reader = command.ExecuteReader();
}
}
}[/sourcecode]

Como vemos es muy fácil, creamos una conexión, y un comando. A este comando le decimos que ejecutará el procedimiento sp_test y le pasamos el parametro idFoo como @IdFoo. El resultado de la consulta se guarda en un SqlDataReader. Ahora podremos recorrer este SqlDataReader para devolver algún dato o pasar la información a un objeto de negocio.

La principales ventajes de los procedimientos de almacenado son

  • Evita en parte los molestos ataques por inyección sql (sql injection).
  • La velocidad de la consulta es mayor.
  • Toda la logica de acceso a datos se encuentra en la base de datos.

Tags: , ,


Oct 10 2008

C# Ejecutar consulta sql

Category: ProgramacionIndigo @ 9:41 AM

Pese a que no recomiendo escribir las consultas sql en c# para luego lanzarlas contra nuestro gestor de base de datos, en algún momento no puede ser útil, sobre todo en la primeras fase de desarrollo. Para ejecutar una consulta sql tan solo debemos hacer lo siguiente

[sourcecode language='csharp']public void ExecuteSql(int idFoo)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand())
{
connection.Open();

command.Connection = connection;
command.CommandType = System.Data.CommandType.Text;
string sql = string.Format(”SELECT * FROM Foo WHERE IdFoo = {0}”, idFoo);
command.CommandText = sql;
command.CommandTimeout = 10;

SqlDataReader reader = command.ExecuteReader();
}
}
}[/sourcecode]

Como vemos es bastante fácil.

Tags: , ,


Oct 09 2008

C# El uso de transacciones con SqlTransaction

Category: ProgramacionIndigo @ 9:34 AM

¿Qué pasa si en alguna en un procesos de actualización de datos de una base de datos falla a la mitad? Lo normal en la mayoría de los casos es deshacer todo lo que se ha hecho y dejar la base de datos como estaba. Este proceso sería muy complicado hacerlo a mano, por no decir imposible. Para esto están las transacciones, que de una manera muy fácil nos ayudan a resolver este tipo de problemas.

Esta forma de trabajar con las bases de datos, podemos hacerlo desde nuestro código o directamente en la base de datos (en procedimientos de almacenado). En este artículo sólo explicaré como hacerlo desde nuestro código.

El código para utilizar una transacción es el siguiente

[sourcecode language='csharp']public void ExecuteTransaction()
{
// Usamos la clase SqlConnectionStringBuilder para construir la cadena de conexión
SqlConnectionStringBuilder _connectionStringBuilder = new SqlConnectionStringBuilder();
_connectionStringBuilder.DataSource = @”.\SQLEXPRESS”;
_connectionStringBuilder.InitialCatalog = “prueba”;
_connectionStringBuilder.IntegratedSecurity = true;

// Creamos la conexión
using(SqlConnection _connection = new SqlConnection(_connectionStringBuilder.ConnectionString))
{
// Abrimos la conexión
_connection.Open();

// Abrimos una transación en la conexión abierta
SqlTransaction _transaction = _connection.BeginTransaction();

// Creamos el objeto SqlCommand y asignamos los datos
// a los parámetros
SqlCommand _command = new SqlCommand();
_command.Connection = _connection;
_command.CommandType = CommandType.StoredProcedure;
_command.CommandText = “ProcedimientoAlmacenado”; // Aqui va el nombre del procedimiento de almacenado

// Añadimos los parametros
_command.Parameters.AddWithValue(”@Par1″, “Par1″);
_command.Parameters.AddWithValue(”@Par2″, “Par2″);

// Asignamos la transacción al comando
_command.Transaction = _transaction;

try
{
// Ejecutamos el comando
_command.ExecuteNonQuery();

// Si todo ha ido bien hacemos un “Commit” de la transacción
_transaction.Commit();
}
catch(Exception ex)
{
// Si se produce un error, desahacemos la transaccion (Rollback)
_transaction.Rollback();
}

// No se hace falta cerrar la conexión porque está dentro de un “using”
_connection.Close();
}
}[/sourcecode]

Lo primero que hacemos es crear una cadena de conexión y abrir una conexión con ésta. Con esta conexión abierta creamos la transacción (con el método “BeginTransaction”) y ejecutamos nuestro procedimiento de almacenado. Si todo ha ido bien, hacemos un “Commit” de la transacción y si algo ha fallado hacemos un “Rollback”. Es importante hacer un ”Commit” ya que si no, el sistema hará un “Rollback” automáticamente al cerrar la conexión.

Tal y como está el código sólo estamos haciendo una llamada la base de datos, pero modificando el código ligeramente podemos ver su verdadero potencial. Supongamos que tenemos la siguiente clase

[sourcecode language='csharp']public class Article
{
public int Id = 0;
public string Content = string.Empty;
}
[/sourcecode]

Y tenemos un método que recibe una lista de artículos que tenemos que actualizar. Este método creará una transacción y la utilizará para actualizar cada artículo. El código sería como este

[sourcecode language='csharp']public void UpdateArticles(List

articles)
{
SqlTransaction _transaction = CreateTransaction();
try
{
foreach (Article article in articles)
{
UpdateArticle(_transaction, article);
}
_transaction.Commit();
}
catch
{
_transaction.Rollback();
throw;
}

}

public void UpdateArticle(SqlTransaction transaction, Article article)
{
try
{
// Creamos el objeto SqlCommand y asignamos los datos
// a los parámetros
SqlCommand _command = new SqlCommand();
_command.Connection = transaction.Connection;
_command.CommandType = CommandType.StoredProcedure;
_command.CommandText = “UpdataArticle”; // Aqui va el nombre del procedimiento de almacenado

// Añadimos los parametros
_command.Parameters.AddWithValue(”@Id”, article.Id);
_command.Parameters.AddWithValue(”@Content”, article.Content);

// Asignamos la transacción al comando
_command.Transaction = transaction;

// Ejecutamos el comando
_command.ExecuteNonQuery();
}
catch
{
throw;
}
}

public SqlTransaction CreateTransaction()
{
try
{
// Usamos la clase SqlConnectionStringBuilder para construir la cadena de conexión
SqlConnectionStringBuilder _connectionStringBuilder = new SqlConnectionStringBuilder();
_connectionStringBuilder.DataSource = @”.\SQLEXPRESS”;
_connectionStringBuilder.InitialCatalog = “prueba”;
_connectionStringBuilder.IntegratedSecurity = true;

// Creamos la conexión
SqlConnection _connection = new SqlConnection(_connectionStringBuilder.ConnectionString);

// Abrimos la conexión
_connection.Open();

// Abrimos una transación en la conexión abierta
SqlTransaction _transaction = _connection.BeginTransaction();

return _transaction;
}
catch
{
throw;
}
}[/sourcecode]

Cómo hemos visto el uso de transacciones desde .NET es muy fácil y hace nuestras aplicaciones más robustas. Pero, ¿qué pasa cuando entran en juego varias bases de datos, o incluso varios gestores de base de datos (varios Sql Server)? Para eso tenemos el TransactionScope, que podemos ver en http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx, pero esto lo dejo para otro momento.

Tags: , , ,


Oct 08 2008

C# La instrucción using

Category: ProgramacionIndigo @ 1:40 PM

La palabra clave using se puede usar en dos contextos

  • Como directiva, cuando se utiliza para crear un alias para un espacio de nombres o para importar tipos definidos en otros espacios de nombres.
  • Como instrucción, cuando define un ámbito al final del cual el objeto se destruye.

En este caso nos interesa la segunda definición y lo vamos a utilizar a la hora de utilizar conexiones a nuestra base de datos. Veamos este ejemplo:

[sourcecode language='csharp']SqlConnection connection = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand(commandString, connection);
connection.Open();
command.ExecuteNonQuery();
connection.Close();[/sourcecode]

Como vemos es un código muy simple. Abrimos una conexión, creamos un comando y lo ejecutamos. Este código esta aparentemente bien, pero si lo miramos con detalle, vemos que el SqlConnection y SqlCommand no liberan los recursos que usan y esto puede ser un problema en entornos de producción compartidos. Para evitar mejorar esto usaremos el siguiente código:

[sourcecode language='csharp']using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(commandString, connection))
{
connection.Open();
command.ExecuteNonQuery();
}
}[/sourcecode]

Aquí podemos ver que la conexión y el comando se crean dentro de un bloque using, que hará una llamada al método Dispose cuando finalice. También es importante sabe que cualquier excepción que se produzca será lanzada. El equivalente de este código sin usar using sería

[sourcecode language='csharp']SqlConnection connection = null;
SqlCommand command = null;

try
{
connection = new SqlConnection(connectionString);
command = new SqlCommand(commandString, connection);
connection.Open();
command.ExecuteNonQuery();
}
finally
{
if (command != null)
command.Dispose();
if (connection != null)
connection.Dispose();
}[/sourcecode]

Como vemos, cuesta muy poco mejorar nuestra forma de programar…

Tags: , , ,


Oct 06 2008

C# GPS Tracking en Windows Mobile (4 parte)

Category: ProgramacionIndigo @ 3:06 PM

Aquí está la cuarta de entrega de GPS Tracking en Windows Mobile. En la anterior entrega (la podeis leer en http://www.microcode.es/2008/09/29/c-gps-tracking-en-windows-mobile-3-parte/) vimos como grabar las posición que nos daba el GPS en fichero XML. Leyendo un poco por Internet sobre intercambio de datos sobre posicionamiento GPS, encontré que hay un estandard. Este estandard se llama GPX (GPS Exchange Format) y su página web es http://www.topografix.com/gpx.asp. Viendo las especificaciones he visto que hay una para almacenar puntos y otro para almacenar rutas. Estos estandars los podemos ver en las especificaciones xsd (http://www.topografix.com/gpx/1/1/).

En nuestro código tendriamos que el método SavePosition para grabar la posición como xml o como gpx.

[sourcecode language="csharp"]private void SavePosition(object sender, System.EventArgs args)
{
if (gps.Opened)
{
if (position != null)
{
if ((position.LatitudeValid) &amp;amp;amp;amp;&amp;amp;amp;amp; (position.LongitudeValid) &amp;amp;amp;amp;&amp;amp;amp;amp; (position.SeaLevelAltitudeValid))
{
if (ConfigManager.Config.Xml)
SavePositionXml(position.LatitudeInDegreesMinutesSeconds, position.LongitudeInDegreesMinutesSeconds, position.SeaLevelAltitude);
if (ConfigManager.Config.GpxRte)
SavePositionGpxRte(position.LatitudeInDegreesMinutesSeconds, position.LongitudeInDegreesMinutesSeconds, position.SeaLevelAltitude);
}
}
}
}[/sourcecode]

La función para generar el fichero gpx es la siguiente

[sourcecode language='csharp']private void SavePositionGpxRte(DegreesMinutesSeconds latitude, DegreesMinutesSeconds longitude, float altitude)
{
string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
string filename = Path.Combine(path, DateTime.Today.ToString(”yyyyMMdd”) + “.rte.gpx”);

XmlDocument xmlDocument = new XmlDocument();
XmlNode rootNode = null;
if (File.Exists(filename))
{
// Cargamos el fichero xml
xmlDocument.Load(filename);
XmlNode xmlHeader = xmlDocument.DocumentElement;
rootNode = xmlHeader.ChildNodes[0]; //
}
else
{
// Creamos el fichero
XmlNode xmlHeader = xmlDocument.CreateElement(”gpx”);
XmlAttribute version = xmlDocument.CreateAttribute(”version”);
version.Value = “1.0″;
XmlAttribute creator = xmlDocument.CreateAttribute(”creator”);
creator.Value = “GPSLocation”;
XmlAttribute schema = xmlDocument.CreateAttribute(”xsi”, “schemaLocation”, “http://www.w3.org/2001/XMLSchema-instance”);
schema.Value = “http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd”;
xmlHeader.Attributes.Append(version);
xmlHeader.Attributes.Append(creator);
xmlHeader.Attributes.Append(schema);

rootNode = xmlDocument.CreateElement(”rte”);

xmlHeader.AppendChild(rootNode);
xmlDocument.AppendChild(xmlHeader);
}

NumberFormatInfo formatInfo = new NumberFormatInfo();
formatInfo.NumberDecimalSeparator = “.”;

XmlNode node = xmlDocument.CreateElement(”rtept”);

XmlAttribute lat = xmlDocument.CreateAttribute(”lat”);
double value = latitude.ToDecimalDegrees();
lat.Value = value.ToString(formatInfo);

XmlAttribute lon = xmlDocument.CreateAttribute(”lon”);
value = longitude.ToDecimalDegrees();
lon.Value = value.ToString(formatInfo);

node.Attributes.Append(lat);
node.Attributes.Append(lon);

rootNode.AppendChild(node);

xmlDocument.Save(filename);
}[/sourcecode]

Este fichero lo podemos ver con google earth (http://earth.google.com/)

Espero que les sea útil.

Tags: , , , , ,


Sep 29 2008

C# GPS Tracking en Windows Mobile (3 parte)

Category: ProgramacionIndigo @ 4:49 PM

Hola a todos, aquí esta la tercera entrega de mis artículos sobre GPS Tracking. En las entregas anteriores vimos con preparar el entorno para poder desarrollar aplicaciones para Compact Mobile e instalar el ejemplo de Microsoft sobre el que nos vamos a apoyar para el desarrollo de nuestra aplicación.

Si estudiamos un poco el GPS Sample, veremos que hay un evento LocationChanged en la clase gps. En el manejados de este evento es donde pondremos nuestro código para grabar nuestra posición.

[sourcecode language='csharp']private void gps_LocationChanged(object sender, LocationChangedEventArgs args)
{
position = args.Position;

Invoke(displayLocationHandler);
Invoke(saveLocationHandler);
}[/sourcecode]

La declaración de saveLocationHandler la haremos en el Form_Load de la siguiente menera

[sourcecode language='csharp']private void Form1_Load(object sender, EventArgs e)
{
// …
saveLocationHandler = new EventHandler(SavePosition);
// …
}[/sourcecode]

y nuestro método para grabar la posición es el siguiente

[sourcecode language='csharp']private void SavePosition(object sender, System.EventArgs args)
{
if (gps.Opened)
{
if (position != null)
{
if ((position.LatitudeValid) ‘and’ (position.LongitudeValid) ‘and’ (position.SeaLevelAltitudeValid))
{
SavePositionXml(position.LatitudeInDegreesMinutesSeconds,
}
}
}
}

private void SavePositionXml(DegreesMinutesSeconds latitude, DegreesMinutesSeconds longitude, float altitude)
{
string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
string filename = Path.Combine(path, DateTime.Today.ToString(”yyyyMMdd”) + “.xml”);

XmlDocument xmlDocument = new XmlDocument();
XmlNode rootNode = null;
if (File.Exists(filename))
{
// Cargamos el fichero xml
xmlDocument.Load(filename);
rootNode = xmlDocument.DocumentElement;
}
else
{
// Creamos el fichero
XmlNode header = xmlDocument.CreateXmlDeclaration(”1.0″, “UTF-8″, null);
xmlDocument.AppendChild(header);

rootNode = xmlDocument.CreateElement(”Positions”);
xmlDocument.AppendChild(rootNode);
}

XmlElement nodePosition = xmlDocument.CreateElement(”Position”);

nodePosition.AppendChild(CreateXmlElement(xmlDocument, “DateTime”, DateTime.Now.ToString(”dd/MM/yyyy HH:mm:ss”)));

nodePosition.AppendChild(CreateXmlElement(xmlDocument, “LatitudeDegrees”, (latitude.Degrees * (latitude.IsPositive ? 1 : -1)).ToString()));
nodePosition.AppendChild(CreateXmlElement(xmlDocument, “LatitudeMinutes”, latitude.Minutes.ToString()));
nodePosition.AppendChild(CreateXmlElement(xmlDocument, “LatitudeSeconds”, latitude.Seconds.ToString()));

nodePosition.AppendChild(CreateXmlElement(xmlDocument, “LongitudeDegrees”, (longitude.Degrees * (longitude.IsPositive ? 1 : -1)).ToString()));
nodePosition.AppendChild(CreateXmlElement(xmlDocument, “LongitudeMinutes”, longitude.Minutes.ToString()));
nodePosition.AppendChild(CreateXmlElement(xmlDocument, “LongitudeSeconds”, longitude.Seconds.ToString()));

nodePosition.AppendChild(CreateXmlElement(xmlDocument, “Altitude”, altitude.ToString()));

rootNode.AppendChild(nodePosition);

xmlDocument.Save(filename);
}[/sourcecode]

Y por último, el método auxiliar CreateXmlElement es este

[sourcecode language='csharp']private XmlElement CreateXmlElement(XmlDocument xmlDocument, string name, string value)
{
XmlElement node = xmlDocument.CreateElement(name);
XmlText text = xmlDocument.CreateTextNode(value);
node.AppendChild(text);

return node;
}[/sourcecode]

Con este método obtendremos un archivo xml como éste

[sourcecode language='xml'] 22/09/2008 16:04:22
xx
xx
xx,yy
x
xx
xx,yy
xxx,y
22/09/2008 16:04:23
xx
xx
xx,yy
xx
xx
xx,yy
xxx,y
[/sourcecode]

Con esto ya tenemos nuestro primer fichero xml con las posiciones guardas. En el próximo artículo veremos como generar otro tipo de fichero xml. En este caso, un fichero xml que cumpla el estandar gpx.

Tags: , , ,


Sep 26 2008

C# GPS Tracking en Windows Mobile (2 parte)

Category: ProgramacionIndigo @ 9:59 AM

Tras mi artículo anterior, C# GPS Tracking en Windows Mobile (1 parte), algunas personas me han comentado que no han podido sincronizar el emulador del Visual Studio con el ActiveSync de Microsoft. Para hacer esto haremos los siguiente

- Instalar el ActiveSync en nuestro PC. Este programa no viene por defecto en Windows por lo que será necesaria su instalación.

- Una vez instalado los abriremos, e iremos a Archivo > Configuración de conexión y pondremos DMA en el desplegable que esta debajo de “Permitir conexiones a uno de los siguientes” como se muestra en la imagen

- Ahora iremos al Visual Studio y lanzaremos (Herramientas > Conectar con dispositivo…) nuestro emulador de Windows Mobile

- Una vez lanzado el emulador, iremos a Herramientas > Administrador de emuladores y dispositivos

y buscaremos “Windows Mobile 6 Classic Emulator”, haremos click con el botón derecho y marcaremos “Craddle”.

Una vez hecho esto el ActiveSync detectará el emulador de la PDA con si fuera una PDA con lo que ya podremos copiar o extraer archivos…

Tags: , , ,


« Previous PageNext Page »