2017-05-10 15 views
0

LoadLibraryを使用して動的にopencv dllをロードしています。コードを実行すると頻繁に操作は失敗しますが、コードをステップ実行すると成功します。ここでコードをステップ実行するときを除いて、コード126でLoadLibraryが失敗する

は、私がここでの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; 

をインポートする方法である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 

私は助けにならない各行、前Thread.Sleep(1000);を入れて試してみました。私が壊れて、LoadLibrary(p);を踏むと、毎回成功します。それは私がラインを踏み出す前にどのくらいの時間待っても違いはないようです。

重要な場合は、45個のopencv dllをロードしています。自動ループを繰り返すと、最初の12がリストにロードされ、次に6がロードされ、それ以降の実行ではロードされません(残りの27個)。これは一貫しているようです。しかし、この時点でファイルごとにコードをステップ実行すれば、残りのすべてをロードすることができます。

私は64ビットWindows 7を実行しており、私のアプリケーションはx86をターゲットにしています。

これがなぜ起こるのか、それを修正する方法を知っている人はいますか?

答えて

0

私はこの

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

、今のDLLがすべて一貫して、数回通過した後にロードされているように、各API呼び出しの前に、各反復(DLL)のためThread.Sleep(50)、およびApplication.DoEvents()を追加しました。

全体の操作にはちょっとだけ時間がかかります。

関連する問題