Corregir el error Unresolved external (LNK2001 o LNK2019) o Unresolved token (LNK2028)

La causa más común del error Unresolved token y Unresolved external, es olvidar referencia el archivo .lib de una libreria.

Probablemente estes usando una libreria «de terceros», además de añadir los #include de los .h, tienes que añadir el .lib al linker.

 

Para ello, en VS 2005 y 2003:

 

En las propiedades del proyecto (se pueden acceder desde el menu contextual del proyecto) -> Configuration Properties -> Linker -> Input -> Additional Dependecies, y en este apartado especificar el nombre del .lib

 

Otra opción es añadir #pragma comment(lib, «..\libs\tulib.lib»)

 

Buenas prácticas de .Net siempre a mano

Ya he hablado antes en este blog de la importancia de los patrones y las buenas practicas.

Todo el que se plantee realizar una aplicación en .net debería leer tener los Patterns & Practices como referencia. Son una excelente documentación sobre como desarrollar aplicaciones en .net y deben ser la principal referencia de todo arquitecto de software en .net.

Eso si, tienen una pega, son una cantidad de información considerable, unos 30 documentos, de un motón de páginas cada uno. Documentos de texto y por tanto dificilmente buscables. Pues bien para solucionar este problema, los amigos de Gotdonet, ponen a nuestra dispoción una utilisima herramienta que nos permite encontrar facilmente aquellas prácticas que necesitemos en cada momento: Patterns & practices Guidance Explorer

Seleccionar una fila completa en un control ListView

El truco para habilitar la selección de un fila entera consiste en aplicar el estilo extendido LVS_EX_FULLROWSELECT a la lista.


En C++ http://support.microsoft.com/kb/230049


En Visual Basic http://support.microsoft.com/kb/181440/


En .Net no es necesario hacer trucos del almendruco, basta con establecer la propiedad FullRowSelect a true.

Antipatrones en el trabajo con excepciones (III)

Uno de los problemas habituales en el manejo de excepciones, no directamente relacionado con las mismas, es el registrar información sobre la excepción que se ha producido. El framework de .Net proporciona unas excelentes clases para el diagnostico y generación de un log para  nuestra aplicación en el namespace System.Diagnostics, conocido esto, el problema se resume en encontrar el balance justo de información que escribiremos en el log de nuestra aplicación. Este problema tiene difícil solución, y solo un adecuada y consistente política a nivel de proyecto nos permitirá alcanzar el equilibrio adecuado. Esta política, como cualquier otra relacionada con convenciones de codificación debe ser escrita y publicitarse entre los miembros del proyecto. Dicho esto, es importante conocer dos antipatrones habituales.


Log and throw: Logear y relanzar la exception


catch(ApplicationException ex)
{
 System.Diagnostics.Trace.WriteLine(«Bla bla bla»);
 throw ex;
}


o


catch(ApplicationException ex)
{
 System.Diagnostics.Trace.WriteLine(«Bla bla bla»);
 throw new MyException(«Bla bla bla», ex);
}


Ambos ejemplos son igual de dañinos y por el mismo motivo, encontraremos numerosas trazas para el mismo error, puesto que muy probablemente quien capture la excepción más arriba, también inserte una entrada en el log. La política aquí es clara o bien se logea la información sobre la excepción o bien se relanza pero nunca se deben hacer las dos cosas si queremos contar con un log de aplicación legible.


Multi-Line Messages: Mensajes de log relacionados en multiples lineas.


using System.Diagnotics;

Trace.WriteLine(«Error en acceso a fichero»);
WriteLine(«La ruta del fichero es muy larga»);


Siempre debemos agrupar los mensajes de logeo lo más posible. Los motivos son dos principalmente, por un lado el rendimiento, puesto que escribir en el archivo de log tiene un coste, y por otro la legibilidad, aunque este no es tan evidente. Viendo el código de ejemplo, se hace evidente que el programador espera que esas dos lineas aparezcan seguidas en archivo de log, pero en una aplicación multihilo (y casí todas las aplicaciones actuales lo son, explicita o implícitamente) , nada garantiza que las lineas se van a escribir seguidas. Podemos terminar encontrando que mensajes realacionados aparecen separados por muchas lineas dentro de nuestro log, lo que sin duda perjudicará gravemente a su legibilidad. Así lo correcto sería:


using System.Diagnotics;

Trace.WriteLine(«Error en acceso a ficheronLa ruta del fichero es muy larga»);