Fehler beim einfügen einer DLL



  • Hallo liebe gemeinde,

    komme aus der C / C++ gemeinde und habe jetzt ein C# Projekt auf meinem Schreib-
    tisch wieder gefunden. 😞 Nach einem ersten einblick bleibe ich bei dem Statement das ich die Konzepte nicht mag 🤡
    Zum Thema das Projekt ist unsere Anwendungssoftware und dementsprechend umfangreich. Beim Kompilieren erscheint jetzt nach einem Splash screen die Fehlermeldung:

    Die DLL "BlaBla.DLL": Das angegebene Modul wurde nicht gefunden.
    (Ausnahme von HRESULT:0x8007007E) kann nicht geladen werden.

    Die Meldung scheint nicht unbekannt sein und weißt anscheinend auf einen absoluten Pfad im Quelltext? Ist das so korekt?

    Jetzt habe ich den Quelltext verfolgt aber nirgendwo einen Pfad zu der genannten BlaBla.dll gefunde.

    Meine frage jetzt was kann man da tun?
    Gibt es eine Suche über das komplette Projekt (MS Visual C# 2010 Express)?
    oder was kann man sonst tun?
    Als verweis kann ich die *.DLL nicht einbinden?

    Gruß
    assaziel



  • assaziel schrieb:

    komme aus der C / C++ gemeinde und habe jetzt ein C# Projekt auf meinem Schreibtisch wieder gefunden. 😞 Nach einem ersten einblick bleibe ich bei dem Statement das ich die Konzepte nicht mag 🤡

    Dein Problem liegt aber nicht in den Konzepten von C#, sondern in der Unwissenheit bzgl. grundlegenden Windows-Konzepten.

    assaziel schrieb:

    Die DLL "BlaBla.DLL": Das angegebene Modul wurde nicht gefunden.
    (Ausnahme von HRESULT:0x8007007E) kann nicht geladen werden.

    Die Meldung scheint nicht unbekannt sein und weißt anscheinend auf einen absoluten Pfad im Quelltext? Ist das so korekt?

    Jetzt habe ich den Quelltext verfolgt aber nirgendwo einen Pfad zu der genannten BlaBla.dll gefunde.

    Windows verwendet zur Lokalisierung von DLLs mehrere Suchalgorithmen dessen Arbeitsweise sich abhängig von der statischen oder dynamischen Einbindung beträchlich unterscheiden können.

    assaziel schrieb:

    Beim Kompilieren erscheint jetzt nach einem Splash screen die Fehlermeldung

    Was denn jetzt? "Beim Kompilieren" spricht eher für statisches linken, während "Nach einem Splash-Screen" nur dynamisches linken bedeuten kann.
    Die wenigen Informationen mit derart widersprüchlichen Aussagen machen es uns quasi unmöglich dir einen gescheiten Lösungsvorschlag zu geben.

    assaziel schrieb:

    Meine frage jetzt was kann man da tun?
    Gibt es eine Suche über das komplette Projekt (MS Visual C# 2010 Express)?
    oder was kann man sonst tun?

    Mehr Informationen zur Verfügung stellen, das Verzeichnis deiner ausführbaren Datei gründlich durchsuchen, den Quellcode rund um deinen "Splash-Screen" nach dem Namen der DLL untersuchen, oder es gar nicht erst dazu kommen lassen und das Laden einer DLL immer mit einer angemessenden Fehlerbehandlung versehen.



  • Danke Roggenbrot
    für deine wirklich netten Worte, da fühlt man sich doch gleich richtig heimisch. Da fragt man sich ob man dann wirklich Antworten muss wenn man eigentlich nichts sagen kann...

    gruß assaziel



  • Nunja, ich fand seine Antwort nicht wirklich unhöflich, und er hat doch einige sinnvolle Tipps gegeben?
    Du scheinst Begriffe falsch zu verwenden was uns das Verständnis erschwert, entsprechend ist es schwerer sinnvolle Hilfestellung zu geben.

    Ich gehe jetzt einfach mal davon aus dass du eine unmanaged DLL zu nutzen versuchst. Diese wird normalerweise über ein Statement wie

    [DllImport("BlaBla.DLL")]
    

    eingebunden.
    In diesem Fall ist es ein relativer Pfad, die DLL muss also (z.B.) im Anwendungsverzeichnis/Arbeitsverzeichnis liegen. Wenn der Pfad absolut ist, muss die DLL halt in diesen Pfad liegen. 😉
    Also sicherstellen dass die DLL an dem Ort liegt an dem sie verlangt wird, dann kann sie geladen werden. 🙂



  • Gut.. Danke für die Antwort genau das meine ich auch in erfahrung gebracht zu haben. Die .dll Datei befindet sich im Pfad und ich finde keine Zeile wo das ein binden [DLLImport ...] erledigt wird. Was kein wunder ist bei 10k an Zeilen.

    Deswegen würde ich gerne Wissen ob es eine suche über das gesamte Projekt gibt?

    Was auch merkwürdig ist wenn ich die .dll in den Windows Ordner\System32 kopiere ändert sich die Fehlermeldung: Es wurde versucht eine Datei mit einem falschen Format zu laden. (Ausnahme von HRESULT: 0x8007000B)



  • assaziel schrieb:

    Deswegen würde ich gerne Wissen ob es eine suche über das gesamte Projekt gibt?

    Such doch mit einem Programm deiner Wahl nach "BlaBla" oder "BlaBla.dll"? Eigentliche sollte eine gute IDE auch eine Suche über alle Sourcefiles zulassen, VisualStudio kann das beispielsweise. Es geht aber auch ein Programm wie Notepad++. 😉

    assaziel schrieb:

    Was auch merkwürdig ist wenn ich die .dll in den Windows Ordner\System32 kopiere ändert sich die Fehlermeldung: Es wurde versucht eine Datei mit einem falschen Format zu laden. (Ausnahme von HRESULT: 0x8007000B)

    Eerstens: Hast du versucht die DLL in den selben Ordner wie die Exe zu legen? Ich bin mir fast sicher dass das geht wenn er sie in System32 findet...
    Zweitens: Deine DLL ist 32Bit und dein C# Program 64Bit - oder andersrum. 😉
    Stell in C# in den Projekteigenschaften (Rechtsklick aufs Projekt und dann "Eigenschaften) unter dem Tab "Erstellen" die Zielplatform auf x86 bzw. x64 um. Mehr dazu hier.



  • Wenn BlaBla.DLL eine .NET DLL ist, dann reicht es nicht dass sie im Suchpfad liegt. Sie muss dann entweder einen sog. "strong name" haben und im sog. "global assembly cache" registriert sein. Oder sie muss im selben Verzeichnis wie die .exe liegen.

    Und wenn BlaBla.DLL eine ganz normale Windows DLL ist, dann sollte sie auch im Suchpfad gefunden werden. Dann muss es aber irgendwo einen DllImport auf diese DLL geben. Der auch in einem Projekt mit > 10.000 Zeilen schnell gefunden sein sollte - Find in Files auf "Entire Solution" nach "BlaBla.DLL" => fertig.

    assaziel schrieb:

    Was auch merkwürdig ist wenn ich die .dll in den Windows Ordner\System32 kopiere ändert sich die Fehlermeldung: Es wurde versucht eine Datei mit einem falschen Format zu laden. (Ausnahme von HRESULT: 0x8007000B)

    Vielleicht hast du auch einfach ein Problem mit 32 vs. 64 Bit? Wenn BlaBla.DLL eine ganz normale Windows DLL ist, dann muss diese zur "bittigkeit" des Prozesses passen. Du kannst nämlich keine 32 Bit DLL in einen 64 Bit Prozess laden und keine 64 Bit DLL in einen 32 Bit Prozess.

    Probier einfach mal dein C# Projekt explizit jeweils 1x für 32 und 1x für 64 Bit zu übersetzen.



  • Danke an DarkShado44 und auch dir hustbaer,
    auf einem 32bit system mit der dll im System32 ordner lässt sich das Projekt jetzt ausführen ohne Laufzeitfehler.


Log in to reply