【问题标题】:What are the possible causes for this DLL load error in C#?C# 中此 DLL 加载错误的可能原因是什么?
【发布时间】:2014-07-29 10:51:47
【问题描述】:

我需要接管别人的 C# 代码,但我以前从未使用过 C#,并且对 Visual Studio 的经验很少。该代码无法加载某些 DLL。它看起来像这样;

            hModule = LoadLibrary("XXX.dll");

            if (hModule == IntPtr.Zero)
            {
                MessageBox.Show("Load failed.", "Error");
                return;
            }

导致DLL加载失败的可能原因有哪些?如果是路径问题,我已将 DLL 放置在与可执行文件相同的位置。我是否需要为此 dll 手动添加一些引用(使用 Visual Studio 2012)?还是dll有问题?如果是,如何验证?

我知道这个问题不适合 Stack Overflow,因为它太开放了。但提出的一些可能性可以为我指明正确的方向。我想在 Stackoverflow 成员关闭这个问题或多次否决它之前要求一些回旋余地。谢谢。

编辑:在尝试了 Hans Passant 的答案后,我收到了错误 %1 is not a valid Win32 application。这是否意味着 DLL 有问题?同一个 DLL 可以与 Visual C++ 代码库一起使用,但不能与 C# 代码一起使用。我还注意到代码中有一些静态库 .lib。但是如果我没记错的话,C# 不接受静态库。

【问题讨论】:

  • 包含错误消息,以便人们可以为您指明正确的方向。
  • 您为什么使用 LoadLibrary 而不是标准做法 (pInvoke)?
  • 代码加载一些DLL失败你的意思是你可以加载一些但不是全部?
  • 你为什么不简单地尝试一下...抓住它,看看它为什么会失败?
  • “导致 DLL 加载失败的可能原因有哪些?” - 有时间我们迭代整个 MSDN 库吗?请包括实际错误。

标签: c# visual-studio dll


【解决方案1】:

pinvoke 代码中经常缺少正确的错误检查和报告。您必须自己处理它,不再有友好的 .NET 异常来避免麻烦。出发点是让 pinvoke 声明正确:

[DllImport("kernel32", SetLastError=true, CharSet = CharSet.Auto)]
static extern IntPtr LoadLibrary(string lpFileName);

使用 SetLastError 属性对获取 pinvoke 编组器以获取 Windows 错误代码至关重要。然后报告它,以便清楚为什么无法加载 DLL:

IntPtr hModule = LoadLibrary(path);
if (hModule == IntPtr.Zero) throw new System.ComponentModel.Win32Exception();

到目前为止,“找不到文件”是最常见的事故。不仅适用于该 DLL,也适用于任何相关的 DLL。您只能通过启用加载程序快照或使用 SysInternals 的 Process Monitor 实用程序轻松查看。

【讨论】:

  • 谢谢。我收到以下错误%1 is not a valid Win32 application。这是否意味着dll有问题?相同的 dll 可以与 Visual C++ 代码一起使用。但在 C# 上,它不起作用。
  • 也许吧。更有可能是您的 C# 项目有问题,运行在错误的位数上。 64 位进程无法加载 32 位 DLL 或其他方式。使用 Project + Properties,Build 选项卡并在您的 EXE 项目上强制 Platform 目标。
【解决方案2】:

这是来自文档:

如果字符串指定了完整路径,则函数只搜索 模块的路径。如果字符串指定相对路径或 没有路径的模块名称,该函数使用标准搜索 找到模块的策略;有关详细信息,请参阅备注。如果 函数找不到模块,函数失败。什么时候 指定路径,请务必使用反斜杠 (),而不是正斜杠 (/)。有关路径的更多信息,请参阅命名文件或目录。

也看这里: 返回值

如果函数成功,返回值是模块的句柄。 如果函数失败,则返回值为 NULL。获得扩展错误 信息,请致电GetLastError

更多信息在这里: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx

【讨论】:

    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2013-06-25
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多