StartupPath von DLLs ändern

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von IP4D.

    StartupPath von DLLs ändern

    Hi,

    ich habe eine Frage und zwar habe ich ein Programm gemacht, dass zusätzliche Controls beinhaltet, die in einer DLL-Datei abgespeichert sind. Wenn ich nun das Programm auf einen anderen Rechner übertrage, muss ich auch die DLL mitliefern.
    Das Programm lässt sich also nur auf anderen Rechnern ausführen, wenn die DLL-Datei mitgeliefert wurde und im gleichen Verzeichnis wie das Programm liegt.

    Nun meine Frage: Gibt es eine Möglichkeit dem Programm zu sagen, dass er die DLL-Datei nicht von Application.StartupPath holen muss, sondern von zum Beispiel %AppData% ?

    Gruß xP
    VB2008 gibt es nicht, nur VS2008 das ist die IDE, VB(.Net) ist die Programmiersprache...
    ^ nur weil du das jetzt so genau genommen hast...
    developerfusion.com/tools/convert/csharp-to-vb
    oder auch selbst übersetzen, ist nicht schwer...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hey,

    ich hab nochmal ein bissl ausprobiert, doch irgendwie hauts nicht hin. Ich habe auch eine Seite von Microsoft gefunden, die genau dieses Thema beinhaltet, doch das wird dort etwas kompliziert erklärt. Ich stehe im Moment leider auf dem Schlauch. Kann mir jemand weiterhelfen??
    Freue mich auf Antworten

    Gruß
    Na ja, den Code habe ich von dieser Microsoft-Seite: support.microsoft.com/kb/837908
    Also:

    Im Form1_Load Event:

    VB.NET-Quellcode

    1. AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf MyResolveEventHandler


    Und eine Funktion:

    VB.NET-Quellcode

    1. Function MyResolveEventHandler(ByVal sender As Object, _
    2. ByVal args As ResolveEventArgs) As [Assembly]
    3. 'This handler is called only when the common language runtime tries to bind to the assembly and fails.
    4. 'Retrieve the list of referenced assemblies in an array of AssemblyName.
    5. Dim objExecutingAssemblies As [Assembly]
    6. objExecutingAssemblies = [Assembly].GetExecutingAssembly()
    7. Dim arrReferencedAssmbNames() As AssemblyName
    8. arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies()
    9. 'Loop through the array of referenced assembly names.
    10. Dim strAssmbName As AssemblyName
    11. For Each strAssmbName In arrReferencedAssmbNames
    12. 'Look for the assembly names that have raised the "AssemblyResolve" event.
    13. If (strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(",")) = args.Name.Substring(0, args.Name.IndexOf(","))) Then
    14. 'Build the path of the assembly from where it has to be loaded.
    15. Dim strTempAssmbPath As String
    16. strTempAssmbPath = "C:\assemblies\" & args.Name.Substring(0, args.Name.IndexOf(",")) & ".dll"
    17. Dim MyAssembly as [Assembly]
    18. 'Load the assembly from the specified path.
    19. MyAssembly = [Assembly].LoadFrom(strTempAssmbPath)
    20. 'Return the loaded assembly.
    21. Return MyAssembly
    22. End If
    23. Next
    24. End Function


    Doch irgendwie klappts nicht. Im Code unterstreicht er mir blau:
    - Function MyResolveEventHandler(ByVal sender As Object, _
    ByVal args As ResolveEventArgs) As [Assembly]

    und beim Form1_Load Event:
    - MyResolveEventHandler

    Gruß
    die Fehlermeldungen dazu wären nicht schlecht...sind blau unterstrichen ist keine Fehlerbeschreibung...
    außerdem fährst du mal mit der Maus drüber, warte bis ein mini Fenster mit ner roten Kugel und nem Ausrufezeichen erscheint, drücke darauf und guck mal was dir die IDE für Fehlerkorrekturoptionen bietet...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Habe beides gelöst. Musste System.Reflection importieren und habe die Funktion ausversehen in ein Event reingemacht.

    Nur... ich habe in meinem Programm DotNetBar benutzt. Die DLL-Datei heißt "DevComponents.DotNetBar2.dll". Aber das Programm weiß noch nicht, dass ich diese DLL-Datei meine. Glaube ich jedenfalls. Wo kann ich das im Code umstellen? Etwas kompliziert gerade für mich ^^

    Und außerdem ist End Function grün unterstrichen:"Die MyResolveEventHandler-Funktion gibt nicht für alle Codepfade einen Wert zurück. Wenn das Ergebnis verwendet wird, kann zur Laufzeit eine Nullverweisausnahme auftreten."

    For Each strAssmbName In arrReferencedAssmbNames

    Listet alle Verweise auf, nun musst du überprüfen, welches davon die "DevComponents" Assembly ist und von dieser den Pfad anpassen(der vollständige Pfad muss bei strTempAssmbPath gesetzt werden)...vorraussetzung ist natürlich, dass du die DLL bereits als Verweis hinzugefügt hast...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Muss ich bei dem Code unter "For Each strAssmbName In arrReferencedAssmbNames" also beim Code:
    "If (strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(",")) = args.Name.Substring(0, args.Name.IndexOf(","))) Then"

    den IndexOf abändern? Oder wo kann ich bestimmen welche DLL er nehmen soll?