【问题标题】:LoadLibrary failing with code 126 except when stepping through the codeLoadLibrary 失败,代码为 126,除非单步执行代码
【发布时间】:2017-10-09 17:01:03
【问题描述】:

我正在使用 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。

有谁知道为什么会发生这种情况,以及如何解决它?

【问题讨论】:

    标签: c# opencv dll loadlibrary


    【解决方案1】:

    我为每次迭代 (dll) 添加了一个 Thread.Sleep(50),并在每次这样的 API 调用之前添加了一个 Application.DoEvents()

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

    现在 dll 在经过几次一致通过后全部加载。

    整个操作比我想的要长一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-12
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多