2017-05-10 2 views
0

Je charge dynamiquement des dlls opencv à l'aide de LoadLibrary. L'opération échoue fréquemment lors de l'exécution du code, mais elle réussit lors de l'exécution du code.Echec de LoadLibrary avec le code 126 sauf lors de l'exécution du code

Voici comment j'importer les dll

[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; 

est le code ici utilisé pour charger les dll.

// 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 

J'ai essayé de mettre un Thread.Sleep(1000); avant chaque ligne, ce qui ne permet pas. Si je casse, et que je renverse LoadLibrary(p);, il réussit à chaque fois. Il semble ne faire aucune différence combien de temps j'attends avant de franchir la ligne.

Si cela compte, je charge 45 dlls opencv. Quand je répète la boucle automatique, elle charge les 12 premiers de la liste, puis les 6 suivants, puis elle ne se chargera plus sur aucun des suivants (27 restants). Cela semble être cohérent. Cependant, si je passe le code à ce stade, fichier par fichier, je suis capable de charger tout le reste. J'utilise Windows 7 64 bits et mon application cible x86.

Est-ce que quelqu'un a une idée de ce qui se passe et comment y remédier?

Répondre

0

J'ai ajouté un Thread.Sleep(50) pour chaque itération (dll), et un Application.DoEvents() avant chaque appel d'API comme celui-ci

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

et maintenant les dll sont tous chargés après quelques passages à travers constamment.

L'opération complète prend juste un peu plus longtemps que je le voudrais.