Assembly mit parametern laden,starten und abrufen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von WeLoveBurgers.

    Assembly mit parametern laden,starten und abrufen

    Hey
    Ich hab im internet so ein schönes snippet gefunden welches mir ermöglicht ein assembly in einer byte array zu laden und zu starten.
    Nun währ meine frage wie ich es machen muss dass das zielassembly den parameter den ich angebe auch annimmt.
    Könnte mir jmd ein beispiel zur verfügung stellen mit einer msgbox? :D
    Leider sinds nicht die startup parameter :/
    Das snippet:

    VB.NET-Quellcode

    1. Public Sub DoExecute(ByVal d As Byte())
    2. Try
    3. If d(&H3C) = &H80 Then
    4. Dim asm As Assembly = Assembly.Load(d)
    5. Dim entryPoint As MethodInfo = asm.EntryPoint
    6. Dim o As Object() = Nothing
    7. If entryPoint.GetParameters().Length > 0 Then
    8. o = New Object() {New String() {"1"}}
    9. End If
    10. entryPoint.Invoke(Nothing, o)
    11. Application.Exit()
    12. End If
    13. Catch
    14. End Try
    15. End Sub

    Danke und mfg
    Wer Rechtschreibfehler findet darf sie behalten :)

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

    ErfinderDesRades schrieb:

    welchen
    Datentyp erwartet der EntryPoint der Anwendung?

    String würd ich mal sagen, wenn ich wüsste wo die main ist :/
    Spoiler anzeigen

    ~blaze~ schrieb:

    Hi
    vermutlich ein String-Array, wie generell bei

    VB.NET-Quellcode

    1. Public Shared Sub Main(args As String())

    Dort kannst du das auch abfragen, btw. auch über Environment.GetCommandLineArgs. Zweiteres ist wohl die allgemeine Vorgehensweise bei der Verwendung des Anwendungsframeworks.

    Viele Grüße
    ~blaze~


    1. Problem: "Environment.GetCommandLineArgs" Gibt nur den startup pfad zurück.
    2.Problem: Wo ist die Main in meiner Windows forms anwendung? Oo
    Mfg
    Wer Rechtschreibfehler findet darf sie behalten :)
    Sagte ja, bei Verwendung des Anwendungsframeworks hast du keinen Zugriff darauf. 1. sollte nicht zutreffen, wenn du es richtig gemacht hast, wüsste zumindest nicht, wieso. Die geladene Assembly sollte korrekt ausgeführt werden. Es empfiehlt sich, Assemblies über Process.Start zu starten oder zumindest in einer eigenen Anwendungsdomäne.
    Die Assembly sollte übrigens aus einer vertrauenswürdigen Quelle bezogen werden.

    Viele Grüße
    ~blaze~
    jo, dann probierma so:

    VB.NET-Quellcode

    1. Public Sub DoExecute(ByVal d As Byte())
    2. If d(&H3C) = &H80 Then
    3. Dim asm As Assembly = Assembly.Load(d)
    4. Dim entryPoint As MethodInfo = asm.EntryPoint
    5. If entryPoint.GetParameters().Length > 0 Then
    6. entryPoint.Invoke(asm, New Object() {"1"})
    7. End If
    8. Application.Exit()
    9. End If
    10. End Sub
    müsste im Zielprog dann als 2. KommandLineArg rauskommen.

    Edit: ups ja! Code korrigiert

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

    Spoiler anzeigen

    ~blaze~ schrieb:

    Sagte ja, bei Verwendung des Anwendungsframeworks hast du keinen Zugriff darauf. 1. sollte nicht zutreffen, wenn du es richtig gemacht hast, wüsste zumindest nicht, wieso. Die geladene Assembly sollte korrekt ausgeführt werden. Es empfiehlt sich, Assemblies über Process.Start zu starten oder zumindest in einer eigenen Anwendungsdomäne.
    Die Assembly sollte übrigens aus einer vertrauenswürdigen Quelle bezogen werden.

    Viele Grüße
    ~blaze~

    Das assembly wird ja richtig geladen, ich möchte nur eine variable übergeben, und das mit der absicherung kannst du mir überlassen, wird nämlich immer alles von meinem server via sha512 überprüft obs das richtige assembly ist ;)
    Process.start ist mir da als Entwickler etwas zu unsicher.

    Spoiler anzeigen

    ErfinderDesRades schrieb:

    jo, dann probierma so:

    VB.NET-Quellcode

    1. Public Sub DoExecute(ByVal d As Byte())
    2. If d(&H3C) = &H80 Then
    3. Dim asm As Assembly = Assembly.Load(d)
    4. Dim entryPoint As MethodInfo = asm.EntryPoint
    5. If entryPoint.GetParameters().Length > 0 Then
    6. entryPoint.Invoke(asm, New Object() {"1"})
    7. End If
    8. Application.Exit()
    9. End If
    10. End Sub
    müsste im Zielprog dann als 2. KommandLineArg rauskommen.

    Edit: ups ja! Code korrigiert

    Der sagt mir das beim invoke: "Zusätzliche Informationen: Das Objekt mit dem Typ "System.String" kann nicht in den Typ "System.String[]" konvertiert werden."
    Wer Rechtschreibfehler findet darf sie behalten :)

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

    @ErfinderDesRades Ja hab ich, das problem is, es gibt zu viel info aus, was zu unübersichtlich ist.

    - entryPoint {Void Main(System.String[])} System.Reflection.MethodInfo
    Heist soviel wie, dass der entryPoint die main ist und der parameter string akzeptiert. Das problem bei der sache ist, dass es bei dem zielassembly(windows forms anwendung) keine main gibt, bzw dass ich sie nicht gefunden hab.
    Hier ein paar infos die eventuel wichtig währen:
    + CustomAttributes Count = 0 System.Collections.Generic.IEnumerable(Of System.Reflection.CustomAttributeData)

    - Signature {System.Signature} System.Signature
    - Arguments {Length=1} System.RuntimeType()
    - (0) {Name = "String[]" FullName = "System.String[]"} System.RuntimeType
    Wer Rechtschreibfehler findet darf sie behalten :)
    Die Angabe der Signature bringt's halt einfach nur überhaupt nicht, in dieser Form. ;)
    Deaktiviere mal das Anwendungsframework und schreib' den Einstiegspunkt so um:

    VB.NET-Quellcode

    1. Friend NotInheritable Class Program
    2. Private Sub New()
    3. End Sub
    4. Public Shared Sub Main(args As String())
    5. Application.EnableVisualStyles()
    6. Application.SetCompatibleTextRenderingDefault(False)
    7. Application.Run(New Form1())
    8. End Sub
    9. End Class


    Oder so ähnlich... Vermutlich brauchst du StartupNextInstance eh nicht, das wäre vmtl. der einzige Grund, warum man das Anwendungsframework verwendet. In C# sieht das übrigens exakt so aus.

    Viele Grüße
    ~blaze~
    Spoiler anzeigen
    Ok, das hat mich jetzt weiter gebracht und etwas zurück geschmissen, nun kann ich zwar die erste form aufmachen aber per form.show() keine anderen mehr öffnen. :/
    + $exception {"Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Exception.InnerException. Fehler: Für die angegebene Kultur oder die neutrale Kultur konnten keine Ressourcen gefunden werden. Stellen Sie sicher, dass _tool.Mainform.resources beim Kompilieren richtig in die Assembly _tool eingebettet wurde, oder dass die erforderlichen Satellitenassemblys geladen werden können und vollständig signiert sind.."} System.Exception {System.InvalidOperationException}

    Edit: Man muss das in eine neue klasse packen :P

    Sooo vielen dank blaze und alle anderen hier für die nette hilfe ;)
    Mfg
    Wer Rechtschreibfehler findet darf sie behalten :)

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