Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Eleкtro en 23 Noviembre 2012, 15:43 PM

Título: (SOLUCIONADO) Adjuntar DLL dentro del Executable?
Publicado por: Eleкtro en 23 Noviembre 2012, 15:43 PM
Estoy siguiendo estos pasos:


CitarAdd the desired assembly (stdlib.dll) to the project's resources.
   Go to the Resources tab of the Project Properties and choose Add Resource > Add Existing File...
   Switch to the Application tab and click on the View Application Events button.

   Add this code to the ApplicationEvents.vb code that opens.

Código (vbnet) [Seleccionar]
   Private Sub AppStart(ByVal sender As Object,
     ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
       AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf ResolveAssemblies
   End Sub

   Private Function ResolveAssemblies(sender As Object, e As System.ResolveEventArgs) As Reflection.Assembly
       Dim desiredAssembly = New Reflection.AssemblyName(e.Name)

       If desiredAssembly.Name = "the name of your assembly" Then
           Return Reflection.Assembly.Load(My.Resources.STDLIB) 'replace with your assembly's resource name
       Else
           Return Nothing
       End If
   End Function

   Now compile your project and you'll have the dependent assembly incorporated into the output as a single file.

El problema es que lo he hecho todo, pero me da error el "applicationEvents.vb"

Error 1 Statement is not valid in a namespace. C:\Users\Administrador\Desktop\WindowsApplication19 - copia - copia\ApplicationEvents.vb 1 1 WindowsApplication19


Mi ApplicationEvents estaba vacío al abrirlo, no se si ese puede ser el error, quizás me falta algo, solo tengo esto :

Código (vbnet) [Seleccionar]
Private Sub AppStart(ByVal sender As Object,
 ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
   AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf ResolveAssemblies
End Sub

Private Function ResolveAssemblies(sender As Object, e As System.ResolveEventArgs) As Reflection.Assembly
   Dim desiredAssembly = New Reflection.AssemblyName(e.Name)

   If desiredAssembly.Name = "Ookii.Dialogs.dll" Then
       Return Reflection.Assembly.Load(My.Resources.Ookii.Dialogs) 'replace with your assembly's resource name
   Else
       Return Nothing
   End If
End Function
Título: Re: Adjuntar DLL dentro del Executable?
Publicado por: seba123neo en 23 Noviembre 2012, 15:49 PM
esta pregunta la hice hace unos años:

[Solucionado] Cargar DLL a memoria (http://foro.elhacker.net/net/solucionado_cargar_dll_a_memoria-t304923.0.html)

ahi tenes como hacerlo.

por ejemplo yo uso un control de grilla (que es una dll), antes tenia que llevar la dll con el exe, pero ahora con eso va el .exe solo, ya que la dll esta adentro del proyecto como recurso embebido y se carga a memoria al ejecutarse.

saludos.
Título: Re: Adjuntar DLL dentro del Executable?
Publicado por: Eleкtro en 23 Noviembre 2012, 16:01 PM
Gracias Seba, he copiado tu solución en mi form, pero no anda, he tenido que eliminar estas líneas en el form load:
Código (vbnet) [Seleccionar]
       Dim i As New ClassLibrary1.Class1
       Call i.Saludo()
       i = Nothing

(me daba error en la primera, porque no tengo definida "class1")

Pero la dll no se adjunta.


Cita de: seba123neoobviamente antes hay que agregar la dll como "nuevo elemento existente" y ponerle en las opciones de compilación como "recurso embebido".

Lo primero te refieres a agregar la DLL a "Resources"? Eso ya lo hice
y las opciones de compilación, ¿Donde encuentro eso?

EDITO: "Propiedades > compile"? que hago ahora allí?

Un saludo!
Título: Re: Adjuntar DLL dentro del Executable?
Publicado por: seba123neo en 23 Noviembre 2012, 16:16 PM

compilas y probas llevar el .exe a una carpeta vacia, de esa manera si llevas el .exe compilado a una carpeta vacia, cuando ejecutes el .exe va a querer buscar esa dll en el directorio, pero como no lo va a encontrar, se va a ejecutar ese evento del modulo y lo va a cargar desde el recurso.
Título: Re: Adjuntar DLL dentro del Executable?
Publicado por: Eleкtro en 23 Noviembre 2012, 16:29 PM
Cita de: seba123neo en 23 Noviembre 2012, 16:16 PM
1. colocas ese codigo del ultimo post del link que te pase, en un modulo comun (no de clase)
2. y tenes que especificarle que tu proyecto comienze desde el Sub_Main y no desde el Load del formulario.

Hice todo lo que me dijiste, me quedé en ese punto, no se hacerlo  :(

1. lo del módulo común es es el módulo agregado desde "agregar > nuevo módulo"?

2. ¿Me podrías indicar en que form debo cambiar eso? osea...en que línea está eso que tengo que cambiar?

saludos!
Título: Re: Adjuntar DLL dentro del Executable?
Publicado por: seba123neo en 23 Noviembre 2012, 16:53 PM
si, agrega un modulo comun y pone esto tal cual:

Código (vbnet) [Seleccionar]
Imports System.IO
Imports System.Reflection

Module Module1
    Sub Main()
        AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf CargarLibreriaMemoria

        Application.EnableVisualStyles()
        Application.Run(Form1) ' aca pone el nombre del formulario de inicio tuyo
    End Sub

    Private Function CargarLibreriaMemoria(ByVal sender As Object, ByVal args As ResolveEventArgs) As Assembly

        Dim vNombre As String = args.Name.Substring(0, args.Name.IndexOf(","))

        Dim vStream As Stream = Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsApplication1." & vNombre & ".dll")
        Dim vBuffer As Byte() = New Byte(vStream.Length - 1) {}

        vStream.Read(vBuffer, 0, vBuffer.Length)

        Dim vLibreria As Assembly = Assembly.Load(vBuffer)

        Return vLibreria
    End Function
End Module


luego vas a las propiedades del proyecto (menu proyecto-propiedades del proyecto xxxxxx), le deshabilitas el check que dice "Habilitar marco de trabajo de la aplicacion" y de esa forma en el combo que dice "Formulario de inicio" te va a aparecer la opcion Sub_Main, la seleccionas y listo.
Título: Re: Adjuntar DLL dentro del Executable?
Publicado por: Eleкtro en 23 Noviembre 2012, 17:01 PM
Pues he seguido tus pasos , pero al intentar compilar me dice:
Error   1   'Sub Main' is declared more than once in 'PlayLists': PlayLists.Module2.Main(), PlayLists.Module1.Main()   WindowsApplication19
Título: Re: Adjuntar DLL dentro del Executable?
Publicado por: seba123neo en 23 Noviembre 2012, 17:10 PM
ahi te dice que debes tener otro sub main en otro modulo, debes tener solo 1.
Título: Re: Adjuntar DLL dentro del Executable?
Publicado por: Eleкtro en 23 Noviembre 2012, 17:18 PM
ok gracias, eso lo sabía, lo que no sabía era que hacer con el otro sub_main xD, he borrado el otro módulo, no tenía mucha importancia.

Ahora ya he completado tus pasos, pero mi app sigue necesitando la dll!


me dijiste que copiase esto tál cual:

Código (vbnet) [Seleccionar]
 Dim vStream As Stream = Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsApplication1." & vNombre & ".dll")

¿Seguro que no debo poner el nombre de mi recurso ahí?


EDITO:

(http://img38.imageshack.us/img38/7430/prtscrcapture4wg.jpg)

(http://img838.imageshack.us/img838/6374/prtscrcapture2b.jpg)

(http://img837.imageshack.us/img837/8357/prtscrcaptureuc.jpg)
Título: Re: Adjuntar DLL dentro del Executable?
Publicado por: seba123neo en 23 Noviembre 2012, 18:10 PM
Me olvide decir que tenes que cambiar en el codigo donde dice windowsapplication1 por el nombre de tu proyecto.
Título: Re: Adjuntar DLL dentro del Executable?
Publicado por: Eleкtro en 23 Noviembre 2012, 18:11 PM
Cita de: seba123neo en 23 Noviembre 2012, 18:10 PM
Me olvide decir que tenes que cambiar en el codigo donde dice windowsapplication1 por el nombre de tu proyecto.

lo hice, puse "windowsapplication19", pero nada :(


EDITO: He encontrado la solución más fácil del mundo, seguro que a ti también te servirá para la próxima vez Seba123Neo, aunque tu sabes hacer estas cosas hard-codeando  ;-)

http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx

http://ilmergegui.codeplex.com/

(http://img685.imageshack.us/img685/251/prtscrcapturegv.jpg)


Saludos!!!
Título: Re: Adjuntar DLL dentro del Executable?
Publicado por: spiritdead en 23 Noviembre 2012, 19:41 PM
Cita de: EleKtro H@cker en 23 Noviembre 2012, 18:11 PM
lo hice, puse "windowsapplication19", pero nada :(


EDITO: He encontrado la solución más fácil del mundo, seguro que a ti también te servirá para la próxima vez Seba123Neo, aunque tu sabes hacer estas cosas hard-codeando  ;-)

http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx

http://ilmergegui.codeplex.com/

(http://img685.imageshack.us/img685/251/prtscrcapturegv.jpg)


Saludos!!!

que intentas crear ;) xD

soy veterano pero flojo :(
Título: Re: (SOLUCIONADO) Adjuntar DLL dentro del Executable?
Publicado por: seba123neo en 23 Noviembre 2012, 19:41 PM
espera que debe ser una boludes, no desesperes, hace esto, escribi este codigo en un boton o en cualquier lado:

Código (vbnet) [Seleccionar]
        For Each asm As Assembly In AppDomain.CurrentDomain.GetAssemblies()
            Debug.Writeline asm.FullName.Substring(0, asm.FullName.IndexOf(","))
        Next


y pasame la salida de la ventana de inmediato por favor.
Título: Re: (SOLUCIONADO) Adjuntar DLL dentro del Executable?
Publicado por: spiritdead en 23 Noviembre 2012, 19:44 PM
Cita de: seba123neo en 23 Noviembre 2012, 19:41 PM
espera que debe ser una boludes, no desesperes, hace esto, escribi este codigo en un boton o en cualquier lado:

Código (vbnet) [Seleccionar]
        For Each asm As Assembly In AppDomain.CurrentDomain.GetAssemblies()
            Debug.Writeline asm.FullName.Substring(0, asm.FullName.IndexOf(","))
        Next


y pasame la salida de la ventana de inmediato por favor.

pero si ahi lo q andas haciendo es obtener un texto a partir del nombre del assem...

claro usando foreach
Título: Re: (SOLUCIONADO) Adjuntar DLL dentro del Executable?
Publicado por: seba123neo en 23 Noviembre 2012, 19:51 PM
Cita de: spiritdead en 23 Noviembre 2012, 19:44 PM
pero si ahi lo q andas haciendo es obtener un texto a partir del nombre del assem...

claro usando foreach

antes de que use esa aplicacion IL-Merge, que si bien es buena, pero esta bueno hacerlo sin necesidad de nada, quiero que ponga ese texto en un boton y me diga el string que le escribe en la ventana de inmedianto, de esa forma voy a saber el path real de los assemblies dentro de la aplicacion, debe ser por eso que no le anda.

Título: Re: (SOLUCIONADO) Adjuntar DLL dentro del Executable?
Publicado por: spiritdead en 23 Noviembre 2012, 20:01 PM
Cita de: seba123neo en 23 Noviembre 2012, 19:51 PM
antes de que use esa aplicacion IL-Merge, que si bien es buena, pero esta bueno hacerlo sin necesidad de nada, quiero que ponga ese texto en un boton y me diga el string que le escribe en la ventana de inmedianto, de esa forma voy a saber el path real de los assemblies dentro de la aplicacion, debe ser por eso que no le anda.



le diria q agarrara 1 dia y se pusiera con el debugger a darle, q con eso saca el 95% de los errores almenos facil
Título: Re: (SOLUCIONADO) Adjuntar DLL dentro del Executable?
Publicado por: Eleкtro en 23 Noviembre 2012, 20:07 PM
Cita de: debugger'PlayLists.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
mscorlib
Microsoft.VisualStudio.HostingProcess.Utilities
System.Windows.Forms
System.Drawing
System
Microsoft.VisualStudio.HostingProcess.Utilities.Sync
Microsoft.VisualStudio.Debugger.Runtime
vshost
System.Data
System.Core
System.Deployment
System.Design
System.DirectoryServices
System.Security
System.Xml
System.Xml.Linq
System.Data.DataSetExtensions
Microsoft.VisualBasic
PlayLists
Ookii.Dialogs
The program '[236] PlayLists.vshost.exe: Program Trace' has exited with code 0 (0x0).
The program '[236] PlayLists.vshost.exe: Managed (v4.0.30319)' has exited with code -1 (0xffffffff).
Título: Re: (SOLUCIONADO) Adjuntar DLL dentro del Executable?
Publicado por: seba123neo en 23 Noviembre 2012, 21:01 PM
ok, ahi veo la captura que pusiste, te falto poner la carpeta Resources  >:D, o sea el path total hay que poner, en tu caso la linea del codigo quedaria asi:

Código (vbnet) [Seleccionar]
Dim vStream As Stream = Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsApplication19.Resources." & vNombre & ".dll")

ahi te tiene que andar.



Título: Re: (SOLUCIONADO) Adjuntar DLL dentro del Executable?
Publicado por: Eleкtro en 23 Noviembre 2012, 21:40 PM
Cita de: seba123neo en 23 Noviembre 2012, 21:01 PM
Código (vbnet) [Seleccionar]
Dim vStream As Stream = Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsApplication19.Resources." & vNombre & ".dll")

ahi te tiene que andar.


ahora sí  :xD GRACIAS