2013-08-12 5 views
5

Ich habe diese Ausnahme für die letzte Woche verfolgt.Wie finde ich die Quelle eines "Eine von 'xxx.dll' importierte Prozedur konnte nicht geladen werden." Ausnahme?

Situation ist:

Ich habe eine Anwendung, die in C# und gebaut in Visual Studio 2010. Die Anwendung eine DLL enthält, die eine Hülle aus einer nicht verwalteten Code-Bibliothek ist geschrieben wird. Der nicht verwaltete Code wird in C++ geschrieben und in Visual Studio 2008 erstellt. Dies ist erforderlich, da der Code auf zusätzliche Bibliotheken (Qt) verweist und dieser Code WinCE Version 5 zum Ziel hat (aufgrund der im Feld unterstützten Geräte).

Ich habe viele der Vorschläge ausprobiert, die ich hier gesehen habe, einschließlich der Verwendung verschiedener Abhängigkeitswanderer (VS 2008 hängt ab, dependency_walker und andere Tools wie Reflector und Process Monitor von SysInternals).

Alle Werkzeuge zeigen entweder keine Probleme (Reflector) oder alte Abhängigkeiten, die in meiner Umgebung veraltet sind (Win 7) wie DCOMP.DLL, GPSVC.DLL, & IESHIMS.DLL.

Im Debugger kann ich meinen Code durchgehen, bis ich ein Objekt instanziiere, das auf meine Managed Wrapper DLL verweist. Es tritt nicht in die Instanziierung des Objekts ein, sondern löst die Ausnahme sofort aus.

In Process Explorer (von SysInternals) kann ich die Managed DLL geladen, zusammen mit den erforderlichen Hilfs DLLs. In Process Monitor (von SysInternals) an der Stelle des Problems gibt es keine Stapel von nicht gefundenen Nachrichten. Es scheitert einfach.

Irgendwelche Ideen oder Gedanken, dieses Problem zu finden, würde geschätzt werden.

+1

Sie verwenden eine Qt-Version für CE auf einem Desktop-Computer? Suchen Sie nicht weiter :) Google "loader snaps", wenn Sie eine Diagnose möchten. –

+0

Eigentlich nein. Wir erstellen Qt in Windows- und Windows CE-Versionen neu. Aber der Code, der ausgeführt wird, ist in jedem gleich. – user1542042

+0

Ich würde Probleme beim Laden verwalteter und nicht verwalteter Teile zuerst trennen. Konvertieren Sie Ihren Wrapper in einen Stub und versuchen Sie ihn zu laden. Laden Sie Ihre C++ - DLL in den nativen Prozess und prüfen Sie, ob dies funktioniert oder nicht. Es könnte sehr hilfreich sein, Teile Ihres Wrappers zu veröffentlichen. –

Antwort

2

@Hans Passat - Vielen Dank für den Hinweis auf Global Flags.

Here ist ein ausgezeichneter Blog-Beitrag über die Verwendung der Tools. Das Programm gflags.exe, auf das die meisten Google-Verweise auf "Loader-Stacks anzeigen" verweisen, ist Teil des Windows-Gerätetreiber-Entwicklungskits (WinDDK) und verwaltet die in diesem Post erwähnten Registrierungseinstellungen für Sie.

Die Ausgabe von "Show Loader Stacks" zeigte, dass ein Symbol, das in meiner nicht verwalteten DLL sein sollte, nicht in der DLL war, die ich verwendete.

Es stellt sich heraus, dass ich die falsche Version der DLL erstellt habe. Dies lag an meinem schlechten Verständnis des Build-Prozesses (zu viele Versionen zu viele verschiedene Arten gebaut).