Hallo, ich soll in einem C# WPF Programm eine externe DLL nutzen die in C++ erstellt wurde.
Sieht zunächst aus wie ein Anfängerfehler:
Fehlermeldung:
Die DLL "xxx.dll": Das angegebene Modul wurde nicht gefunden.
(Ausnahme von HRESULT: 0x8007007E)
kann nicht geladen werden.
Die DLL greift auf weitere DLLs und andere Dateien zu, alles befindet sich im aktuellen Vezeichnis,
also im Debug-Ordner meines Projekts.
Bei der Recherche bin ich auf den Hinweis gestoßen, dass das Plattformziel nicht übereinstimmen könnte.
Also hab ich mal x64 eingestellt und bekomme diese Meldung:
Fehlermeldung:
Es wurde versucht, eine Datei mit einem falschen Format zu laden.
(Ausnahme von HRESULT: 0x8007000B)
Von "Nicht gefunden" kann also eigentlich keine Rede sein. Oder...
Mein Verdacht: Es wird eine weitere Datei benötigt die ich nicht bekommen habe und die auch nicht in der Dokumentation aufgeführt wird.
Wie kann man so einem Problem auf die Schliche kommen?
Oder, was könnte noch die Ursache sein?
Danke - Günther
Zuerst könntest du in der Exception (bzw. deren InnerException) schauen, ob du weitere Infos dazu findest.
Dann könntest du Tools wie DependencyWalker oder dumpbin verwenden, um dir alle Abhängigkeiten anzeigen zu lassen. Evtl. fehlt das entsprechende C++ Redistributable Package.
Weeks of programming can save you hours of planning
Der Tipp mit DependencyWalker war gut. Danke dafür.
Das Tool listet etliche fehlende DLLs auf, zum Beispiel API-MS-WIN-CORE-COM-L1-1-0.DLL. Alle diese DLLs werden von den wichtigen Windows DLLs wie zum Beispiel OLE32.DLL oder GDI32.DLL erwartet.
Einen Lösungsvorschlag der auf meinen Fall zutreffen könnte, habe ich nicht gefunden. Vielleicht habe ich mit meinen bescheidenen Englischkenntnissen auch etwas übersehen. Mein Rechner ist 2 1/2 Jahre alt, da war nie etwas anderes drauf als Windows 10 64bit.
Evtl. fehlt das entsprechende C++ Redistributable Package.
Sorry, das hatte ich überlesen.
Jetzt habe ich es installiert, aber das Problem besteht immer noch.
Der Dependency Walker listet alles auf, was versucht wird zu laden.
Daher muss es zwingend in dessen Output irgendwo aufgelistet sein.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Der Original "Dependency Walker" ist schon etwas out-dated (die [meisten] gelben Warnungen und selbst einige rote Delayed-DLL Fehler kannst du ignorieren).
Verwende besser die Neuentwicklung Dependencies - An open-source modern Dependency Walker (achte auf 32 bzw. 64bit-Version beim Download).
Und es gibt verschiedene C++ Redistributable Packages (je nach VS-Version) - du mußt schon die passende Version herunterladen (wenn es denn als fehlende Datei "msvcrX.dll" angezeigt wird).
Ansonsten zeige mal einen Screenshot mit den Fehlern (bzw. als Text).
Dependencies_x64_Release bringt eine andere Sicht auf das Problem. Siehe Anlage.
Die beiden ersten DLLs sind im Prinzip vorhanden, aber es fehlt das D im Dateinamen. Einfach umbenennen ist sicher eine schlechte Idee, oder?
C++ Redistributable Packages hatte ich die Version für VS2015,2017 und 2019 installiert. Zuerst die x64, weil es nicht besser wurde dann auch noch die x86 Variante.
x64 / x86: Es ist mir nicht wirklich klar ob damit mein Betriebssystem oder die Version der zu untersuchenden DLL gemeint ist.
irgendwie hat er das zweite Bild nicht angenommen und dann habe ich warten müssen
x64 / x86: Es ist mir nicht wirklich klar ob damit mein Betriebssystem oder die Version der zu untersuchenden DLL gemeint ist.
Immer die DLL, zumindest die Fehlermeldung. Die DLLs selbst können natürlich eine Abhängigkeit auf die jeweiligen System-DLLs haben; danach muss sich dann auch Deine Software richten. Aber das ist individuell.
Das Betriebssystem interessiert das nicht.
Mir ist nicht klar was gesucht wird und was nicht gefunden wird, aber mit anderem Char da liegt.
Wenn Du MSVCP100.DLL meinst, dann gehört die laut Google (Google-Suche nach msvcr100.dll) zu Visual C++ **2010 **Runtime
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Aber zum Download gibt es da nur die Dependencies_x64_Release, das komplette Projekt wollte ich mir nicht antun.
Können wir leider nicht ändern 😉
Bezweifle aber, dass 2010 nur als x64 released wurde.
Edit: erster Google Treffer zu: Visual C++ 2010 Redistributable Package (x86)
https://www.microsoft.com/de-de/download/details.aspx?id=5555
War nicht so schwer 😃
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
War nicht so schwer 😃
Ich meinte ja eher den Hinweis von TH69, der im Zusammenhang mit Dependencies genannt wurde.
Der hatte mich stark verunsichert.
Visual C++ 2010 Redistributable Package (x86):
Unter Dependencies/Releases gibt es doch verschiedene Versionen.
Und Release-DLLs sollten (bzw. dürfen laut MS Lizenz) niemals Debug-DLLs der C++ Runtime verwenden (wie z.B. "mfc100uD.dll" und "msvcr100D.dll").
Da solltest du nochmal schauen, ob es nicht eine wirkliche Release-Version der externen DLL gibt (bzw. den Hersteller anschreiben). Mit der "msvrc100.dll" (also ohne "D") als Referenz ist dann das "MS VC++ 2010 Redistributable" die passende Laufzeitumgebung.
Oh mann, ist das eine Zeitverschwendung für ein Problem das keiner haben will...
Ich bewundere euch für eure Geduld mit mir. Danke dafür.
Die x86 Version von Dependencies zeigt im Prinzip dasselbe an.
Auf meinem alten PC habe ich noch VS2010 installiert. Funktionieren tut es da aber auch nicht. Aber von dort habe ich mir die beiden DLLs aus dem SysWOW64-Ordner in mein Projekt gezogen. Bei der MSVCR100D.dll hat es sogar geholfen. Das Problem besteht aber weiterhin. Ich werde mal anfragen lassen ob wir andere Dateien bekommen können.
Nur weil Du VS 2010 installiert hast heisst das nicht, dass Du auch die Redistributables installiert hast...
Das sind zwei paar Stiefel auch wenn der Name was anderes suggeriert.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code