Laden...

Wie kann ich aus C# eine DLL benutzen, die in C++ erstellt wurde?

Erstellt von Günther Weber vor 3 Jahren Letzter Beitrag vor 3 Jahren 646 Views
G
Günther Weber Themenstarter:in
28 Beiträge seit 2010
vor 3 Jahren
Wie kann ich aus C# eine DLL benutzen, die in C++ erstellt wurde?

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

5.658 Beiträge seit 2006
vor 3 Jahren

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

G
Günther Weber Themenstarter:in
28 Beiträge seit 2010
vor 3 Jahren

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.

G
Günther Weber Themenstarter:in
28 Beiträge seit 2010
vor 3 Jahren

Evtl. fehlt das entsprechende C++ Redistributable Package.

Sorry, das hatte ich überlesen.

Jetzt habe ich es installiert, aber das Problem besteht immer noch.

16.827 Beiträge seit 2008
vor 3 Jahren

Der Dependency Walker listet alles auf, was versucht wird zu laden.
Daher muss es zwingend in dessen Output irgendwo aufgelistet sein.

4.938 Beiträge seit 2008
vor 3 Jahren

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).

G
Günther Weber Themenstarter:in
28 Beiträge seit 2010
vor 3 Jahren

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.

G
Günther Weber Themenstarter:in
28 Beiträge seit 2010
vor 3 Jahren

irgendwie hat er das zweite Bild nicht angenommen und dann habe ich warten müssen

16.827 Beiträge seit 2008
vor 3 Jahren

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

G
Günther Weber Themenstarter:in
28 Beiträge seit 2010
vor 3 Jahren

Aber zum Download gibt es da nur die Dependencies_x64_Release, das komplette Projekt wollte ich mir nicht antun.

16.827 Beiträge seit 2008
vor 3 Jahren

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 😃

G
Günther Weber Themenstarter:in
28 Beiträge seit 2010
vor 3 Jahren

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):

4.938 Beiträge seit 2008
vor 3 Jahren

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.

G
Günther Weber Themenstarter:in
28 Beiträge seit 2010
vor 3 Jahren

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.

16.827 Beiträge seit 2008
vor 3 Jahren

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.