Probleme beim dynamischen einbinden von dll's

  • VB.NET
  • .NET (FX) 4.0

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von Rattenfänger.

    Probleme beim dynamischen einbinden von dll's

    Hallo liebe Gemeinde,

    ich habe ein kleines bzw. größeres problem beim dynamischen einbinden von dlls's.
    Hierzu habe ich diesen code genutzt!

    VB.NET-Quellcode

    1. Dim t As Type
    2. Dim Assembly As System.Reflection.Assembly =
    3. System.Reflection.Assembly.LoadFile("c:\WindowsApp2.dll")
    4. t = Assembly.GetType("WindowsApp2.Form1")
    5. Dim obj As New Object
    6. obj = Activator.CreateInstance(t)
    7. t.GetMethod("startclass").Invoke(obj, Nothing)
    8. Assembly = Nothing
    9. t = Nothing
    10. obj = Nothing


    Grundlegend hat es funktioniert! hier habe ich es bei 2 unterschiedlichen dll's getestet. Jedoch gibt es probleme bei den aufgerufenen Klassenbibliotheken.

    Hier wird bei den 2 bibliotheken auf ein und die dieselbe bibliothek verwiesen( gleicher pfad alles gleich). Nur die eine kann den Verweis aufrufen und die andere hat probleme beim laden des verweises. woran kann das liegen.

    Gruß
    Bilder
    • vb-paradies.PNG

      21,98 kB, 1.343×588, 320 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Rattenfänger“ ()

    @Rattenfänger Was ist denn der Unterschied zwischen DLL1 und DLL2?
    x85 / x64 / AnyCPU?
    Framework? <=> die aufgerufene DLL darf kein höheres Framework haben als die rufende Assembly.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dll1 hat noch verweise auf andere dll's. mehr nicht. zumindest bin ich der Meinung. sehe den wald vor lauter bäumen nicht. und brauche ein paar grundlegende ideen :-). Die genaue Fehlermeldung kann ich am Montag senden. Jedoch wird irgend etwas anders sein und ich weiß leider nicht was! Bei beiden habe ich den Verweis aus dem Projekt heraus gemacht. Bei beiden habe ich erst auf eine klassen verwiesen und danach auf eine form. jedoch muss ich dazu sagen. das das windows kurioser weise meine berechtigungen auf dem server löscht, obwohl ich der besitzer der dateien bin(in anderen ordnern).

    edit: das mit dem Net framework habe ich beachtet alle Net 4.0! Alle sind auf Any CPU eingestellt(bzw. werde ich nochmal prüfen)!

    edit2: Aber wenn ich dll1 direkt einbinde funktioniert diese!? Das macht mich ja so stutzig!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Rattenfänger“ ()

    @Rattenfänger Was hindert Dich daran, die DLLs gleich ins Projekt einzubinden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Rattenfänger dann statte Deine DLLs mit einem Passwort- oder Administrator-Recht-Erfordernis aus, dass nur die Admins dies kennen und dürfen.
    Oder
    Gib nur den Admins diese DLL als Datei, die dann bei Programmstart im Dateipfad liegen muss und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany es ist etwas komplexer.Jeder muss auf ddl1 und dll2 zugriff haben. in diesem projekt kann ich es direkt einbinden, jedoch habe ich eine Idee dieses Tool zu verallgemeinern, welches jedem CAD-Admin die arbeit erleichert und hier ist ein dynamisches einbinden sehr wichtig!!! Dieses aktuelle Projekt dient nur zur machbarkeit und fehleranalyse und ich verstehe einfach nicht warum ein und dieselbe verwiesene dll3 nicht geladen werden kann. Ich werde es mal Morgen mit einem anderen Account testen evtl. liegt es einfach an meinem account. Wie oben schonmal angedeutet habe ich diverse probs mit zugriffsrechten auf dem server.

    Danke nochmal

    @RodFromGermany
    @Rattenfänger OK.
    Probiere das mal auf eine andere Weise, nutze ein PlugIn-System, da werden auch nur die DLLs verwendet, die vorhanden sind.
    Framework 2: Wie erstelle ich ein PlugIn System unter VB.NET (Framework 2)
    Framework 4: codeproject.com/Articles/24340…ribute-CompositionContain
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Rattenfänger schrieb:

    kann es das sein?
    Das Registrieren ist bestenfalls für das automatische Finden dieser DLL erforderlich, wenn Du eine DLLs "von Hand" lädtst, können sie stehen wo immer sie wollen, sofern ein Pfad zu ihnen existiert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ok, dann werde ich dll3 auch dynamisch einbinden. Evtl. gibt es da mit probleme. wenn alles nichts hilft teste ich die beiden links :-). Werde auf jedenfall die lösung posten, wenn ich etwas finde :-).

    Gruß
    So konnte nun den fehler einschränken. Jedoch keine lösung. Habe versucht in dll1 , in appconfig auf den pfad der dll zu verweisen, funktioniert aber nicht :-(.

    LOG: DisplayName = MwPDMApi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=98c76569fc32d01a(Fully-specified)LOG: Appbase = file:///C:/Program Files/SolidWorks 2011/SolidWorks/LOG: Ursprünglicher PrivatePath = NULLAufruf von Assembly : (Unknown).===LOG: Diese Bindung startet im default-Load-Kontext.LOG: Es wurde keine Anwendungskonfigurationsdatei gefunden.LOG: Die Hostkonfigurationsdatei wird verwendet:LOG: Die Computerkonfigurationsdatei von C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config wird verwendet.LOG: Verweis nach der Richtlinie: MwPDMApi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=98c76569fc32d01aLOG: Download von neuem URL file:///C:/Program Files/SolidWorks 2011/SolidWorks/MwPDMApi.DLL.LOG: Download von neuem URL file:///C:/Program Files/SolidWorks 2011/SolidWorks/MwPDMApi/MwPDMApi.DLL.LOG: Download von neuem URL file:///C:/Program Files/SolidWorks 2011/SolidWorks/MwPDMApi.EXE.LOG: Download von neuem URL file:///C:/Program Files/SolidWorks 2011/SolidWorks/MwPDMApi/MwPDMApi.EXE.
    @Rattenfänger Probier doch einfach mal, alle die DLLs als Verweis einzubinden, mach dafür ein kleines Testprojekt.
    Wenn das geht, solltze es auch dynamisch gehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hatte ich ja und da hat's funktioniert. Nur nicht beim dynamischen einbinden. er bekommt den Pfad nicht von dll1 oder dll2(da liegt die MwPDMapi). sondern die der auszuführenden *.exe ,also lokal. ich müsste jetzt in dll1 bzw. dll2, eine pfad angeben können wo dll3 liegt. Nur nimmt er die appconfig von dll1 und dll2 nicht.

    Rattenfänger schrieb:

    eine pfad angeben können wo dll3 liegt.
    Probier mal, im Hauptprogtramm DLL2 dynamisch zu laden, indem Du da eine Klasse instanziierst, so dass sie bereits geladen ist, wenn DLL1 drauf zugreift.
    Danach kannst Du die Instanz wieder löschen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Rattenfänger schrieb:

    Nur nimmt er die appconfig von dll1 und dll2 nicht.


    Meines Wissens nach wird immer die app.config vom ausgeführten Progrmm genommen. Also kann er gar nicht die app.config von der dll nehmen.
    Ich würde die Pfade (nur zum Testen) erstmal Hard coded schreiben und sehen obs mal überhaupt funzt.
    Wenn ja, dann sehen wie ich die Pfade dynamisch bekomme. (xml, txt usw.)

    Immer, aber auch immer wenn man sich nicht sicher ist wo ein Fehler liegen könnte dann stets alle möglichen Fehlerquellen ausschließen, und das geht am besten so.
    Je weniger Fehlerquellen du hast desto einfacher findest du diesen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo
    ​Wie in deinem ersten Post:

    VB.NET-Quellcode

    1. Dim Assembly As System.Reflection.Assembly =
    2. System.Reflection.Assembly.LoadFile("c:\WindowsApp2.dll")


    ​Aber.... wie wäre es wenn du uns ein Beispiel hochladen würdest (ohne bin bzw. Packages Ordner Ordner). Vielleicht findet hier jemand den Fehler den du nicht findest.

    Grüße
    ​Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    das liegt nicht an mir sondern am Kunden. Jedoch möchte ich das später in mein Projekt einbinden, da kann ich das mal hochladen. Erstmal danke für den code. das ist ja der selbe wie beim Dynamischen einbinden(also soweit verstanden).

    vorgehensweise mit verweis:

    VB.NET-Quellcode

    1. Imports SolidWorks.Interop.sldworks
    2. Public Class Form1
    3. Public Sub starttest()
    4. Dim swapp As SldWorks
    5. 'hier habe ich dann zugriff auf den objektkatalog der eingebundenen dll
    6. End Sub


    VB.NET-Quellcode

    1. Imports SolidWorks.Interop.sldworks 'verweis
    2. imports System.Reflection.Assembly
    3. Public Class Form1
    4. Dim assembly As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("F:\Neuer Ordner\SolidWorks.Interop.sldworks.dll")
    5. 'nur wie die assembly in diesem bsp. zum verweis bringen? Möchte ungern ohne Objektkatalog arbeiten ist sehr unsauber und erschwerrt die API programmierung
    6. Public Sub starttest()
    7. Dim swapp As SldWorks
    8. Dim swmodel as sldworks.Modeldoc2
    9. swmodel = swapp.activedoc
    10. End Sub

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Rattenfänger“ ()

    Stell mal was ein. Ich hab sowas noch nicht gemacht, weis es also nicht auswendig.
    ​Lade mal hoch, ich oder andere werden sicher eine Lösung finden, schau aber das es verständlich ist WAS du machen willst, und was du erreichen willst.

    ​Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##