Un tutorial rápido para aprender a utilizar nuget de manera rápida y básica.
Categoría: C#
¿Cómo obtener los dispositivos usb en c#?
Para obtener los dispositivos USB que tiene nuestra computadora en c# vamos a hacer uso de la librería System.Management, esta librería debemos agregarla en las referencias de nuestro proyecto y al inicio de nuestra clase (using System.Management).
La siguientes dos clases hacen el trabajo y esta comentado que hace cada parte:
Clase para guardar la información de los dispositivos
/// <summary> /// clase para guardar las especificaciones de los dispositivos /// </summary> public class USBInfo { //constructor public USBInfo(string deviceID, string pnpDeviceID, string description) { this.DeviceID = deviceID; this.PnpDeviceID = pnpDeviceID; this.Description = description; } /// <summary> /// Device ID /// </summary> public string DeviceID { get; private set; } /// <summary> /// Pnp Device Id /// </summary> public string PnpDeviceID { get; private set; } /// <summary> /// Descripción del dispositivo o nombre /// </summary> public string Description { get; private set; } }
Clase que se encarga de obtener los dispositivos
public class Usb { /// <summary> /// obtiene las usb de la computadora /// </summary> /// <returns></returns> public List<USBInfo> GetUSBDevices() { //creamos una lista de USBInfo List<USBInfo> lstDispositivos = new List<USBInfo>(); //creamos un ManagementObjectCollection para obtener nuestros dispositivos ManagementObjectCollection collection; //utilizando la WMI clase Win32_USBHub obtenemos todos los dispositivos USB using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub")) //asignamos los dispositivos a nuestra coleccion collection = searcher.Get(); //recorremos la colección foreach (var device in collection) { //asignamos el dispositivo a nuestra lista lstDispositivos.Add(new USBInfo( (string)device.GetPropertyValue("DeviceID"), (string)device.GetPropertyValue("PNPDeviceID"), (string)device.GetPropertyValue("Description") )); } //liberamos el objeto collection collection.Dispose(); //regresamos la lista return lstDispositivos; } }
Y de esta manera hacemos uso de nuestra clase USB:
Usb oUsb = new Usb(); List<USBInfo> lstUSBD = oUsb.GetUSBDevices();
Como obtener la ruta física absoluta en Asp .Net
Para obtener la ruta física en Asp .Net se hace de la siguiente manera:
HttpContext.Current.Request.MapPath("~");
Esto nos sirve cuando deseamos abrir un fichero en nuestra aplicación web.
¿Cómo enviar un mail con archivos adjuntos desde C# .Net? #smtp
Para enviar un email desde .Net, lo podemos hacer muy fácil, ya que .Net ya nos proporciona lo necesario para realizarlo rápidamente.
A continuación plasmo el código de una clase improvisada que sirve para enviar el mail y a su vez tiene comentarios que van explicando parte por parte:
using System; using System.Collections.Generic; using System.Linq; using System.Net.Mail; using System.Text; using System.Threading.Tasks; namespace EnviaMail { class Mail { string From = ""; //de quien procede, puede ser un alias string To; //a quien vamos a enviar el mail string Message; //mensaje string Subject; //asunto List<string> Archivo = new List<string>(); //lista de archivos a enviar string DE = "[email protected]"; //nuestro usuario de smtp string PASS = "tupass"; //nuestro password de smtp System.Net.Mail.MailMessage Email; public string error = ""; /// <summary> /// constructor /// </summary> /// <param name="FROM">Procedencia</param> /// <param name="Para">Mail al cual se enviara</param> /// <param name="Mensaje">Mensaje del mail</param> /// <param name="Asunto">Asunto del mail</param> /// <param name="ArchivoPedido_">Archivo a adjuntar, no es obligatorio</param> public Mail(string FROM, string Para, string Mensaje, string Asunto, List<string> ArchivoPedido_ = null) { From = FROM; To = Para; Message = Mensaje; Subject = Asunto; Archivo = ArchivoPedido_; } /// <summary> /// metodo que envia el mail /// </summary> /// <returns></returns> public bool enviaMail() { //una validación básica if (To.Trim().Equals("") || Message.Trim().Equals("") || Subject.Trim().Equals("")) { error = "El mail, el asunto y el mensaje son obligatorios"; return false; } //aqui comenzamos el proceso //comienza------------------------------------------------------------------------- try { //creamos un objeto tipo MailMessage //este objeto recibe el sujeto o persona que envia el mail, //la direccion de procedencia, el asunto y el mensaje Email = new System.Net.Mail.MailMessage(From, To, Subject, Message); //si viene archivo a adjuntar //realizamos un recorrido por todos los adjuntos enviados en la lista //la lista se llena con direcciones fisicas, por ejemplo: c:/pato.txt if (Archivo != null) { //agregado de archivo foreach (string archivo in Archivo) { //comprobamos si existe el archivo y lo agregamos a los adjuntos if (System.IO.File.Exists(@archivo)) Email.Attachments.Add(new Attachment(@archivo)); } } Email.IsBodyHtml = true; //definimos si el contenido sera html Email.From = new MailAddress(From); //definimos la direccion de procedencia //aqui creamos un objeto tipo SmtpClient el cual recibe el servidor que utilizaremos como smtp //en este caso me colgare de gmail System.Net.Mail.SmtpClient smtpMail = new System.Net.Mail.SmtpClient("smtp.gmail.com"); smtpMail.EnableSsl = false;//le definimos si es conexión ssl smtpMail.UseDefaultCredentials = false; //le decimos que no utilice la credencial por defecto smtpMail.Host = "smtp.gmail.com"; //agregamos el servidor smtp smtpMail.Port = 465; //le asignamos el puerto, en este caso gmail utiliza el 465 smtpMail.Credentials = new System.Net.NetworkCredential(DE, PASS); //agregamos nuestro usuario y pass de gmail //enviamos el mail smtpMail.Send(Email); //eliminamos el objeto smtpMail.Dispose(); //regresamos true return true; } catch (Exception ex) { //si ocurre un error regresamos false y el error error = "Ocurrio un error: " + ex.Message; return false; } return false; } } }
Para utilizar la clase anterior lo podemos hacer de la siguiente manera:
//creamos nuestra lista de archivos a enviar List<string> lstArchivos = new List<string>(); lstArchivos.Add("c:/archivo1.txt"); lstArchivos.Add("c:/archivo2.txt"); //creamos nuestro objeto de la clase que hicimos Mail oMail = new Mail("[email protected]", "[email protected]", "hola", "un mensaje bien chevere",lstArchivos); //y enviamos if (oMail.enviaMail()) { Console.Write("se envio el mail"); } else { Console.Write("no se envio el mail: "+oMail.error); }
Nota: si utilizan una cuenta Gmail, a veces va a tardar en conectarse, esto es porque Gmail tiene muchas restricciones de conexiones anónimas, en cambio sí utilizan una conexión smtp propia, no debe darles problema.
Crear un archivo de Excel en C# .Net sin utilizar las librerías de Office #SpreadsheetLight
Para crear un Excel sin utilizar los dlls de office podemos hacer uso de una librería OpenSource de nombre SpreadsheetLight que creó el MIT.
Primero podemos descargar la librería de la su página: http://spreadsheetlight.com/download/
O podemos descargarla mediante Nuget poniendo su nombre (SpreadsheetLight).
Esta librería tiene una dependencia y es importante agregar la librería DocumentFormat.OpenXml pero tiene que ser la versión 2.0 ya que la más nueva 2.5 no me corrió. Para eso pueden dar clic en este enlace http://www.microsoft.com/en-us/download/details.aspx?id=5124 y pueden descargar la versión 2.0. Ya instalado ese paquete ya solo van a la ruta donde se instaló que casi siempre es c:/Program Files/Open Xml SDK/V2.0/ y ya de ahí solo la agregan a sus referencias al proyecto.
A continuación pongo la siguiente clase como ejemplo con sus comentarios paso por paso.
using SpreadsheetLight; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CreacionDeExcelSinOffice { class CreadorExcel { private string rutaArchivoCompleta = ""; public CreadorExcel(string nombreArchivo) { //obtenemos la ruta de nuestro programa y concatenamos el nombre del archivo a crear rutaArchivoCompleta = AppDomain.CurrentDomain.BaseDirectory + "/" + nombreArchivo; } public void CrearExcel() { try { //creamos el objeto SLDocument el cual creara el excel SLDocument sl = new SLDocument(); //creamos las celdas en diagonal //utilizando la función setcellvalue pueden navegar sobre el documento //primer parametro es la fila el segundo la columna y el tercero el dato de la celda for (int i = 1; i <= 10; ++i) sl.SetCellValue(i, i, "patito "+i); //Guardar como, y aqui ponemos la ruta de nuestro archivo sl.SaveAs(rutaArchivoCompleta); }catch(Exception ex){ Console.WriteLine("Ocurrio una Excepción: "+ex.Message); } } } }
Y de esta manera hacemos uso de la anterior clase.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CreacionDeExcelSinOffice { class Program { static void Main(string[] args) { //creamos la clase enviandole el nombre del archivo que deseemos CreadorExcel oCreadorExcel = new CreadorExcel("patito.xlsx"); //ejecutamos el metodo que crea el excel oCreadorExcel.CrearExcel(); //Esto ultimo solo para verificar que todo fue bien. Console.WriteLine("Se creo el archivo, presiona una tecla para terminar"); Console.ReadKey(); } } }
Con esta librería pueden hacer miles de cosas como poner imágenes, gráficos, colores etc. Pero para eso pueden ir directo a este enlace y ver los ejemplos que el mismo MIT da de ayuda.
¿Cómo obtener los datos de una conexión de base de datos guardada en app.config o web.config? c# csharp #visualstudio
Para obtener los datos de conexión a una base de datos que tenemos guardados en nuestro archivo app.config o web.config (dependiendo el tipo de proyecto), haremos uso de la clase ConnectionStringSettingsCollection y ConfigurationManager.
En nuestro archivo de configuración (app.config o web.config), se encuentra una sección en la cual estan guardadas las cadenas de conexión, por ejemplo:
<configuration> <configSections> </configSections> <connectionStrings> <add name="conexionPatito" connectionString="Data Source=localhost;Initial Catalog=basededatosPatito;User ID=pato;Password=patofeo" providerName="System.Data.SqlClient" /> </connectionStrings> </configuration>
Para acceder a esos datos y saber cual es el servidor o el nombre de la base de datos, a continuación escribo una clase comentada paso por paso:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; namespace Pato { /// <summary> /// Clase encargada de la capa de datos del modulo de configuracion de conexion /// Héctor de León /// 07/01/2013 /// </summary> class Conexion { //atributos public string servidor = ""; public string usuario = ""; public string password = ""; public string baseDeDatos = ""; //nombre de la conexión a modificar private string nombreConexion = "conexionPatito"; /// <summary> /// obtiene los datos de la conexión para ser utilizados en el formulario /// </summary> /// <returns></returns> public bool getData() { bool exito = false; // se obtienen las conexiones System.Configuration.ConnectionStringSettingsCollection connections = ConfigurationManager.ConnectionStrings; //si existe por lo menos una conexión continuamos if (connections.Count != 0) { //Recorremos las conexiones existentes foreach(ConnectionStringSettings connection in connections) { //asignamos el nombre string name = connection.Name; //obtenemos el proveedor, solo por demostración, no lo utilizaremos ni nada. string provider = connection.ProviderName; //obtenemos la cadena string connectionString = connection.ConnectionString; //comparamos el nombre al de nuestro atributo de la clase para verificar si es la cadena //de conexión que modificaremos if (name.Equals(nombreConexion)) { //separamos la conexión en un arreglo tomando ; como separador string[] sC = connectionString.Split(';'); foreach(String s in sC) { //separamos por el simbolo = para obtener el campo y el valor string[] spliter = s.Split('='); //comparamos los valores switch (spliter[0].ToUpper()) { case "DATA SOURCE": servidor = spliter[1]; break; case "USER ID": usuario = spliter[1]; break; case "PASSWORD": password = spliter[1]; break; case "INITIAL CATALOG": baseDeDatos = spliter[1]; break; } } } } } else { Console.WriteLine("No existe la conexión"); } return exito; } }
Ahora de esta manera la podemos utilizar:
//creamos nuestro objeto Conexion oConexion = new Conexion(); //ejecutamos el metodo oConexion.getData(); //imprimimos el resultado Console.WriteLine("servidor " + oConexion.servidor + " base de datos: " + oConexion.baseDeDatos + " usuario: " + oConexion.usuario + " password: " + oConexion.password);
Nota: Recuerden agregar arriba: using System.Configuration;
Si tienen alguna duda en comentarios pueden preguntar.
Y como siempre el código es para explicar no es la manera formal de hacerlo (por los atributos públicos :().
Realizar una conexión al correo para ver los mails con C# .Net. #gmail #pop3 #OpenPop.Net
En esta entrada tratare el tema de realizar una conexión por el protocolo Pop3 para poder leer nuestro correo electrónico, en este caso utilizare una cuenta de Gmail y obtendré los correos de la bandeja de entrada de la misma.
Para poder conectarnos haremos uso de una librería llamada OpenPop.Net que ya realiza la conexión de una manera rápida. La podemos descargar desde su página, o directamente de Nuget en visual studio buscándola por su nombre.
Es importante que realicemos en nuestra cuenta de Gmail los siguientes cambios, ya que Gmail cuenta con restricciones a clientes externos para leer los mails.
Primero(con sesión creada en gmail para hacer estos cambios claro) debemos activar la opción de permitir conexiones de aplicaciones externas en la siguiente liga:
Seleccionamos Activar y Guardar.
La segunda configuración es opcional y es para que Gmail nos permita descargar varias veces los mensajes aunque sea ya leído o ya descargado, basta con que vallamos a la configuración de Gmail y seleccionemos la siguiente opción y demos guardar.
Una vez tengamos la librería y la configuración en Gmail podemos hacer uso de la siguiente clase que he escrito y comentado pasó por paso:
using OpenPop.Mime; using OpenPop.Pop3; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Remoting.Messaging; using System.Text; namespace Sincronizador_SMTP.Business.Connect { /// <summary> /// clase que se conecta por smtp /// </summary> class ConnectPop3 { //usuario/mail de gmail private string username = "[email protected]"; //password private string password = "tupassword"; //el puerto para pop de gmail es el 995 private int port = 995; //el host de pop de gmail es pop.gmail.com private string hostname = "pop.gmail.com"; //esta opción debe ir en true private bool useSsl = true; public List<Message> getMensajes() { try { // El cliente se desconecta al terminar el using using (Pop3Client client = new Pop3Client()) { // conectamos al servidor client.Connect(hostname, port, useSsl); // Autentificación client.Authenticate(username, password); // Obtenemos los Uids mensajes List<string> uids = client.GetMessageUids(); // creamos instancia de mensajes List<Message> lstMessages = new List<Message>(); // Recorremos para comparar for (int i = 0; i < uids.Count; i++) { //obtenemos el uid actual, es él id del mensaje string currentUidOnServer = uids[i]; //por medio del uid obtenemos el mensaje con el siguiente metodo Message oMessage = client.GetMessage(i + 1); //agregamos el mensaje a la lista que regresa el metodo lstMessages.Add(oMessage); } // regresamos la lista return lstMessages; } } catch(Exception ex){ //si ocurre una excepción regresamos null, es importante que cachen las excepciones, yo //lo hice general por modo de ejemplo return null; } } }
Y de esta manera utilizamos la clase y recorremos los mensajes, y a su vez mostramos el asunto para probar que si corresponde a lo que tenemos en nuestra cuenta de Gmail.
//creamos el objeto ConnectPop3 oCP3 = new ConnectPop3(); //invocamos el metodo para obtener mensajes List<OpenPop.Mime.Message> lstMensajes = oCP3.getMensajes(); //recorremos y mostramos el asunto foreach(OpenPop.Mime.Message oMensaje in lstMensajes){ Console.WriteLine(oMensaje.Headers.Subject); }
Nota: Pop3 al igual que IMAP es un protocolo para leer mails, si deseamos enviar mails debemos conectarnos con el protocolo SMTP.
Detectar el control inalámbrico de Xbox en C# .Net sin utilizar XNA
Esta entrada está dedicada para enseñar cómo se puede detectar los controles de XBOX inalámbricos conectados a un receptor inalámbrico (PC Wireless Gaming Receiver) con C# .Net sin utilizar XNA.
Para poder detectar los controles haremos uso de una librería externa de nombre SlimDX, esta librería la podemos bajar por medio de Nuget o de su pagina http://slimdx.org/. SlimDX es una librería Open Source que nos permite construir programas usando DirectX, y una de sus funciones es detectar los Joystick.
También utilizaremos la clase GamepadState que ha hecho Renaud Bédard y podemos descargarla de su sitio, él ya nos facilita lo necesario para detectar los botones del control, palancas etc. Igual anexo la clase en esta liga, solo tienen que copiar y pegar el código en una clase del proyecto de Visual Studio.
Ahora que ya tenemos la librería SlimDX y la clase GamepadState solo nos queda comenzar a utilizar y detectar el control de la siguiente manera:
using SlimDX.XInput; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ControlXBox { class Program { static void Main(string[] args) { //creamos una instancia GamepadState y le enviamos la constante de control numero 1 GamepadState control = new GamepadState(UserIndex.One); //ahora detectamos si el controll esta conectado if (control.Connected) { Console.WriteLine("El control esta conectado"); //creamos un ciclo infinito solo para detectar el control cada que presionemos un boton while(true){ //detectamos si se realizo una modificación, se presiono un botón o se movio una palanca etc. control.Update(); //imprimimos el boton presionado en consola Console.WriteLine(control.Controller.GetState().Gamepad.Buttons.ToString()); } } else { //Si el control no esta conectado mostramos mensaje de que no esta conectado :( Console.WriteLine("El control NO esta conectado"); Console.ReadLine(); } } } }
Cree un proyecto de consola de Visual Studio y aquí plasmo el resultado en video para que puedan ver que funciona bien:
Cualquier duda en los comentarios pueden preguntar.
Linq, introducción y ejemplos rápidos en C# .Net
Esta entrada hablare sobre LINQ, lo necesario para que comprendas fácilmente y rápido, sin tanta teoría ni palabras raras.
Linq nació por allá del 2008 y desde entonces nos ha facilitado la vida, ya que agrega funcionalidades al lenguaje de c# o Visual Basic .Net respecto cualquier almacen de datos, es decir, nos permite aplicar algo parecido a consultas de SQL a una lista, un xml, o ¿porque no?, a la misma base de datos.
Algo que el mismo Microsoft recalca en todos sus cursos es que Linq se divide en tres acciones que son:
- Obtención de origen de datos.
- Creación de la consulta
- Ejecución de la consulta.
Terminemos de la palabrería y vayamos a los ejemplos.
El primer ejemplo es cómo podemos ordenar una lista de enteros con Linq y se puede hacer de la siguiente manera.
1. Obtención de origen de datos:
int[] arregloEnteros = { 1, 2, 3, 5, 3, 2, 8, 9 };
2. Creación de la consulta
IEnumerable<int> lstEnterosOrdenados = from nums in arregloEnteros orderby nums select nums;
En este punto aún no se ejecuta la consulta solo la guardamos en este caso en una colección de la instancia IEnumerable. Cualquier tipo de dato que admita implícitamente la interfaz IEnumerable o alguna de sus derivaciones, se le puede aplicar LINQ.
3. Ejecución de la consulta (ahora si aquí se ejecuta la magia de LINQ)
foreach(int n in lstEnterosOrdenados){ Console.WriteLine(n); }
De esta manera nuestro resultado es el siguiente:
Como vemos de una manera rápida podemos realizar operaciones que son el pan de cada día.
Ahora veamos otros ejemplos para comprender mejor el alcance de LINQ:
Filtrar elementos
//Origen de datos int[] arregloEnteros = { 1, 2, 3, 5, 3, 2, 8, 9 }; //Consulta, utilizamos where como en sql para obtener numeros menores a 5 IEnumerable<int> lstEnterosMenoresCinco = from nums in arregloEnteros where nums < 5 select nums; //Ejecucion foreach (int n in lstEnterosMenoresCinco) { Console.WriteLine(n); }
Linq en elementos complejos
//clase Complejo, una clase que nos servirá para el ejemplo public class Complejo { public int numero{get;set;} public string cadena{get;set;} public Complejo(int numero, string cadena) { this.numero = numero; this.cadena = cadena; } public string imprime() { return numero + " " + cadena; } }
//origen de datos Complejo[] lstComplejos={ new Complejo(1,"pato"), new Complejo(5,"perro"), new Complejo(9,"pajaro"), new Complejo(10,"pez"), new Complejo(2,"ave"), new Complejo(4,"gusano"), }; //consulta IEnumerable<Complejo> lstComplejosConP =from d in lstComplejos where d.cadena.StartsWith("p") select d; //ejecución de consulta foreach(Complejo c in lstComplejosConP){ Console.WriteLine(c.imprime()); }
Linq en elementos complejos obtener una colección reducida
//utilizamos la misma clase Complejo //origen de datos Complejo[] lstComplejos={ new Complejo(1,"pato"), new Complejo(5,"perro"), new Complejo(9,"pajaro"), new Complejo(10,"pez"), new Complejo(2,"ave"), new Complejo(4,"gusano"), }; //Consulta, reducimos la clase Complejo a una lista de cadenas IEnumerablex lstSoloCadenas = from d in lstComplejos select d.cadena; //ejecución de consulta foreach (string s in lstSoloCadenas){ Console.WriteLine(s); }
Con esto es más que suficiente para que hayan entendido LINQ y su potencial, de aquí en adelante solo les queda practicar y ver lo practico que es esta característica en .Net.
Funciones para codificar y decodificar en base64 en C# .Net
Las siguientes funciones nos sirven para realizar una codificación y decodificación en base64 :
public class Encrypt { //codificar base64 public static string Base64_Encode(string str) { byte[] encbuff = System.Text.Encoding.UTF8.GetBytes(str); return Convert.ToBase64String(encbuff); } //Decodificar base64 public static string Base64_Decode(string str) { try { byte[] decbuff = Convert.FromBase64String(str); return System.Text.Encoding.UTF8.GetString(decbuff); } catch { //si se envia una cadena si codificación base64, mandamos vacio return ""; } } }
Y Así se utiliza:
string base64=Encrypt.Base64_Encode("patito"); string cadenaNorma=Encrypt.Base64_Decode("3411f6d521ed0d17b6953e5741eaecca");
Recuerda agregar las siguiente librería:
using System.Text;