2017-05-10 2 views
0

Ich lade opencv dlls dynamisch mit LoadLibrary. Die Operation schlägt häufig fehl, wenn der Code ausgeführt wird, ist jedoch erfolgreich, wenn der Code durchlaufen wird.LoadLibrary fehlgeschlagen mit Code 126, außer beim Durchlaufen des Codes

Hier ist, wie ich die DLLs importieren

[DllImport("kernel32.dll")] 
public static extern IntPtr LoadLibrary(string dllToLoad); 
[DllImport("Kernel32.dll")] 
static extern uint SetErrorMode(uint uMode); 
[DllImport("Kernel32.dll")] 
static extern uint GetLastError(); 

const uint SEM_FAILCRITICALERRORS = 0x0001; 

Hier ist der Code verwendet, um die DLLs zu laden.

// called once 
SetErrorMode(SEM_FAILCRITICALERRORS); 

// called for each dll string name in a loop 
var p = Path.Combine(opencvDirectory, filename); 
LoadLibrary(p); 
var error = GetLastError(); 
// repeat with next file 

Ich habe versucht, eine Thread.Sleep(1000); vor jeder Zeile setzen, die nicht hilft. Wenn ich weitergebe und über LoadLibrary(p); gehe, ist es jedes Mal erfolgreich. Es scheint keinen Unterschied zu machen, wie lange ich warte, bevor ich über die Linie gehe.

Wenn es darauf ankommt, lade ich 45 opencv dlls. Wenn ich die automatische Schleife wiederhole, lädt sie die ersten 12 in der Liste, dann die nächsten 6, dann wird sie bei einem nachfolgenden Lauf nicht mehr geladen (27 übrig). Dies scheint konsistent zu sein. Wenn ich jedoch an dieser Stelle über den Code gehe, Datei für Datei, kann ich den Rest laden.

Ich verwende 64 Bit Windows 7, und meine Anwendung zielt auf x86.

Hat jemand eine Idee, warum dies passiert und wie man es beheben kann?

Antwort

0

I gegeben, um eine Thread.Sleep(50) für jede Iteration (DLL) und einem Application.DoEvents() vor jedem Aufruf dieser API wie

Thread.Sleep(50); 
Application.DoEvents(); 
LoadLibrary(p); 
Application.DoEvents(); 
var error = GetLastError(); 

und nun die DLLs durchgängig alle geladenen nach wenigen Durchgänge.

Die gesamte Operation dauert nur ein wenig länger als ich möchte.

Verwandte Themen