Bytes einer Datei herunterladen und im Arbeitsspeicher ausführen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von MaxXor.

    Bytes einer Datei herunterladen und im Arbeitsspeicher ausführen

    Hallo,
    ich habe derzeit einige Probleme mit dem Ausführen einer Datei aus dem Arbeitsspeicher.
    Ich benutze folgenden Code zum herunterladen und ausführen, doch dieser scheint nicht ganz zu funktionieren.

    VB.NET-Quellcode

    1. Dim bytes As Byte()
    2. Using client As New WebClient()
    3. bytes = client.DownloadData("url")
    4. End Using
    5. Dim exeAssembly As Assembly = Assembly.Load(bytes)
    6. Dim main As MethodInfo = exeAssembly.EntryPoint
    7. main.Invoke(Nothing, New Object() {Nothing})

    Ich kann das Programm problemlos speichern mit:

    VB.NET-Quellcode

    1. File.WriteAllBytes(Application.StartupPath & "\r.exe", bytes)

    und es danach manuell ausführen, also werden die Bytes richtig runtergeladen.

    Das Problem liegt darin, dass ich das Programm aber nicht speichern will sondern direkt im Arbeitsspeicher ausführen will...
    Ich hoffe, jemand kann mir helfen. :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MaxXor“ ()

    Meinst du das Programm, welches runtergeladen wird oder das Programm, was den Code ausführt?

    //edit. Ok hab es mal mit einer Konsolenanwendung geteset, dort geht es.

    Kann man das auch für Windows-Formsanwendungen umschreiben?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MaxXor“ ()

    Dabei speichere ich die Datei aber auf der Festplatte, wenn ich die Anwendung in einer neuen Domäne starte.

    VB.NET-Quellcode

    1. ' Create an Application Domain:
    2. Dim newDomain As System.AppDomain = System.AppDomain.CreateDomain("NewApplicationDomain")
    3. ' Load and execute an assembly:
    4. newDomain.ExecuteAssembly("c:\HelloWorld.exe")
    Aber versuch auch, es zu verstehen. ;)

    VB.NET-Quellcode

    1. Dim domain As AppDomain
    2. domain = AppDomain.CreateDomain("domainname")
    3. domain.DoCallBack(Sub()
    4. Dim codebase As String = '...
    5. Dim assembly As Reflection.Assembly = Reflection.Assembly.LoadFile(codebase)
    6. Dim parameters() As Reflection.ParameterInfo = assembly.EntryPoint.GetParameters()
    7. Select Case parameters.Length
    8. Case 0
    9. assembly.EntryPoint.Invoke(Nothing, New Object() {})
    10. Exit Select
    11. Case 1
    12. If parameters(0).ParameterType Is GetType(String()) Then
    13. assembly.EntryPoint.Invoke(Nothing, New Object() {New String() {codebase}})
    14. Else
    15. Throw New NotSupportedException()
    16. End If
    17. Exit Select
    18. Case Else
    19. Throw New NotSupportedException()
    20. End Select
    21. End Sub)


    Gruß
    ~blaze~
    Danke!
    Ich werde es ausprobieren! :)


    Bei mir kommt leider dieser Fehler: "Der Typ "bla.Form1+_Closure$_1" In Assembly "bla, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ist nicht als serialisierbar gekennzeichnet."

    Edit by ~blaze~:
    Doppelpost
    -->*Beiträge zusammengefügt*

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „~blaze~“ ()

    Ja, die Assembly funktioniert ansonsten fehlerfrei.
    Vielleicht liegt es auch daran, dass ich die Zeile:

    VB.NET-Quellcode

    1. Dim assembly As Reflection.Assembly = Reflection.Assembly.Load(bytes)

    so geändert habe, dass er nur die Bytes lädt und nicht den Pfad.


    //edit

    Ja, es liegt genau an dieser Zeile... hmm schade, dabei will ich die Assembly aber nicht auf der Festplatte speichern, aber ich muss den Pfad angeben.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MaxXor“ ()