none
Incorporar dll a mi aplicacion RRS feed

  • Pregunta

  • Buenas a todos

    Quisiera saber como puedo llamar a un archivo dll que lo he incomparado dentro de la aplicación(Agregue el archivo a los recursos del proyecto). Al compilar el proyecto, el ejecutable aumenta su tamaño pero cuando lo intento abrir en una maquina virtual me da un error. 

    De ante mano muchas gracias por sus respuestas.

    lunes, 11 de septiembre de 2017 23:40

Respuestas

  • "Quisiera saber como imprimo un ticket en vb.net" preguntó:

    > Quisiera saber como puedo llamar a un archivo dll que lo he incomparado dentro
    > de la aplicación(Agregue el archivo a los recursos del proyecto). Al compilar
    > el proyecto, el ejecutable aumenta su tamaño pero cuando lo intento abrir en
    > una maquina virtual me da un error. 

    ¿El error solamente lo arroja en una máquina virtual o en todas las máquinas donde lo has ejecutado? ¿Qué mensaje muestra el error que estás obteniendo? ¿Qué código es el que estás ejecutando?

    Todas estas respuestas las tenías que haber publicado en tu pregunta inicial, y no limitarte a escribir "... me da un error" sin más.

    > Quisiera saber si hay alguna manera de unir el ejecutable(.exe) con las
    > dependencias(.dll) en un solo archivo ejecutable(.exe)

    Tendrás que añadir el archivo de la DLL al Explorador de soluciones, tal y como muestra la siguiente captura de pantalla:


    Una vez añadido el recurso a la aplicación, selecciónalo y pulsa la tecla F4, para que se abra la Ventana de Propiedades, donde tienes que dejar sus valores como se resalta en color amarillo en la siguiente imagen:


    Pero si no deseas crear un instalador para que te instale todos los archivos que requiere tu aplicación, como te ha indicado el usuario Brayan De La Cruz, y ya que dices que has incrustado el archivo DLL en el proyecto de tu aplicación, tienes que procurar guardar el archivo al INICIO de la APLICACIÓN y ANTES que se ejecute el formulario de inicio de la misma, si es que estamos hablando de una aplicación de Windows Forms, cuestión ésta que tampoco lo has comentado en tu pregunta.

    Inserta un Module en el proyecto de tu aplicación, y copia/pega el siguiente código:

    Imports System.IO
    Imports System.Reflection
    Imports System.Text
    
    Friend Module Module1
    
        Sub Main()
    
            ' Habilitar los estilos visuales de la aplicación.
            '
            Application.EnableVisualStyles()
    
            ' Lo primero de todo hay que guardar el archivo dll en
            ' la carpeta que contiene el ejecutable de la aplicación.
            '
            If (Not GuardarDll()) Then
                MessageBox.Show("No se ha podido cargar la aplicación.")
                ' Finalizar la aplicación.
                Application.Exit()
                ' Abandonar el procedimiento.
                Return
            End If
    
            ' Se ha guardado satisfactoriamente el archivo de recursos,
            ' por lo que procedemos a abrir el formulario de inicio de
            ' la aplicación.
            '
            Application.Run(New Form1())
    
        End Sub
    
        Private Function GuardarDll() As Boolean
    
            Dim result As Boolean
            Dim by As Byte()
    
            Try
                ' Leer el contenido del archivo de recursos.
                Dim st As Stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsApp3.NombreDLL.dll")
                Dim br As New BinaryReader(st, Encoding.Default, False)
                by = br.ReadBytes(CInt(st.Length))
                br.Dispose()
                
                ' Guardar el contenido del archivo de recursos en la
                ' carpeta que contiene el ejecutable de la aplicación,
                ' sobrescribiendo cualquier archivo existente con el
                ' mismo nombre.
                '
                Dim fileName As String = Path.Combine(Application.StartupPath, "NombreDLL.dll")
                Dim fs As New FileStream(fileName, FileMode.Create, FileAccess.Write)
                If (by.Length > 0) Then
                    Dim bw As New BinaryWriter(fs, Encoding.Default, False)
                    bw.Write(by)
                    bw.Dispose()
                End If
                
                result = True
    
            Catch
                ' Evitar que se propague al código llamador cualquier
                ' excepción que se pudiera haber producido.
                result = False
    
            End Try
    
            Return result
    
        End Function
    
    End Module

    En el ejemplo se supone que tu aplicación se llama WindowsApp3, y que el archivo de recursos se denomina NombreDLL.dll, nombre éste que será el mismo que tenga el archivo resultante que se guardará en la misma carpeta que contiene el ejecutable de la aplicación. Modifica los valores que aparecen en negrita en el procedimiento de ejemplo GuardarDLL() para que se adapten a los nombres que tengas en tu proyecto.

    Y para que se ejecute en primer lugar el código fuente existente en el Module creado, abre las Propiedades del Proyecto (menú Proyecto ---> Propiedades de ...) y selecciona la pestaña Aplicación. Una vez allí, deshabilita la marca de verificación que existe en la casilla Habilitar marco de trabajo de la aplicación, y selecciona en el control ComboBox titulado Objeto de inicio, el procedimiento Sub Main.

    ¡Bueno! Pues ya estás en condiciones de compilar el proyecto y probarlo. Te comento que mejor sería que ejecutaras directamente el archivo ejecutable de tu aplicación, procurando eliminar previamente de la carpeta de resultados cualquier copia del archivo *.dll que pudiera existir en ella, porque aunque el procedimiento GuardarDLL sobrescribirá cualquier archivo existente con el mismo nombre, es para que observes bien que realmente se crea de nuevo el archivo *.dll. ;-)

    Insisto en que todo lo explicado funcionará SIEMPRE Y CUANDO el método Module1.GuardarDLL se ejecute ANTES de que desde tu proyecto se referencie a cualquier objeto que se encuentre incluido en la DLL incrustada como archivo de recursos. Si por casualidad esa DLL contiene controles de usuario que has añadido a tu formulario en tiempo de diseño, entonces olvídate de todo lo que te he dicho, aunque también te digo que no he realizado ninguna prueba para observar lo que sucede, cuestión que la delego en ti. ;-)

    Parto de la premisa de que en tu proyecto tienes referenciada la DLL en tiempo de diseño, precisamente para no tener que utilizar la reflexión (el espacio de nombres System.Reflection) para cargar la DLL, referenciar y crear los objetos existentes en la misma en tiempo de ejecución.

    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.





    martes, 12 de septiembre de 2017 11:10
    Moderador
  • Hola, 

    Pero al momento en que dices que deseas tener un .exe con tus .dll en un solo .exe, entiendo que quisieras un instalador que empaquete esto, cierto?, pues entonces te toca generar el mismo. Te recomiendo descargar la siguiente extensión: Microsoft Visual Studio 2013 Installer Projects y seguir este tutorial paso a paso: Visual Studio 2013 Installer Projects. (No te preocupes si el ejemplo está con 2013 y tu tienes una versión superior, solo tocaría que busques dicha extensión para tu versión, ya que los pasos son los mismos)

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    martes, 12 de septiembre de 2017 5:56

Todas las respuestas

  • Hola:

     tienes que agregar a la referencias del proyecto:

    click derecho sobre el proyecto –> Agregar referencia –> Examinar –> busca y selecciona tu DLL –> Aceptar 

     De esa forma, se agrega de manera automática a tu proyecto la libreria


    Saludos desde Monterrey, Nuevo León, México!!!

    lunes, 11 de septiembre de 2017 23:49
  • hola

    >>Agregue el archivo a los recursos del proyecto

    como recursos, no, no eso es incorrecto

    se supone que si es una dll la debes poner en una carpeta a nivel del .sln y referencirla desde alli usando la opcion de "Add Reference" en el proyecto

    las dll no se embeben como recursos

    estamos suponiendo que es una dll creada en .net, no ?

    saluds


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 12 de septiembre de 2017 0:07
  • Gracias por tu respuesta.

    Pero eso ya lo hice y funciona bien pero cuando quiero abrir el programa en otras computadora tengo que tener todas las dll en la carpeta del programa.

    Quisiera saber si hay alguna manera de unir el ejecutable(.exe) con las dependencias(.dll) en un solo archivo ejecutable(.exe)

    Gracias de toda formas

    martes, 12 de septiembre de 2017 0:08
  • Hola:

    Quisiera saber si hay alguna manera de unir el ejecutable(.exe) con las dependencias(.dll) en un solo archivo ejecutable(.exe)

     Por su puesto, entonces tienes que usar:

    ILMerge 

     El cual te permite contener múltiples ensamblados dentro de uno solo.

     Espero te sea de utilidad.


    Saludos desde Monterrey, Nuevo León, México!!!

    • Propuesto como respuesta Jorge TurradoMVP martes, 12 de septiembre de 2017 5:07
    martes, 12 de septiembre de 2017 3:04
  • Hola, 

    Pero al momento en que dices que deseas tener un .exe con tus .dll en un solo .exe, entiendo que quisieras un instalador que empaquete esto, cierto?, pues entonces te toca generar el mismo. Te recomiendo descargar la siguiente extensión: Microsoft Visual Studio 2013 Installer Projects y seguir este tutorial paso a paso: Visual Studio 2013 Installer Projects. (No te preocupes si el ejemplo está con 2013 y tu tienes una versión superior, solo tocaría que busques dicha extensión para tu versión, ya que los pasos son los mismos)

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    martes, 12 de septiembre de 2017 5:56
  • "Quisiera saber como imprimo un ticket en vb.net" preguntó:

    > Quisiera saber como puedo llamar a un archivo dll que lo he incomparado dentro
    > de la aplicación(Agregue el archivo a los recursos del proyecto). Al compilar
    > el proyecto, el ejecutable aumenta su tamaño pero cuando lo intento abrir en
    > una maquina virtual me da un error. 

    ¿El error solamente lo arroja en una máquina virtual o en todas las máquinas donde lo has ejecutado? ¿Qué mensaje muestra el error que estás obteniendo? ¿Qué código es el que estás ejecutando?

    Todas estas respuestas las tenías que haber publicado en tu pregunta inicial, y no limitarte a escribir "... me da un error" sin más.

    > Quisiera saber si hay alguna manera de unir el ejecutable(.exe) con las
    > dependencias(.dll) en un solo archivo ejecutable(.exe)

    Tendrás que añadir el archivo de la DLL al Explorador de soluciones, tal y como muestra la siguiente captura de pantalla:


    Una vez añadido el recurso a la aplicación, selecciónalo y pulsa la tecla F4, para que se abra la Ventana de Propiedades, donde tienes que dejar sus valores como se resalta en color amarillo en la siguiente imagen:


    Pero si no deseas crear un instalador para que te instale todos los archivos que requiere tu aplicación, como te ha indicado el usuario Brayan De La Cruz, y ya que dices que has incrustado el archivo DLL en el proyecto de tu aplicación, tienes que procurar guardar el archivo al INICIO de la APLICACIÓN y ANTES que se ejecute el formulario de inicio de la misma, si es que estamos hablando de una aplicación de Windows Forms, cuestión ésta que tampoco lo has comentado en tu pregunta.

    Inserta un Module en el proyecto de tu aplicación, y copia/pega el siguiente código:

    Imports System.IO
    Imports System.Reflection
    Imports System.Text
    
    Friend Module Module1
    
        Sub Main()
    
            ' Habilitar los estilos visuales de la aplicación.
            '
            Application.EnableVisualStyles()
    
            ' Lo primero de todo hay que guardar el archivo dll en
            ' la carpeta que contiene el ejecutable de la aplicación.
            '
            If (Not GuardarDll()) Then
                MessageBox.Show("No se ha podido cargar la aplicación.")
                ' Finalizar la aplicación.
                Application.Exit()
                ' Abandonar el procedimiento.
                Return
            End If
    
            ' Se ha guardado satisfactoriamente el archivo de recursos,
            ' por lo que procedemos a abrir el formulario de inicio de
            ' la aplicación.
            '
            Application.Run(New Form1())
    
        End Sub
    
        Private Function GuardarDll() As Boolean
    
            Dim result As Boolean
            Dim by As Byte()
    
            Try
                ' Leer el contenido del archivo de recursos.
                Dim st As Stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsApp3.NombreDLL.dll")
                Dim br As New BinaryReader(st, Encoding.Default, False)
                by = br.ReadBytes(CInt(st.Length))
                br.Dispose()
                
                ' Guardar el contenido del archivo de recursos en la
                ' carpeta que contiene el ejecutable de la aplicación,
                ' sobrescribiendo cualquier archivo existente con el
                ' mismo nombre.
                '
                Dim fileName As String = Path.Combine(Application.StartupPath, "NombreDLL.dll")
                Dim fs As New FileStream(fileName, FileMode.Create, FileAccess.Write)
                If (by.Length > 0) Then
                    Dim bw As New BinaryWriter(fs, Encoding.Default, False)
                    bw.Write(by)
                    bw.Dispose()
                End If
                
                result = True
    
            Catch
                ' Evitar que se propague al código llamador cualquier
                ' excepción que se pudiera haber producido.
                result = False
    
            End Try
    
            Return result
    
        End Function
    
    End Module

    En el ejemplo se supone que tu aplicación se llama WindowsApp3, y que el archivo de recursos se denomina NombreDLL.dll, nombre éste que será el mismo que tenga el archivo resultante que se guardará en la misma carpeta que contiene el ejecutable de la aplicación. Modifica los valores que aparecen en negrita en el procedimiento de ejemplo GuardarDLL() para que se adapten a los nombres que tengas en tu proyecto.

    Y para que se ejecute en primer lugar el código fuente existente en el Module creado, abre las Propiedades del Proyecto (menú Proyecto ---> Propiedades de ...) y selecciona la pestaña Aplicación. Una vez allí, deshabilita la marca de verificación que existe en la casilla Habilitar marco de trabajo de la aplicación, y selecciona en el control ComboBox titulado Objeto de inicio, el procedimiento Sub Main.

    ¡Bueno! Pues ya estás en condiciones de compilar el proyecto y probarlo. Te comento que mejor sería que ejecutaras directamente el archivo ejecutable de tu aplicación, procurando eliminar previamente de la carpeta de resultados cualquier copia del archivo *.dll que pudiera existir en ella, porque aunque el procedimiento GuardarDLL sobrescribirá cualquier archivo existente con el mismo nombre, es para que observes bien que realmente se crea de nuevo el archivo *.dll. ;-)

    Insisto en que todo lo explicado funcionará SIEMPRE Y CUANDO el método Module1.GuardarDLL se ejecute ANTES de que desde tu proyecto se referencie a cualquier objeto que se encuentre incluido en la DLL incrustada como archivo de recursos. Si por casualidad esa DLL contiene controles de usuario que has añadido a tu formulario en tiempo de diseño, entonces olvídate de todo lo que te he dicho, aunque también te digo que no he realizado ninguna prueba para observar lo que sucede, cuestión que la delego en ti. ;-)

    Parto de la premisa de que en tu proyecto tienes referenciada la DLL en tiempo de diseño, precisamente para no tener que utilizar la reflexión (el espacio de nombres System.Reflection) para cargar la DLL, referenciar y crear los objetos existentes en la misma en tiempo de ejecución.

    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.





    martes, 12 de septiembre de 2017 11:10
    Moderador