我正在使用LoadLibrary动态加载opencv dll。让代码运行时,操作会频繁失败,但是在单步执行代码时会成功。
以下是我导入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 :(得分:0)
我为每次迭代(dll)添加了Thread.Sleep(50)
,并在每次API调用之前添加了Application.DoEvents()
Thread.Sleep(50);
Application.DoEvents();
LoadLibrary(p);
Application.DoEvents();
var error = GetLastError();
现在dll在经过几次传递后全部加载。
整个操作只需要比我想要的时间长一点。