none
Error al ejecutar RRS feed

  • Pregunta

  • Hola, cuando trato de ejecutar mi aplicación ya instalada en otra pc me aparece este error. La PC en cual lo ejecuto tiene solamente el motor de base de datos SQL express instalado.

    Como podría solucionar este error?

    Saludos

    sábado, 11 de febrero de 2017 18:00

Respuestas

  • "Federico32113" preguntó:

    > Hola, cuando trato de ejecutar mi aplicación ya instalada en otra pc me aparece este error.
    >
    > Referencia a objeto no establecida como instancia de un objeto.
    >
    > Como podría solucionar este error?

    ¡Muy sencillo! Creando una instancia nueva, o referenciando otra instancia ya existente, del objeto cuya propiedad, método, evento o campo deseas acceder o ejecutar. ;-)

    Federico, éste es el clásico error que aparece cuando queremos hacer uso de un objeto cuyo valor es Nothing, es decir, no está referenciando un objeto nuevo u otro ya existente. Si el valor es Nothing, deberías de saber que no se puede acceder a su interfaz, y de hacerlo, obtendrás una NullReferenceException con el mensaje de error indicado.

    Lo normal y habitual es que en nuestro código verifiquemos si una variable objeto tiene o no un valor Nothing ANTES de intentar utilizarla, porque si su valor es Nothing, lo único que te puede ocurrir es que obtengas el error que estás obteniendo. ;-)

    Dim variable As String
    
    If (variable Is Nothing) Then
      ' El valor es Nothing; creamos una nueva instancia de la clase
    ' String asignándole una cadena de longitud cero. variable = String.Empty End If ' Leemos el valor de la variable MessageBox.Show(variable)

    ¿Que el objeto cuyo valor es Nothing es del tipo SqlConnection, DataTable, etc.? Pues verificarías su valor de la misma manera: 

    If (objeto Is Nothing) Then
        ' El valor es Nothing; ejecutar lo que proceda
    End If
    

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    sábado, 11 de febrero de 2017 18:20
    Moderador
  • "Federico32113" preguntó:

    > -El error al aparecer al ejecutar el programa. ¿Quiere decir que el
    > primer problema en el formulario de inicio?

    Si el objeto de inicio de tu aplicación es un formulario, y dices que es ahí donde aparece el error, pues tendrías que revisar todo el código que se ejecuta al cargar el formulario para detectar el objeto que tiene el valor Nothing y que es el causante de la NullReferenceException.

    > - Se puede verificar que no queden valores Nothing sin tener que
    > instalar para posteriormente ejecutar y ver si tiene errores?

    No. Los valores Nothing o null se detectan EN TIEMPO DE EJECUCIÓN, tanto en Visual Basic, C#, o en cualquier otro lenguaje de programación que se utilice, por lo que el código de tu aplicación tendrá que estar preparado para detectar esos valores Nothing y actuar en consecuencia, porque de no hacerlo así, y de darse esa circunstancia, tu aplicación finalizará sin más, ofreciéndole al usuario de tu aplicación una pobre imagen de la misma.

    > -Pero la duda que me queda porque cuando lo instalo y ejecuto en la PC
    > en la cual lo estoy desarrollando funciona bien, y cuando lo ejecuto
    > en otra aparece el error que mostré al principio, por eso me parece
    > que no es un problema de código.

    Es un problema de tu código, te guste o no te guste, el cual NO ESTÁ PREPARADO ante cualquier adversidad que se presente en otros PCs donde se ejecute tu aplicación.

    Tu aplicación la has preparado para que funcione correctamente en tu PC, y en aquellos otros que tengan los mismos requisitos que tiene tu PC para que la misma se ejecute satisfactoriamente, y estás asumiendo que en todos los PCs se va a ejecutar igual de bien, y eso es un error de principiante, el pensar que todos los equipos tienen instalado el mismo hardware y software que disponemos en nuestros equipos: craso error.

    Imagina que estás desarrollando una aplicación que trabaja con archivos de bases de datos de Access versión 2007 o superior. Si en algún PC donde se ejecute tu aplicación no se encuentran instalados los componentes redistribuibles del motor de bases de datos de Access 2007 o 2010, ¿cómo pretendes que ese usuario pueda establecer satisfactoriamente una conexión con una base de datos de Access 2010, por poner un ejemplo? Si das por hecho que TODOS los usuarios disponen de dicho motor de datos, no es de extrañar que tu aplicación obtenga multitud de errores en aquellos PCs que no cuenten con el software adecuado para establecer una conexión con la base de datos.

    Te vuelvo a reiterar lo mismo: ante un valor devuelto por una función, tanto nuestra como de .NET Framework, donde podemos sospechar que su valor sea Nothing, tienes que verificar explícitamente dicha circunstancia, si no deseas conseguir resultados inesperados, claro está:

        Public Sub Buton1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Llamamos a la función CrearCodigoPC() 
            '
            Dim cadena As String = CrearCodigoPC()
    
            ' Como sospechamos que su valor puede ser Nothing,
            ' verificamos tal circunstancia.
            '
            If (cadena Is Nothing) Then
                ' El valor es Nothing; ejecutar lo que proceda.
                '
                MessageBox.Show(temp)
    
                ' Abandonamos el procedimiento
                Return
            End If
    
            ' Llegado aquí, se comprende que el valor devuelto
            ' por la función no es Nothing; asignar los valores
            ' a los distintos campos.
            '
            ValorAEncriptar = cadena
            CodigoPC = cadena
    
        End Sub

    Así es como entiendo que se debería de actuar ante el valor devuelto por una función donde sospechamos que su valor puede ser Nothing. Todo lo que no sea hacer esto son ganas de perder el tiempo intentando averiguar dónde se encuentra el motivo de obtener una NullReferenceException con el clásico mensaje de error Referencia a objeto no establecida como instancia de un objeto, cuando en nuestro propio PC de desarrollo no obtenemos ningún mensaje de error.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    lunes, 13 de febrero de 2017 10:42
    Moderador
  • "Federico32113" escribió:

    > Como se ve en la imagen me muestra el error en el load del primer Form.
    >

    De acuerdo al rastro del error que se muestra en la imagen, éste se produce en la función CrearCodigoPC, y ahí, lo único que yo observo susceptible de producir una excepción, son las tres llamadas que efectúas a Windows Management Instrumentation (WMI), por tanto, lo primero sería preguntarte si tienes iniciado en ese Windows 7 virtual el servicio Instrumental de administración de Windows, porque si no lo tienes, pocas consultas vas a poder realizar.

    Abre los servicios de Windows, seleccionando en el menú de inicio la opción Ejecutar, y en el cuadro de texto Abrir escribe services.msc y pulsa el botón Aceptar. Busca el servicio indicado y mira a ver si está detenido o pausado:

    Y si dicho servicio está iniciado, en ejecución, y lo más importante, que éste no se encuentre dañado, lo siento muchísimo pero yo me rindo ya. :-(

    En el siguiente enlace encontrarás más información sobre el servicio de WMI:

    How to Start/Stop Windows Management Instrumentation service

    Siento que esté en inglés, pero es lo primero que me he encontrado.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    lunes, 13 de febrero de 2017 23:14
    Moderador
  • "Federico32113" escribió:

    > Lo que quiero decir es que la función CrearCodigoPC me asigna en valor
    > que obtiene a "cadena" cuando lo ejecuto desde visual en la PC en la
    > que lo desarrollo.

    Entonces, se puede decir que el código existente en la función CrearCodigoPC es correcto. ¿De acuerdo?

    > Cuando lo ejecuto en la otra pc en cual lo instale me sale el cuadro de
    > diálogo de error.

    Lo que significa que el problema está en ese PC, no en el código existente en la función CrearCodigoPC, por lo que tendrás que averiguar los motivos por los cuales cuando ejecutas el código en dicha función NO RECUPERA LA INFORMACIÓN QUE PRECISA del Instrumental de Administración de Windows instalado en el sistema operativo del Windows 7 virtual donde ejecutas tu aplicación, que entiendo es el único objeto que puede dar lugar a una excepción.

    > procesador = service("ProcessorId").ToString()
    > disco = service("SerialNumber").ToString()
    > memoriaRam += Convert.ToDouble(service("Capacity"))

    Como estás utilizando los métodos ToString y Convert.ToDouble para convertir al tipo de dato adecuado el valor System.Object devuelto por el elemento que deseas consultar, ANTES de llamar al método ToString o Convert.ToDouble, verifica si el valor devuelto por el objeto ManagementObject es o no Nothing. Para ello, ejecuta la nueva versión de la función CrearCodigoPC:

        Private Function CrearCodigoPC() As String
    
            Dim procesador As String = String.Empty
            Dim disco As String = String.Empty
            Dim memoriaRam As Double
            Dim resultado As Object = Nothing
    
            Dim busco As New ManagementObjectSearcher("Select * FROM Win32_Processor")
            For Each service As ManagementObject In busco.Get()
                resultado = service("ProcessorId")
                If (Not resultado Is Nothing) Then
                    procesador = resultado.ToString()
                End If
            Next
    
            busco = New ManagementObjectSearcher("Select * FROM Win32_DiskDrive")
            For Each service As ManagementObject In busco.Get()
                resultado = service("SerialNumber")
                If (Not resultado Is Nothing) Then
                    disco = resultado.ToString()
                End If
            Next
    
            busco = New ManagementObjectSearcher("Select * FROM Win32_PhysicalMemory")
            For Each service As ManagementObject In busco.Get()
                resultado = service("Capacity")
                If (Not resultado Is Nothing) Then
                    memoriaRam += Convert.ToDouble(resultado)
                End If
            Next
    
            Return String.Format("{0}{1}{2}", procesador, memoriaRam, disco)
    
        End Function
    

    >
    >  Private Sub FrmActivador_Load(...) Handles MyBase.Load
    >
    >        Dim cadena As String = CrearCodigoPC()
    >        Try
    >

    Si la función CrearCodigoPC puede desencadenar una excepción, ¿se puede saber por qué motivo NO ENCIERRAS la llamada a dicha función dentro del bloque Try ... Catch ... End Try? Es decir, ¿por qué no ejecutas lo siguiente?

        Private Sub FrmActivador_Load(...) Handles MyBase.Load
    
            Try
              Dim cadena As String = CrearCodigoPC()
    

    De ésta manera, si se produce una excepción, el código de ejecución pasará al bloque Catch, donde se leerá el mensaje de error producido.

    > Te adjunto una imagen con las propiedas del servicio, como se puede ver esta iniciado

    Si el servicio puede estar iniciado; lo que hace falta es que la información no esté corrompida. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    martes, 14 de febrero de 2017 19:38
    Moderador

Todas las respuestas

  • "Federico32113" preguntó:

    > Hola, cuando trato de ejecutar mi aplicación ya instalada en otra pc me aparece este error.
    >
    > Referencia a objeto no establecida como instancia de un objeto.
    >
    > Como podría solucionar este error?

    ¡Muy sencillo! Creando una instancia nueva, o referenciando otra instancia ya existente, del objeto cuya propiedad, método, evento o campo deseas acceder o ejecutar. ;-)

    Federico, éste es el clásico error que aparece cuando queremos hacer uso de un objeto cuyo valor es Nothing, es decir, no está referenciando un objeto nuevo u otro ya existente. Si el valor es Nothing, deberías de saber que no se puede acceder a su interfaz, y de hacerlo, obtendrás una NullReferenceException con el mensaje de error indicado.

    Lo normal y habitual es que en nuestro código verifiquemos si una variable objeto tiene o no un valor Nothing ANTES de intentar utilizarla, porque si su valor es Nothing, lo único que te puede ocurrir es que obtengas el error que estás obteniendo. ;-)

    Dim variable As String
    
    If (variable Is Nothing) Then
      ' El valor es Nothing; creamos una nueva instancia de la clase
    ' String asignándole una cadena de longitud cero. variable = String.Empty End If ' Leemos el valor de la variable MessageBox.Show(variable)

    ¿Que el objeto cuyo valor es Nothing es del tipo SqlConnection, DataTable, etc.? Pues verificarías su valor de la misma manera: 

    If (objeto Is Nothing) Then
        ' El valor es Nothing; ejecutar lo que proceda
    End If
    

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    sábado, 11 de febrero de 2017 18:20
    Moderador
  • Entiendo lo que me explicas, pero no se como probarlo, es mi primer sistema "real". Te adjunto el inicio load de mi primer form.

      Using con As New SqlConnection("Data Source=(local); Initial Catalog=master; Integrated Security=SSPI")
                Dim query = "Select COUNT(Name) from sysdatabases WHERE name = N'BaseDatosComercio'"
    
                Dim cmd As New SqlCommand(query, con)
    
                con.Open()
                If CInt(cmd.ExecuteScalar()) > 0 Then

    Como podría probar SqlConnection?


    sábado, 11 de febrero de 2017 22:08
  • "Federico32113" preguntó:

    > Entiendo lo que me explicas, pero no se como probarlo, ...
    >
    > Using con As New SqlConnection("Data Source=(local); Initial Catalog=master; Integrated Security=SSPI")
    >
    > Como podría probar SqlConnection?

    El objeto SqlConnection que estás utilizando, es IMPOSIBLE que su valor sea Nothing, aunque los valores de la cadena de conexión no sean correctos (en este caso obtendrías una excepción del tipo ArgumentException, no una NullReferenceException), ya que si te fijas bien, estás creando una nueva instancia del mismo mediante el operador New, por tanto, ahí no está el problema, al igual que en el resto de las líneas de código que has publicado.

    Imagina el siguiente código:

            ' Declarar un objeto sin inicializarlo.
            Dim cnn As SqlConnection
    
            ' Verificar si el valor es Nothing.
            If (cnn Is Nothing) Then
                ' El valor es Nothing; crear una nueva instancia del objeto
                cnn = New SqlConnection()
            End If
    
            ' Llegado aquí, el valor NO ES NOTHING; asignar la cadena de conexión.
            cnn.ConnectionString = "cadena de conexión"
    

    Como te indiqué en mi primera respuesta, para comprobar si el valor de una variable de referencia (SqlConnection, DataTable, String, etc.) es Nothing, se utiliza el operador Is incluido en una instrucción If ... Then.

    Si la variable fuera de algún tipo de dato de valor (Integer, Long, Boolean, DateTime, etc.), entonces no sería necesario que verifiques si su valor es Nothing, porque estos tipos de datos son estructuras, no clases, y NUNCA su valor será Nothing, ya que todos ellos tienen asignado un valor por defecto, que en el caso de los tipos de datos numéricos sería el 0.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 12 de febrero de 2017 7:31
    Moderador
  • Puede ser que esta función que esta en el load sea la que me este causando el problema?

    Private Function CrearCodigoPC() As String
            Dim cadena As String = ""
            Dim Procesador As String = ""
            Dim busco As ManagementObjectSearcher = New ManagementObjectSearcher("Select * FROM Win32_Processor")
            For Each service As ManagementObject In busco.Get
                Procesador = service("ProcessorId").ToString
            Next
            Dim Disco As String = ""
            Dim busco3 As ManagementObjectSearcher = New ManagementObjectSearcher("Select * FROM Win32_DiskDrive")
            For Each service As ManagementObject In busco3.Get
                Disco = service("SerialNumber").ToString
            Next
            Dim MemoriaRam As Double = 0
            Dim busco2 As ManagementObjectSearcher = New ManagementObjectSearcher("Select * FROM Win32_PhysicalMemory")
            For Each service As ManagementObject In busco2.Get
                MemoriaRam = (MemoriaRam + Convert.ToDouble(service("Capacity").ToString))
            Next
            cadena = (Procesador _
                        + (MemoriaRam.ToString + Disco))
    
            ValorAEncriptar = cadena
            CodigoPC = cadena
        End Function

    Con la forma que me propones tendré que hacer esas pruebas con todo el sistema? Ten en cuenta que para probarlo tengo que instalarlo en otro PC que no sea en la que estoy desarrollando.

    No existe otra posible solución? Puede sea un problema con  los Microsoft .NET Framework?


    domingo, 12 de febrero de 2017 18:16
  • "Federico32113" preguntó:

    > Puede ser que esta función que esta en el load sea la que me este causando el problema?
    >

    La función CrearCodigoPC no creo que sea la causante de la excepción del tipo NullReferenceException que obtienes, porque la he ejecutado y no obtengo ningún error. Pero ya que la has publicado, vamos a fijarnos en las dos líneas finales de dicho procedimiento:

        Private Function CrearCodigoPC() As String

            ' Obtener distintos obetos ManagementObjectSearcher

            ValorAEncriptar = cadena
            CodigoPC = cadena

        End Function

    Otra cosa que deberías saber es que un procedimiento Function devuelve un valor, pero en el caso de tu función CrearCodigoPC DEVUELVE UN VALOR NOTHING. ¿Eso es correcto? ¿No crees que en el valor devuelto es donde puede que esté el problema?

    Si por ejemplo llamas a la función de la siguiente manera:

        Dim cadena As String = CrearCodigoPc()

        ' Obtenemos la longitud de la cadena
        Dim n As Integer = cadena.Length

    El valor de la variable cadena será Nothing, por lo que cualquier intento de acceder a los miembros de la clase String (en el ejemplo, su propiedad Length) hará que obtengas la "bonita" excepción NullReferenceException, o si lo prefieres, Referencia a objeto no establecida como instancia de un objeto.

    Si tu intención es que la función comentada devuelva la cadena construida en dicha función, tan solo tienes que devolver su valor:

        Private Function CrearCodigoPC() As String
    
            ' Obtener distintos obetos ManagementObjectSearcher
    
            ' ValorAEncriptar = cadena   --> ELIMINAR ESTA LÍNEA
            ' CodigoPC = cadena          --> ELIMINAR ESTA LÍNEA
    
            ' Devolver el valor de la cadena
            Return cadena
    
        End Function

    Y en el procedimiento donde realizas la llamada a la función CrearCodigoPC es donde asignarías el valor a los siguientes campos:

        ValorAEncriptar = CrearCodigoPC()
        CodigoPC = ValorAEncriptar

    Como observarás, tanto ValorAEncriptar como CodigoPC tendrán, en principio, el mismo valor, es decir, el valor devuelto por la función CrearCodigoPC.

    > Con la forma que me propones tendré que hacer esas pruebas con todo el sistema?

    Es que esas verificaciones (las de aquellos objetos que podemos sospechar que pueden tener un valor Nothing) se tienen que ir haciendo conforme se escribe el código y no cuando el código ya está publicado.

    > No existe otra posible solución?

    La única manera que existe en Visual Basic .NET de verificar si un objeto tiene o no un valor Nothing, es la que ya te he explicado anteriormente:

           ' Verificar si el valor es Nothing.
            If (objeto Is Nothing) Then
                ' El valor es Nothing
            End If

    > Puede sea un problema con  los Microsoft .NET Framework?

    ¿Del marco de trabajo de .NET? Más bien será un problema del código fuente que has escrito en tu propia aplicación, como por ejemplo, el permitir que un procedimiento Function devuelva un valor Nothing, como es el caso de la función CrearCodigoPC que has publicado. Eso es un error muy grave que puede dar lugar a circunstancias imprevistas si no se controla adecuadamente. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    domingo, 12 de febrero de 2017 19:31
    Moderador
  • -Ok, entiendo tendré que ponerme a revisar el código de todo el sistema entonces...

    -El error al aparecer al ejecutar el programa. ¿Quiere decir que el primer problema en el formulario de inicio?

    -Se puede verificar que no queden valores Nothing sin tener que instalar para posteriormente ejecutar y ver si tiene errores?

    -Pero la duda que me queda porque cuando lo instalo y ejecuto en la PC en la cual lo estoy desarrollando funciona bien, y cuando lo ejecuto en otra aparece el error que mostré al principio, por eso me parece que no es un problema de código.




    domingo, 12 de febrero de 2017 19:59
  • "Federico32113" preguntó:

    > -El error al aparecer al ejecutar el programa. ¿Quiere decir que el
    > primer problema en el formulario de inicio?

    Si el objeto de inicio de tu aplicación es un formulario, y dices que es ahí donde aparece el error, pues tendrías que revisar todo el código que se ejecuta al cargar el formulario para detectar el objeto que tiene el valor Nothing y que es el causante de la NullReferenceException.

    > - Se puede verificar que no queden valores Nothing sin tener que
    > instalar para posteriormente ejecutar y ver si tiene errores?

    No. Los valores Nothing o null se detectan EN TIEMPO DE EJECUCIÓN, tanto en Visual Basic, C#, o en cualquier otro lenguaje de programación que se utilice, por lo que el código de tu aplicación tendrá que estar preparado para detectar esos valores Nothing y actuar en consecuencia, porque de no hacerlo así, y de darse esa circunstancia, tu aplicación finalizará sin más, ofreciéndole al usuario de tu aplicación una pobre imagen de la misma.

    > -Pero la duda que me queda porque cuando lo instalo y ejecuto en la PC
    > en la cual lo estoy desarrollando funciona bien, y cuando lo ejecuto
    > en otra aparece el error que mostré al principio, por eso me parece
    > que no es un problema de código.

    Es un problema de tu código, te guste o no te guste, el cual NO ESTÁ PREPARADO ante cualquier adversidad que se presente en otros PCs donde se ejecute tu aplicación.

    Tu aplicación la has preparado para que funcione correctamente en tu PC, y en aquellos otros que tengan los mismos requisitos que tiene tu PC para que la misma se ejecute satisfactoriamente, y estás asumiendo que en todos los PCs se va a ejecutar igual de bien, y eso es un error de principiante, el pensar que todos los equipos tienen instalado el mismo hardware y software que disponemos en nuestros equipos: craso error.

    Imagina que estás desarrollando una aplicación que trabaja con archivos de bases de datos de Access versión 2007 o superior. Si en algún PC donde se ejecute tu aplicación no se encuentran instalados los componentes redistribuibles del motor de bases de datos de Access 2007 o 2010, ¿cómo pretendes que ese usuario pueda establecer satisfactoriamente una conexión con una base de datos de Access 2010, por poner un ejemplo? Si das por hecho que TODOS los usuarios disponen de dicho motor de datos, no es de extrañar que tu aplicación obtenga multitud de errores en aquellos PCs que no cuenten con el software adecuado para establecer una conexión con la base de datos.

    Te vuelvo a reiterar lo mismo: ante un valor devuelto por una función, tanto nuestra como de .NET Framework, donde podemos sospechar que su valor sea Nothing, tienes que verificar explícitamente dicha circunstancia, si no deseas conseguir resultados inesperados, claro está:

        Public Sub Buton1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Llamamos a la función CrearCodigoPC() 
            '
            Dim cadena As String = CrearCodigoPC()
    
            ' Como sospechamos que su valor puede ser Nothing,
            ' verificamos tal circunstancia.
            '
            If (cadena Is Nothing) Then
                ' El valor es Nothing; ejecutar lo que proceda.
                '
                MessageBox.Show(temp)
    
                ' Abandonamos el procedimiento
                Return
            End If
    
            ' Llegado aquí, se comprende que el valor devuelto
            ' por la función no es Nothing; asignar los valores
            ' a los distintos campos.
            '
            ValorAEncriptar = cadena
            CodigoPC = cadena
    
        End Sub

    Así es como entiendo que se debería de actuar ante el valor devuelto por una función donde sospechamos que su valor puede ser Nothing. Todo lo que no sea hacer esto son ganas de perder el tiempo intentando averiguar dónde se encuentra el motivo de obtener una NullReferenceException con el clásico mensaje de error Referencia a objeto no establecida como instancia de un objeto, cuando en nuestro propio PC de desarrollo no obtenemos ningún mensaje de error.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    lunes, 13 de febrero de 2017 10:42
    Moderador
  • Aplique los consejos que me diste y el inicio del load del primer formulario me quedo así. Pero me sigue dando el mismo error cuando lo ejecuto en otra PC.

      Private Sub FrmActivador_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
    
            Dim cadena As String = CrearCodigoPC()
    
            If (cadena Is Nothing) Then
                Return
            End If
    
            ValorAEncriptar = cadena
            CodigoPC = cadena
    
            Using con As New SqlConnection("Data Source=(local); Initial Catalog=master; Integrated Security=SSPI")

    -Puede ser que ocurra un error cuando ejecuto estas instrucciones que estan dentro del load. Hago el llamado a una función de una clase la cual encripta el valor.

        txtsucodigo.Text = Encrip.Encriptar(ValorAEncriptar)
        ValorBase = Encrip.Encriptar(ValorAEncriptar)
    PD: una ultima respuesta y no te molesto mas
    lunes, 13 de febrero de 2017 17:12
  • "Federico32113" escribió:

    > el inicio del load del primer formulario me quedo así. Pero me sigue
    > dando el mismo error cuando lo ejecuto en otra PC.

    Yo entiendo que por el código que se ejecuta en la función CrearCodigoPC, ésta no debería de dar error alguno. De todas maneras, prueba a ejecutar la función como indico a continuación, al menos para simplificarla y que quede un poco más claro el valor que deseas obtener de la misma:

        Private Function CrearCodigoPC() As String
    
            Dim procesador As String = String.Empty
            Dim disco As String = String.Empty
            Dim memoriaRam As Double
    
            Dim busco As New ManagementObjectSearcher("Select * FROM Win32_Processor")
            For Each service As ManagementObject In busco.Get()
                procesador = service("ProcessorId").ToString()
            Next
    
            busco = New ManagementObjectSearcher("Select * FROM Win32_DiskDrive")
            For Each service As ManagementObject In busco.Get()
                disco = service("SerialNumber").ToString()
            Next
    
            busco = New ManagementObjectSearcher("Select * FROM Win32_PhysicalMemory")
            For Each service As ManagementObject In busco.Get()
                memoriaRam += Convert.ToDouble(service("Capacity"))
            Next
    
            ' Devolver una cadena alfanumérica formateada
    ' con los distintos valores obtenidos. Return String.Format("{0}{1}{2}", procesador, memoriaRam, disco) End Function

    > -Puede ser que ocurra un error cuando ejecuto estas instrucciones que estan
    > dentro del load. Hago el llamado a una función de una clase la cual encripta
    > el valor.
    >
    >    txtsucodigo.Text = Encrip.Encriptar(ValorAEncriptar)
    >    ValorBase = Encrip.Encriptar(ValorAEncriptar)

    ¡Hombre! Adivino todavía no soy, por lo que sin conocer el código que se ejecuta en la función Encriptar, yo soy incapaz de averiguar si la misma produce o no una excepción, como bien creo que podrás comprender.

    De todas maneras, nuevamente te indico que si sospechas de que la misma puede producir un error, o devolver un valor Nothing, ya te he comentado varias veces lo que tienes que hacer.

    Vamos a encerrar entre un bloque Try ... Catch ... End Try las llamadas a las funciones CrearCodigoPC y Encriptar:

        Private Sub FrmActivador_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Try
                Dim cadena As String = CrearCodigoPC()
                If (cadena Is Nothing) Then
                    MessageBox.Show("No existe información del código del PC.")
                    Return
                End If
    
                ' Procedemos a encriptar los valores con el valor
                ' de la cadena obtenida. Como a la función
                ' Encriptar se le pasa el mismo valor, no es necesario
                ' llamarla dos veces seguidas.
                '
                ValorBase = Encrip.Encriptar(cadena)
                If (ValorBase Is Nothing) Then
                    MessageBox.Show("No se ha encriptado la información del código del PC.")
                    Return
                End If
    
                ' Se ha encriptado satisfactoriamente el valor de la cadena obtenida
                txtsucodigo.Test = ValorBase
    
            Catch ex As Exception
                ' Se ha producido una excepción, bien en la función CrearCodigoPC
                ' o en la función Encriptar; mostrar el mensaje de error.
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

     

    > PD: una ultima respuesta y no te molesto mas

    No es que me moleste responderte, pero es que ya se me están acabando las ideas para indicarte que por medio de "mensajes de correo" no se puede averiguar el motivo de que obtengas una excepción del tipo NullReferenceException, sin conocer de antemano el código fuente de tu aplicación, o al menos, todo el código que se ejecuta ANTES DE PRODUCIRSE LA EXCEPCIÓN, así como las circunstancias que se dan para que en otros PCs no funcione y en el tuyo lo haga estupendamente.

    Debes de tener en cuenta que si deseas que alguien te pueda ayudar por el medio en el que nos encontramos, deberás ser tú el que aporte toda la información necesaria sobre tu aplicación, para que los demás nos hagamos una ligera idea de lo que puede estar sucediendo, así como si los PCs donde obtienes el error cumplen con todos los requisitos que requiere tu aplicación para que ésta se ejecute satisfactoriamente. Pero si no aportas información alguna, o te limitas a decir que en tu equipo funciona perfectamente, ¿cómo pretendes que alguien te pueda ayudar sin llegar a "pegar palos de ciego"?

    > Dim busco As New ManagementObjectSearcher("Select * FROM Win32_Processor")
    >
    > busco = New ManagementObjectSearcher("Select * FROM Win32_DiskDrive")
    >
    > busco = New ManagementObjectSearcher("Select * FROM Win32_PhysicalMemory")

    Como observo que estás utilizando objetos ManagementObjectSearcher para obtener cierta información de administración para la infraestructura de Windows Management Instrumentation (WMI), y haciendo "cábalas" sobre el motivo para que en otros PCs obtengas errores, te comento que las consultas que estás realizando requieren que el sistema operativo instalado en el cliente sea Windows Vista o superior, y si hablamos de un servidor, éste requiere Windows Server 2008 o superior. Es decir, si en el PC donde obtienes un error tiene instalado Windows XP o Windows Server 2003, o algún otro sistema operativo de cliente o de servidor inferiores, no esperes que tu aplicación se ejecute en el mismo satisfactoriamente. ;-)

    Para más información, consulta los siguiente enlaces (en inglés):

    Win32_DiskDrive class

    Win32_Processor class

    Win32_PhysicalMemory class


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    lunes, 13 de febrero de 2017 18:09
    Moderador
  • Mira te muestro como me quedo pero sigue sin funcionar. Como se ve en la imagen me muestra el error en el load del primer Form.

    La función CrearCodigo la cambie por la que me brindaste.

    Lo que hacer básicamente es comprobar si existe una base de datos "X" si no existe, va al "Else".

    En la pc que estoy probando no existe esta base de datos por lo cual va directamente al "Else". Esto es lo que logre hacer:

      Dim cadena As String = CrearCodigoPC()
            Try
                If (cadena Is Nothing) Then
                    Return
                End If
              
                Using con As New SqlConnection("Data Source=(local); Initial Catalog=master; Integrated Security=SSPI")
    ...
          Else
                        Dim valorbase As String = Encrip.Encriptar(cadena)
    
                        If (valorbase Is Nothing) Then
                            MessageBox.Show("No se ha encriptado la información del código del PC.")
                            Return
                        End If
                      
                        txtsucodigo.Text = valorbase
    
                    End If
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

    Código de la clase que encripta:

     Public Function Encriptar(ByVal Input As String) As String
    
            Dim IV() As Byte = ASCIIEncoding.ASCII.GetBytes("qualityi") 'La clave debe ser de 8 caracteres
            Dim EncryptionKey() As Byte = Convert.FromBase64String("rpaSPvIvVLlrcmtzPU9/c67Gkj7yL1S5") 'No se puede alterar la cantidad de caracteres pero si la clave
            Dim buffer() As Byte = Encoding.UTF8.GetBytes(Input)
            Dim des As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider
            des.Key = EncryptionKey
            des.IV = IV
    
            Return Convert.ToBase64String(des.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length()))

    -La PC en que lo pruebo es una "PC virtual" con windows 7 la cual la creo con "Oracle VM VirtualBox". Tiene instalado el motor de base de datos SQL express 2008 r2

    -En otra parte del sistema tengo esta función. ¿Tendré el mismo problema?

    Por ejemplo en un load lo llamo de esta manera "Call cargarventas" para cargar los datos de la base en un datagridview

    Public Sub cargarventas()
            Try
                Using con As New SqlConnection(strCadenaConexion)
                    con.Open()
                    Dim query As String = "Select ... From Ventas order by ..."
                    Dim da As New SqlDataAdapter(query, con)
                    Dim dt As New DataTable
                    da.Fill(dt)
    
                    DataGridView1.DataSource = dt
    
                    End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

    Quedo a espera de la respuesta

    lunes, 13 de febrero de 2017 20:36
  • "Federico32113" escribió:

    > Como se ve en la imagen me muestra el error en el load del primer Form.
    >

    De acuerdo al rastro del error que se muestra en la imagen, éste se produce en la función CrearCodigoPC, y ahí, lo único que yo observo susceptible de producir una excepción, son las tres llamadas que efectúas a Windows Management Instrumentation (WMI), por tanto, lo primero sería preguntarte si tienes iniciado en ese Windows 7 virtual el servicio Instrumental de administración de Windows, porque si no lo tienes, pocas consultas vas a poder realizar.

    Abre los servicios de Windows, seleccionando en el menú de inicio la opción Ejecutar, y en el cuadro de texto Abrir escribe services.msc y pulsa el botón Aceptar. Busca el servicio indicado y mira a ver si está detenido o pausado:

    Y si dicho servicio está iniciado, en ejecución, y lo más importante, que éste no se encuentre dañado, lo siento muchísimo pero yo me rindo ya. :-(

    En el siguiente enlace encontrarás más información sobre el servicio de WMI:

    How to Start/Stop Windows Management Instrumentation service

    Siento que esté en inglés, pero es lo primero que me he encontrado.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    lunes, 13 de febrero de 2017 23:14
    Moderador
  • Perdona que insista pero llevo probando varias horas, te muestro el load completo.

        Private Sub FrmActivador_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            Dim cadena As String = CrearCodigoPC()
            Try
                If (cadena Is Nothing) Then
                    Return
                End If
               
                Using con As New SqlConnection("Data Source=(local); Initial Catalog=master; Integrated Security=SSPI")
                    Dim query = "Select COUNT(Name) from sysdatabases WHERE name = N'...'"
    
                    Dim cmd As New SqlCommand(query, con)
    
                    con.Open()
                    If CInt(cmd.ExecuteScalar()) > 0 Then
    
                        Using con2 As New SqlConnection(strCadenaConexion)
                            Dim query2 = "Select COUNT(*) from ... WHERE @...= ..."
    
                            Dim cmd2 As New SqlCommand(query2, con2)
                            valorbase = Encrip.Encriptar(cadena)
                            cmd2.Parameters.AddWithValue("@...", ValorBase)
                            con2.Open()
                            If CInt(cmd2.ExecuteScalar()) > 0 Then
                                LoginForm1.Show()
                                Close()
                            Else
                                                        ValorAEncriptar = cadena
                                CodigoPC = cadena
    
                                txtsucodigo.Text = Encrip.Encriptar(ValorAEncriptar)
                                End If
                        End Using
                        
                        ValorBase = Encrip.Encriptar(cadena)
    
                        If (valorbase Is Nothing) Then
                            Return
                        End If
    
                        txtsucodigo.Text = valorbase
    
                    End If
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
     Public Function Encriptar(ByVal Input As String) As String
    
            Dim IV() As Byte = ASCIIEncoding.ASCII.GetBytes("qualityi") 'La clave debe ser de 8 caracteres
            Dim EncryptionKey() As Byte = Convert.FromBase64String("rpaSPvIvVLlrcmtzPU9/c67Gkj7yL1S5") 'No se puede alterar la cantidad de caracteres pero si la clave
            Dim buffer() As Byte = Encoding.UTF8.GetBytes(Input)
            Dim des As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider
            des.Key = EncryptionKey
            des.IV = IV
    
            Return Convert.ToBase64String(des.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length()))
    
        End Function


     Private Function CrearCodigoPC() As String
    
            Dim procesador As String = String.Empty
            Dim disco As String = String.Empty
            Dim memoriaRam As Double
    
            Dim busco As New ManagementObjectSearcher("Select * FROM Win32_Processor")
            For Each service As ManagementObject In busco.Get()
                procesador = service("ProcessorId").ToString()
            Next
    
            busco = New ManagementObjectSearcher("Select * FROM Win32_DiskDrive")
            For Each service As ManagementObject In busco.Get()
                disco = service("SerialNumber").ToString()
            Next
    
            busco = New ManagementObjectSearcher("Select * FROM Win32_PhysicalMemory")
            For Each service As ManagementObject In busco.Get()
                memoriaRam += Convert.ToDouble(service("Capacity"))
            Next
    
            Return String.Format("{0}{1}{2}", procesador, memoriaRam, disco)
    
        End Function

    Cuando llamo a la función CrearCodigoPC me trae el valor y me lo asigna

    Pero me sigue dando el mismo error.


    Lo que voy a hacer ahora es tratar de ejecutar al proyecto desde el visual en la "PC virtual"


    martes, 14 de febrero de 2017 18:13
  • "Federico32113" escribió:

    > Cuando llamo a la función CrearCodigoPC me trae el valor y me lo asigna
    >
    > Pero me sigue dando el mismo error.

    Me vas a disculpar pero ya no entiendo nada. :-(

    Por un lado me dices que la función CrearCodigoPC te trae el valor, y por otro me muestras el cuadro de diálogo del error donde el rastro del mismo indica claramente que la NullReferenceException se produce precisamente en la función CrearCodigoPC. ¿A qué le hago caso? ¿A lo que tú me indicas o al cuadro de diálogo de error?

    Por cierto, en mi último mensaje de ayer te indiqué que revisaras si el servicio Instrumental de administración de Windows estaba iniciado y en ejecución, a lo cual me respondiste que lo tenías iniciado. Pero mira por donde, hace ahora más de 14 horas que has eliminado ese mensaje. ¿En qué quedamos? ¿Está o no iniciado dicho servicio? Y aunque esté iniciado, ¿está o no corrompido el Instrumental de administración de Windows?


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    martes, 14 de febrero de 2017 18:23
    Moderador
  • Lo que quiero decir es que la función CrearCodigoPC me asigna en valor que obtiene a "cadena" cuando lo ejecuto desde visual en la PC en la que lo desarrollo. Cuando lo ejecuto en la otra pc en cual lo instale me sale el cuadro de diálogo de error.

    El servicio si esta iniciado en la PC en la cual trato de ejecutarlo.

    Te adjunto una imagen con las propiedas del servicio, como se puede ver esta iniciado

    martes, 14 de febrero de 2017 18:38
  • "Federico32113" escribió:

    > Lo que quiero decir es que la función CrearCodigoPC me asigna en valor
    > que obtiene a "cadena" cuando lo ejecuto desde visual en la PC en la
    > que lo desarrollo.

    Entonces, se puede decir que el código existente en la función CrearCodigoPC es correcto. ¿De acuerdo?

    > Cuando lo ejecuto en la otra pc en cual lo instale me sale el cuadro de
    > diálogo de error.

    Lo que significa que el problema está en ese PC, no en el código existente en la función CrearCodigoPC, por lo que tendrás que averiguar los motivos por los cuales cuando ejecutas el código en dicha función NO RECUPERA LA INFORMACIÓN QUE PRECISA del Instrumental de Administración de Windows instalado en el sistema operativo del Windows 7 virtual donde ejecutas tu aplicación, que entiendo es el único objeto que puede dar lugar a una excepción.

    > procesador = service("ProcessorId").ToString()
    > disco = service("SerialNumber").ToString()
    > memoriaRam += Convert.ToDouble(service("Capacity"))

    Como estás utilizando los métodos ToString y Convert.ToDouble para convertir al tipo de dato adecuado el valor System.Object devuelto por el elemento que deseas consultar, ANTES de llamar al método ToString o Convert.ToDouble, verifica si el valor devuelto por el objeto ManagementObject es o no Nothing. Para ello, ejecuta la nueva versión de la función CrearCodigoPC:

        Private Function CrearCodigoPC() As String
    
            Dim procesador As String = String.Empty
            Dim disco As String = String.Empty
            Dim memoriaRam As Double
            Dim resultado As Object = Nothing
    
            Dim busco As New ManagementObjectSearcher("Select * FROM Win32_Processor")
            For Each service As ManagementObject In busco.Get()
                resultado = service("ProcessorId")
                If (Not resultado Is Nothing) Then
                    procesador = resultado.ToString()
                End If
            Next
    
            busco = New ManagementObjectSearcher("Select * FROM Win32_DiskDrive")
            For Each service As ManagementObject In busco.Get()
                resultado = service("SerialNumber")
                If (Not resultado Is Nothing) Then
                    disco = resultado.ToString()
                End If
            Next
    
            busco = New ManagementObjectSearcher("Select * FROM Win32_PhysicalMemory")
            For Each service As ManagementObject In busco.Get()
                resultado = service("Capacity")
                If (Not resultado Is Nothing) Then
                    memoriaRam += Convert.ToDouble(resultado)
                End If
            Next
    
            Return String.Format("{0}{1}{2}", procesador, memoriaRam, disco)
    
        End Function
    

    >
    >  Private Sub FrmActivador_Load(...) Handles MyBase.Load
    >
    >        Dim cadena As String = CrearCodigoPC()
    >        Try
    >

    Si la función CrearCodigoPC puede desencadenar una excepción, ¿se puede saber por qué motivo NO ENCIERRAS la llamada a dicha función dentro del bloque Try ... Catch ... End Try? Es decir, ¿por qué no ejecutas lo siguiente?

        Private Sub FrmActivador_Load(...) Handles MyBase.Load
    
            Try
              Dim cadena As String = CrearCodigoPC()
    

    De ésta manera, si se produce una excepción, el código de ejecución pasará al bloque Catch, donde se leerá el mensaje de error producido.

    > Te adjunto una imagen con las propiedas del servicio, como se puede ver esta iniciado

    Si el servicio puede estar iniciado; lo que hace falta es que la información no esté corrompida. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    martes, 14 de febrero de 2017 19:38
    Moderador
  • Estuve realizando varias pruebas, una que hice fue ejecutar el archivo .exe de mi aplicación en la PC la cual lo quiero instalar y me funciono, evidentemente estaba haciendo mal el instalador.

    Ahora voy a intentar de hacer el instalador para que me funcione como me funciono ejecutando únicamente el .exe.

    ¿Algún link que explique la mejor forma o mas optima para hacer el instalador?

    miércoles, 15 de febrero de 2017 2:28