2017-11-17 2 views
0

Ich habe 2 Programme, die ein Projekt teilen, in dem eine API DLL verwendet wird, um Aktionen für Dateien in einem anderen Verzeichnis auszuführen. Das Problem, das ich habe, ist, dass dieser Code in einem Projekt arbeitet, aber in dem anderes es nicht:Warum funktioniert dieser explizit verknüpfte DLL-Delegat in einem Programm, aber nicht in einem anderen Programm?

moduleHandle = LoadLibrary(“api.dll”) 

Früher, das Programm, das hier an die API-DLL verbinden, so nach dem Vergleich der Process Monitor Protokollen fehlgeschlagen fehl von beiden kopierte ich einige DLLs in das gleiche Verzeichnis wie es. Es ist dann gelungen, und die Werte von modulehandle sind jetzt in beiden Programmen gleich. Next:

methodPointer = GetProcAddress(moduleHandle, "NameOfSomeFunction") 
delegateForSomeFunction = Marshal.GetDelegateForFunctionPointer(methodPointer, GetType(SomeFunctionType)) 

Wenn wir zum delegateForSomeFunction bekommen, kann ich sehen, dass der Wert von _methodPtr in ihnen von einem Programm zum anderen unterscheidet. Dann, wenn wir den Delegierten aufrufen:

In einem Programm schlägt dies einfach still. Ich bin etwas verloren, was das weitere Vorgehen angeht. Was soll ich tun, um dies weiter zu untersuchen und wie kann ich es zum Laufen bringen?

Ich laufe dies auf Debug in Visual Studio 2013 und das Projekt ist in .NET 4.

Antwort

0

Kopieren Obwohl die richtigen Versionen von Abhängigkeiten von winsxs in das gleiche Verzeichnis des API-DLL mich zuließ zu Führen Sie LoadLibrary ohne offensichtliche Fehler durch, es verursachte mehr Fehler im Hintergrund.

Das Problem war im Manifest am Ende. Es gab ein Post-Build-Ereignis, das das Manifest aus der EXE-Datei entfernt hat, um einen Bereitstellungsschritt vorzubereiten, in dem Sie verschiedene Versionen der vorhandenen API angeben konnten. Das Erstellen einer ordnungsgemäßen appname.exe.manifest-Datei, die die abhängigen Assemblys angibt, die normalerweise nicht geladen werden konnten, und das Ablegen in das gleiche Verzeichnis wie die EXE-Datei, löste das Problem.

Verwandte Themen