none
Aplicación Winform c# después de ser instalada no puede ser lanzada RRS feed

  • Pregunta

  • Hola a todos.

    He construido una aplicación WinForm, utilizando el lenguaje C#. El mismo tipo de aplicaciones las codificaba en Visual Studio 2015 y todo me funcionaba muy bien. Tomé la decisión de cambiarme a Visual Studio 2019 y he tenido el siguiente problema: Después de terminar de codificar la aplicación, genero un instalador (.msi) y después de instalarlo en otro computador con Windows 10 la aplicación no inicia (Muestra un reloj de espera, luego desaparece el reloj de espera y no muestra nada más, además del cursor), en la sección de mantenimiento de Windows se muestra en el historial de confidencialidad decir: CrashOnLunch.

    La aplicación está construida por capas, así: 

    Bajo una misma solución, hay 3 proyectos basados en el Framework Net Standar 2.0 (Conexion [Tiene dependencia a mysql], DatosClases, DatosControles [Tiene dependencia a mysql y referencia a los proyectos Conexion y DatosClases]), La capa de presentación está en Framework 4.7.2 (Tiene referencia a DatosControles y DatosClases).

    La máquina desde donde se realiza el desarrollo tiene instalado windows10 x 64, Visual studio 2019 Enterprise 16.5.1, mysql 5.7.11. Si instalo el programa construido, aquí funciona correctamente después de instalarlo.

    El instalador fue creado con la extensión "Microsoft Visual Studio Installer Projects 0.9.6".

    Pruebas realizadas para identificar el área de la posible falla:

    1) Se realizó la misma instalación del paquete (.msi) en una máquina virtual con Windows 10 recién instalado. La instalación fue correcta pero la aplicación no se pudo lanzar (También se instaló y se ejecutó como administrador).

    2) Se empezaron a remover clases de la aplicación, luego crear un instalador, hasta quedar con un modelo mínimo viable y se logró establecer qué:

    2.1) Si se rompe la referencia que hay entre la capa de presentación y la capa de ControlDatos, la aplicación después de instalada, abre correctamente (obviamente, no puede desplegar ninguna funcionalidad porque no está asociada la capa de ControlDatos).

    2.2) Al crear la referencia nuevamente a la capa de control de datos, se ingresó a la clase controladora y se mantuvieron las referencias del framework y a las otras capas o proyectos  (using ...) y no se crearon los objetos de la clases invocadas a través del using. En éste caso también se abre la aplicación normalmente después de instalada (Pero no hay funcionalidad de la aplicación porque no hay objetos creados de la capa de control de datos)

    2.3) Después de crear un objeto de la clase de la capa ControlDatos, se crea el instalador nuevamente, se instala en la máquina de prueba y al ejecutar el (.exe) el programa no se abre. ¿Por qué al instanciar una clase de la capa ControlDatos, la aplicación después de instalarse no abre cuando se intenta abrir?

        public partial class frmPal : Form
        {
            CtrlPersona OCPersona = new CtrlPersona();
            public frmPal()
            {
                InitializeComponent();
            }
    etc..


    3) Instalé en la máquina virtual el visual studio 2019 Community, luego instalé la aplicación construida en visual studio 2019 y no funcionó.

    4) Instalé el framework completo 4.7.2 en la máquina de prueba, luego instalé la aplicación construida en visual studio 2019 y no funcionó.

    5) Instalé en la Capa de Conexión y capa ControlDatos el paquete nuget Mysql.Data v8.0.19 (Oracle). Luego de crear el instalador y desplegar en la máquina de prueba, la aplicación no arranca.

    6) Instalé en la Capa de Conexión y capa ControlDatos el paquete nuget MysqlConnector v0.63.0.Luego de crear el instalador y desplegar en la máquina de prueba, la aplicación no arranca.

    7) Desde el sitio de Oracle, descargué el conector y lo instalé, sin usar Neget. Luego adicioné la referencia al proyecto Conexión y ControlDatos. Luego de crear el instalador y desplegar en la máquina de prueba, la aplicación no arranca.

    8) Creé un proyecto hola mundo, solo con la capa de presentación, luego de crear el instalador y desplegarlo en una máquina de prueba, funcionó correctamente el formulario de inicio.

    9) En todos los casos, la aplicación funciona correctamente en la máquina desde donde se codificó la aplicación. No se instaló la aplicación, sino que se ejecutó la Depuración.

    A continuación entrego el modelo de la aplicación:

    CAPA CONEXION

    using System;
    using MySql.Data.MySqlClient;
    using System.Collections.Generic;
    using System.Data;
    namespace Conexion.Conexion
    {
        public class ClsConecta
        {
            private string ruta;
            public ClsConecta() 
            {
                ruta = @"Server=local; Database = basedatos; Uid = runot; Pwd = clave1321";
            }
    
            /// <summary>
            /// Obtiene múltiples registros a través de una consulta a la base de datos
            /// </summary>
            /// <param name="parametros">Parametros que se integrarán a la instrucción sql</param>
            /// <returns>Datatable que contiene el Conjunto de datos resultado de la consulta</returns>
            public DataTable ListarRegistros(List<List<MySqlParameter>> parametros) 
            {
                try
                {
                    using (MySqlConnection con = new MySqlConnection())
                    {
                        using (MySqlCommand cmd = new MySqlCommand()) 
                        {
                            cmd.Parameters.Clear();
                            foreach (List<MySqlParameter> pa in parametros)
                            {
                                foreach (MySqlParameter p in pa)
                                {
                                    if (p.ParameterName == "@sql")
                                    {
                                        cmd.CommandText = p.Value.ToString();
                                    }
                                    cmd.Parameters.Add(p);
                                }
                            }
                            cmd.CommandType = CommandType.Text;
    
                            cmd.Connection = con;
                            con.ConnectionString = ruta;
                            con.Open();
                            DataTable dt = new DataTable();
                            MySqlDataReader dr;
                            dr = cmd.ExecuteReader();
                            dt.Load(dr);
                            return dt;
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
        }
    }

    CAPA DATOS

    namespace DatosClases.Persona
    {
        public class ClsPersona
        {
            public ClsPersona()
            {
    
            }
            public int Id { get; set; }
            public int Id_persona_tipo { get; set; }
            public int Id_tipo_documento { get; set; }
            public double Di { get; set; }
            public string Nombre { get; set; }
            public string Nombre2 { get; set; }
            public string Apellido { get; set; }
            public string Apellido2 { get; set; }
            public string Email { get; set; }
            public string Telefono { get; set; }
            public string Celular { get; set; }
            public int Estado { get; set; }
            public int Id_usuario_crea { get; set; }
            public int Id_usuario_mod { get; set; }
        }
    
    }


    CAPA CONTROL DATOS

    using System.Collections.Generic;
    using System.Data;
    using Conexion.Conexion;
    using MySql.Data.MySqlClient;
    
    namespace DatosControles.Persona
    {
        public class CtrlPersona
        {
            ClsConecta con = new ClsConecta();
            public CtrlPersona()
            {
    
            }
    
            public DataTable ListarPersonas() 
            {            string sql;
                List<List<MySqlParameter>> Parametros = new List<List<MySqlParameter>>();
    
                List<MySqlParameter> lista = new List<MySqlParameter>();
                MySqlParameter psql = new MySqlParameter();
                sql = "Select * from db_contabilidad_f_h_admin.per_personas";
    
                psql.ParameterName = "@sql";
                psql.Value = sql;
    
                lista.Clear();
                lista.Add(psql);
                Parametros.Clear();
                Parametros.Add(lista);
                return con.ListarRegistros(Parametros);
    
            }
    
        }
    }

    CAPA PRESENTACION

    using System;
    using System.Windows.Forms;
    //using DatosClases.Persona;
    using DatosControles.Persona;
    
    namespace Presentacion
    {
        public partial class frmPal : Form
        {
            CtrlPersona OCPersona = new CtrlPersona();
            public frmPal()
            {
                InitializeComponent();
            }
            private void Btn_Cargar_Click(object sender, EventArgs e)
            {
                try
                {
                        Dgv.DataSource = OCPersona.ListarPersonas();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
    }


    Nota: Quise anexar fotos pero la plataforma dice que mi usuario aún no se ha validado. Por el momento no puedo adjuntar link o subir fotos.


    • Editado Bugoc miércoles, 1 de abril de 2020 21:37
    miércoles, 1 de abril de 2020 16:45

Respuestas

  • Hola a todos;

    #### Solución Parte 1

    Parte de la solución se plantea aquí: https://stackoverflow.com/questions/22774135/how-to-resolve-this-system-io-filenotfoundexception

    En el archivo Program.cs se adicionó un try -> catch

            static void Main()
            {
                try
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
    
                    Application.Run(new Presentacion.Ingreso.FrmPpal());
                }
                catch (Exception ex)
                {
                    //throw;
                    MessageBox.Show(ex.TargetSite + " " + ex.Message, "Excepción", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
    
            }

    Allí se identificó que un archivo al que hacía referencia no se copiaba en la instalación, exactamente una imagen.

    Había: 

                Image objImage = Image.FromFile(@"C:\Users\delfin\source\repos\Icontable\Presentacion\Iconos\Botones\nuevo_24.png");

    Se corrigió así: 

                Image objImage = Image.FromFile(Application.StartupPath + "\\Iconos\\Botones\\nuevo_24.png");
    
    //La línea anterior se incluyó dentro de un método, pues permitirá realizar el cambio en una única parte del sistema

    Después de la instalación, se debe adicinar la carpeta de Iconos con todo su contenido. Eso resolvió la primera parte.

    #### Solución Parte 2

    Se descargó el conector .net de mysql, sitio de oracle. Se instaló por fuera del Visual Studio, posteriormente se hizo la referencia a la capa Conexion y ControlDatos. Así se solucionó el problema de conexión a la base de datos. Qué habrá pasado con los paquetes NUGET?


    jueves, 2 de abril de 2020 22:44

Todas las respuestas

  • Hola

     

    Gracias por levantar tu consulta en los foros de MSDN. Estamos analizando su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso.

     

    Gracias por usar los foros de MSDN.

     


    Oscar Navarro

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    miércoles, 1 de abril de 2020 17:15
    Moderador
  • Por los síntomas que describes, entiendo que el error se produce precisamente cuando llamas a alguno de los objetos que acceden a la base de datos. Esto indicaría algún problema (todavía no sabemos cuál) con el proveedor de datos o la configuración del mismo.

    ¿Por casualidad el primer acceso a datos lo realizas directa o indirectamente desde el Form_Load? Existe un bug conocido por el que a veces los errores que ocurren en el Form_Load se descartan silenciosamente, y entonces el programa simplemente falla y no se ve por qué. Haz la prueba de modificar provisionalmente el programa de forma que dejes vacío el Form_Load, y en su lugar añade temporalmente un botón de prueba en el formulario y pon dentro del click de ese botón lo que antes estaba en el Form_Load. Pruébalo, haz click en el botón, y si el problema es el que acabamos de suponer entonces sí que se producirá el error en forma visible y podremos examinar el mensaje de excepción. Esto debería darnos una idea de por qué está fallando el proveedor de datos.

    jueves, 2 de abril de 2020 8:01
    Moderador
  • Hola Alberto, gracias por su interés. En el formulario no se utiliza el Form_Load.
    jueves, 2 de abril de 2020 22:35
  • Hola a todos;

    #### Solución Parte 1

    Parte de la solución se plantea aquí: https://stackoverflow.com/questions/22774135/how-to-resolve-this-system-io-filenotfoundexception

    En el archivo Program.cs se adicionó un try -> catch

            static void Main()
            {
                try
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
    
                    Application.Run(new Presentacion.Ingreso.FrmPpal());
                }
                catch (Exception ex)
                {
                    //throw;
                    MessageBox.Show(ex.TargetSite + " " + ex.Message, "Excepción", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
    
            }

    Allí se identificó que un archivo al que hacía referencia no se copiaba en la instalación, exactamente una imagen.

    Había: 

                Image objImage = Image.FromFile(@"C:\Users\delfin\source\repos\Icontable\Presentacion\Iconos\Botones\nuevo_24.png");

    Se corrigió así: 

                Image objImage = Image.FromFile(Application.StartupPath + "\\Iconos\\Botones\\nuevo_24.png");
    
    //La línea anterior se incluyó dentro de un método, pues permitirá realizar el cambio en una única parte del sistema

    Después de la instalación, se debe adicinar la carpeta de Iconos con todo su contenido. Eso resolvió la primera parte.

    #### Solución Parte 2

    Se descargó el conector .net de mysql, sitio de oracle. Se instaló por fuera del Visual Studio, posteriormente se hizo la referencia a la capa Conexion y ControlDatos. Así se solucionó el problema de conexión a la base de datos. Qué habrá pasado con los paquetes NUGET?


    jueves, 2 de abril de 2020 22:44
  •  Qué habrá pasado con los paquetes NUGET?


    Los paquetes NUGET siguen alli en tu solucion! Si ya no son necesarios puedes entrar en el administrador de paquetes Nuget y desinstalarlos con toda confianza.

    Acabo de marcar las dos soluciones como la respuesta al thread, procedo a cerrarlo respectivamente! Si tienes cualquier otra consulta, por favor crea un nuevo thread y con todo gusto te estamos ayudando!

    Gracias por usar los foros de TechNet.

     

    Luis Diego Mora

     

     ____

    lunes, 6 de abril de 2020 18:17
    Moderador