Archivo del Autor: devnetec

Acerca de devnetec

Profesional en Análisis, diseño y desarrollo Sistemas

Aplicaciones desde el AppStudio de Microsoft


 

clip_image001

Lo General

Bueno, no le había tomado atención la verdad a esta poderosísima herramienta de Microsoft para desarrollar aplicaciones para dispositivos Windows Phone y Windows 8 y 8.1, si estamos hablando del AppStudio!

Es una iniciativa de Microsoft para fomentar el desarrollo de aplicaciones en sus plataformas, y definitivamente en muy buena, los que deseen pueden ver los tutoriales que están a disposición en el propio sitio y se pueden animar a desarrollar.

Hoy en día cualquiera de nosotros tiene la posibilidad de crear estas aplicaciones, sin embargo, si queremos probarla en nuestros dispositivos o subirla a la Tienda de aplicaciones es necesario tener una cuenta de desarrollador, para esto necesitas una cuenta de correo de Microsoft y suscribirte como desarrollador pagando anualmente 20 dólares, lo cual creo que es razonable considerando que con una aplicación puedes llevar a todo el mundo. También puedes hacer dinero vendiendo tus creaciones.

Acá dejo los enlaces por si se animan.

AppStudio: appstudio.windows.com/es-es

DevCenter: dev.windows.com/es-es

Y claro está tenemos el IDE de desarrollo de Microsoft para realizar aplicaciones, en su versión Express o Community www.visualstudio.com/es-us/products/visual-studio-community-vs.aspx

Creación propia

Creo que podemos empezar a probar, y como ejemplo hace unos días acabé de crear esta aplicación que es básica, lee noticias de un diario local por medio de las RSS disponibles.

clip_image002

Fue creada con ayuda de AppStudio, usando sus herramientas intuitivas, vean la app acá en este link.

clip_image003

Cargar DLL de forma dinámica


 

Problemática: Tengo una aplicación grande, y varios grupos de desarrolladores que necesitan incluir sus despliegues al mismo sistema. Es basado en WindowsForm, y estamos administrando los módulos a través de un formulario MDI.

Adicional es necesario que por cada usuario final que ingrese al sistema se cargue el formulario asociado a su perfil. Por lo tanto se plantea lo siguiente, tener una sola aplicación base donde estará el formulario MDI, para que los demás grupos de desarrolladores interactúen con este proyecto, cada grupo hará su proyecto basado en DLL, las mismas tendrán los procesos que a cada módulo corresponda con sus respectivas pantallas o formularios. Luego estas se incluirán dinámicamente al proyecto principal.

Pues bien, va lo primero, crear el aplicativo principal, es decir, el que tendrá el formulario MDI donde estarán los demás módulos.

Trabajaremos con Visual Studio 2013, un proyecto de tipo WindowsForm

TipoProyecto

Le damos un nombre, en este caso es Demo.WF.MDI, y agregamos un nuevo elemento al proyecto que sería un formulario tipo MDI que servirá como contenedor de los formularios de todos los equipos de trabajo que trabajan alrededor de este proyecto.

AgregaMDI

Quedaría así

ProyectoMDIDonde el formulario de nombre “Principal.cs” es precisamente el de tipo MDI que contendrá las demás ventanas.
El formulario “FrmInterna.cs” es el formulario que viene de forma predeterminada al crear el proyecto.
El archivo “App.config” es donde se imprimen configuraciones globales del proyecto y de los ensambladores que se referencian.

 

Y el archivo “Program.cs” es la clase de inicio del proyecto.

Listo, ahora agregamos a la solución otro proyecto tipo Ensamblador, este tipo de proyectos no tiene puntos de entrada como el anterior que es en el “Program.cs”

Sobre la solución se da clic derecho y en el menú vamos a la opción “Agregar” y luego “Nuevo Proyecto”.

AgregaDLL

Le damos un nombre a este proyecto y le damos aceptar, esto agrega a la solución el proyecto y queda como vemos en la siguiente figura.ProyectoDLL

Le he agregado 2 clases de tipo formulario para realizar este ejemplo, la “App01.cs” y la “App02.cs”

Adicional le he eliminado los archivos que vienen de forma predeterminada al crear un proyecto de este tipo.

A cada formulario agregado le he colocado un botón, la acción del mismo es salir del formulario (this.Close();).

Crearemos un pequeño modelo de objetos EF (EntityFramework) donde se incluirá la información del menú que se cargará de forma automática cuando inicie el sistema. Existirá un formulario de inicio de sesión, cuando ingrese el usuario 1 se cargarán todas las aplicaciones y el usuario 2 solo unas cuantas. No se creará el mantenimiento de estos perfiles, lo manejaremos directamente en la base de datos. Quizá haga otro post de este tema de perfiles.

AgregarComponentes Tenemos como quedaría el Proyecto, en el recuadro azul hemos creado una carpeta con nombre “Base”, en la cual hemos creado el modelo de objetos, a partir del mismo generamos la base de datos en un servidor de SQL Server, y adicional hemos creado un script para insertar la información necesaria para que el sistema opere, dado que este demo no contempla el mantenimiento de las tablas creadas.

En el recuadro café hemos creado el formulario que hará de inicio de sesión de nuestro Demo, es aquí donde cargaremos al usuario validado con su respectivo perfil, en el cual ya estará configurado los accesos por usuario.

Aquí está el modelo de objetos, como vemos tenemos 3 objetos: Usuario, Perfil y Funcionalidad, en el primero tendremos información del usuario que ingresará al sistema, este tendrá configurado un perfil y a su vez, dicho perfil tendrá asignado varias funcionalidades, las mismas solo abarcarán hasta definir qué formularios puede o no ver el usuario validado para efectos del Demo.

ModeloObjetos

A partir de aquí se generará la base de datos de forma automática, la misma creará 3 tablas asociadas a cada objeto y adicional 2 tablas más que harán de relaciones para los objetos, tal como se ve en la siguiente figura.

BaseDatos

En la tabla “Funcionalidad” está la información que se usará para cargar los formularios de forma dinámica, queda así:

FuncionalidadLos nombres son descriptivos, en el campo “Ruta” estoy ingresando la dirección física con el nombre de la DLL para cada instalación, obviamente para que esto funciones en cada máquina que se instale debe tener la misma dirección física. Para el campo “NombreLogico” no es más que el NameSpaces incluyendo el nombre de la clase Form a la que hacemos referencia para que se cargue. Esta tabla es recursiva, y cada registro tiene un registro asociado padre que es el menú de quién depende, si nos fijamos esta consta solo de 3 niveles.

Pues bien, así sería el proceso de como el usuario hace interacción con el sistema y como el sistema hace para cargar los formularios.

image De los procesos y subprocesos se explicará brevemente el tercero (inicia el logon y carga usuario con perfiles) y el sexto (carga los formularios por medio de los ensambladores).

Como dice el flujo desde el formulario MDI se pregunta si tenemos el usuario autenticado con la condición que tenga por lo menos asignado 1 perfil, sino es así pasa al Logon.

Proceso1 En el código, luego que el usuario validó su credenciales, asigna el objeto a “usuarioActivo” y empieza a realizar la construcción de los menús dependiendo de los perfiles. Como hicimos un modelo de objetos EF y relacionamos al usuario con los perfiles y este a su vez con las funcionalidades, si cargamos al usuario, el mismo trae consigo todos los objetos relacionados y podemos escribir código como el siguiente.

Proceso2 Luego agregamos los formularios al menú por medio del método “AgregaMenuHijo”

Proceso3 Ahora veremos la carga del ensamblado de forma dinámica, como vemos se le pasa la ruta física y el espacio de nombres incluido el nombre de la clase de tipo Form.

Proceso4 Y listo, de un formulario que en diseño se ve sin menú, luego se poblará con el menú según el perfil de la persona.

Resultado

Este es el resultado visual de nuestra demo. Si desean el fuente completo con base y datos de prueba, déjame tu correo.

Espero les sirva.

Leer REGEDIT en sistemas de 64Bits


 

Hola a todos, en un proyecto me presenté con un problema que no se nos había ocurrido podía pasar. Resulta que necesitábamos utilizar una DLL para realizar una tarea específica, de la cual no teníamos el fuente, la misma estaba hecha sobre VB6.0, y ésta entre otras cosas leía el registro de Windows. Para sistemas de 32 bits iba muy bien.

 

Por cambio de arquitectura  migramos muchas cosas a servicios, pero dicha clase en particular imageni si quiera sabíamos que hacía exactamente y ponernos a rehacerla era más costoso que utilizarla. Dicho esto nos tocaba hacer un servicio en C# con Framework 4.0, hacer referencia a la DLL hecha en VB6.0 (32bits) y que funcione.

 

Nos topamos con varios inconvenientes, el primero era registrar la DLL, lo cual lo hicimos con el regsvr32.exe de la carpeta System32 y SysWOW64, no determinamos al final cual fue la que sirvió.

 

Luego sobre el IIS se configuró un ApplicationPool para dicho servicio, a este pool, en la propiedad “Habilitar aplicaciones de 32 bits” (se ve en la configuración avanzada) se la estableció a “True”.

Con esto, el servicio ya podía ejecutar la DLL sin problemas.

 

El otro problema que tuvimos fue que no podíamos leer la entrada en el regedit desde la clase. Esto pasa porque como es DLL de 32bits lee las entradas en el registro solo para componentes de 32bits. Específicamente tratamos de entrar al “HKEY_LOCAL_MACHINE\SOFTWARE\MiEntradaDeRegistro” (al menos así era para sistemas de 32bits), dado que estábamos parados en un servidor de 64bits, nos tocó crear la entrada e ir a “HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MiEntradaDeRegistro” y luego leer normalmente nuestra cadena almacenada.

image

Básicamente el código fue el siguiente:

string KeyPath = "SOFTWARE\\Wow6432Node\\MiEntradaDeRegistro";
RegistryKey key = Registry.LocalMachine.OpenSubKey(KeyPath, false);

 

Sin olvidar el “using Microsoft.Win32;”

 

Espero les sirva.

Llamar código c# desde botón html


Esto nos sirve para cuando por algún motivo no queremos ussar los botones de asp.net en nuestro desarrollo y queremos reemplazarlos por botones de html.

Inicialmente codificamos en nuestra página el botón html de la siguiente forma:

<inputtype=”button”id=”miBoton”runat=”server”value=”btnAtrás”/>

Definimos el método que necesitamos que se ejecute cuando el usuario de click en el botón html

protectedvoid MetodoClick(object sender, EventArgs e)

{

//Mi código!!!

}

 

Luego en nuestro codebehind de c# definimos el evento PreInit de la página para asignar un método al evento click del botón html creado previamente.

protectedvoid Page_PreInit(object sender, EventArgs e)

{

this.miBoton.ServerClick += MetodoClick;

}

Espero les sirva.

Agregar dígito a tus contactos de Outlook


Hola a todos, hoy quiero mencionar algo que ocurrió en Ecuador, pues resulta que hay tantas personas con un número celular que la numeración estaba a punto de terminarse y la entidad correspondiente decidió aumentar 1 dígito a todos los números de celular para resolver el problema.

Pero esto significa que tooooodos los usuarios debían actualizar sus agendas porque sino el 1 de octubre no podrían llamar a ningún contacto registrado en cada celular.

Para esto las operadoras dieron una solución para los teléfonos que más comercializan, como son los BlackBerry, Symbian, Android, y IPhone a travésde varios mecanismos, pero hay un grupo de personas que utiliza WindowsPhone (como yo…. y conozco algunos más) que no entraron con este beneficio, entonces supongo que algunos se tomaron la molestia de actualizar sus contactos 1 a 1…, terrible…

Como estoy en la misma colada (como se dice acá) me puse algo ingenioso para buscar una solución mas rápida a la actualización de mi agenda. Pensé en varias opciones como construir una app que se conectara directamente al servicio de contactos de Windows Live y actualizarlo mediante código, utilizando las api de Live Connect, pero esta versión solo es para Windows 8 y/o Windows phone y aunque tengo mi Win8 instalado quizás no todos lo tengan. Entonces decidí hacerlo un poco mas rústico el tema.

La idea fue realizar una exportación de contactos del correo luego a través de código C# modificar el campo del número de teléfono aumentando el dígito en la posición necesaria y listo. Después de esto solo quedaba importar el archivo modificado, pero iban a dar conflictos con los contactos existentes y para variar no hay manera de realizar una eliminación masiva desde internet.

Mi idea era exportar los contactos, modificarlos con mi app, luego eliminar todos mis contactos en mi correo. Y seguido importar los contactos modificados. Maestro verdad….. Jajaja

Luego me topé con otro dilema…, aparentemente es imposible eliminar mis contactos de forma masiva desde la Web, entonces configure el cliente MS_Outlook con mi cuenta de correo, luego eliminé mis contactos y acto seguido subí los contactos importando el resultado de mi App desde la web.

Y resultó, luego pongo el código de mi App.

Impersonalización


Alguien ha escuchado hablar sobre este concepto??? Seguramente muchos desarrolladores que han creado software web debe saber algo del tema, sin embargo esto que expondré acá es algo un poco distinto, pero sigue el mismo concepto.

Lo que voy a mostrar es como poder realizar la ejecución de un bloque de código determinado con un usuario diferente al que inició la aplicación, es decir, si inicié la aplicación con el usuario01, haré que unas cuantas líneas de código se ejecuten con el usuario02, luego que vuelva a ejecutar las líneas restantes con el usuario 01.

/// <summary>
/// Cambia el usuario en unas líneas de código.
/// </summary>
/// <param name="usuario">Nuevo usuario.</param>
/// <param name="clave">Clave de nuevo usuario.</param>
/// <param name="dominio">Dominio del nuevo usuario.</param>
public static void CambioUsuario(string usuario, string clave, string dominio)
{
    WindowsImpersonationContext objContexto = null;

    Console.WriteLine("Usuario: {0}", Environment.UserName);

    objContexto = Impersonaliza.WinLogOn(usuario, clave, dominio);
    if (objContexto != null)
    {

        //Aquí va el código que se necesita ejecutar 

        Console.WriteLine("Usuario: {0}", Environment.UserName);

        objContexto.Undo();
    }

    Console.WriteLine("Usuario: {0}", Environment.UserName);
    Console.ReadLine();
}

Justo después de la línea 21 (objContexto.Undo();), vuelve al usuario con el cual ha ingresado al SO.

Acá va el resultado con el usuario “Prueba” al cual se dio el control de la aplicación.

image

Adjunto el código aquí.