【问题标题】:DllNotFoundException From C# but not VB.NETDllNotFoundException 来自 C# 但不是 VB.NET
【发布时间】:2014-06-18 08:12:21
【问题描述】:

我有一个第三方 DLL 可以与他们的应用程序集成。它是一个 32 位 C++ DLL,不会通过 COM 公开自身,而且我没有提供源代码或头文件。

在 WinForms 示例中提供了有效的 VB.NET 示例代码。只要可执行文件从与 API DLL 和 API 接口的应用程序相同的目录中运行,就可以工作。

我使用的是示例函数声明:

Declare Ansi Function GetVersion Lib "ThirdPartyAPI.dll" () As Integer

但是,我们将使用来自 C# 库的 API 调用以用于网站或 Web 服务,因此我将示例 VB 代码转换为

[DllImport("ThirdPartyAPI.dll", SetLastError = true, CharSet = CharSet.Ansi)]
public static extern int GetVersion();

如果我从 C# 库中调用它,我会收到错误

Unhandled Exception: System.DllNotFoundException: Unable to load DLL
'ThirdPartyAPI.dll': A dynamic link library (DLL) initialization
routine failed. (Exception from HRESULT: 0x8007045A)

我采取了另一种方法,将示例中的原始工作 VB 代码放入它自己的 VB.NET DLL 中,并通过 C# 调用它。我得到了同样的错误。奇怪的是,从 VB.NET 控制台应用程序调用 VB.NET DLL 是有效的。

总结:

  • 一个简单的 VB.NET 控制台应用程序就可以工作
  • 一个简单的 VB.NET WinForms 应用程序就可以工作
  • 一个简单的 VB.NET 控制台应用程序可以通过 VB.NET DLL 调用 GetVersion
  • 简单的 C# 控制台应用程序无法通过 VB.NET DLL 调用 GetVersion
  • 简单的 C# 控制台应用程序无法直接调用 GetVersion。 这可能与错误定义函数调用有关。在 这个阶段,我不太担心这个。
  • 32 位编译无法解决问题
  • 我已经在 Server 2008 R2 和 Windows 7 Enterprise 上尝试过这个

我通过 NT 服务创建了一个 WCF 主机来公开这些功能,希望这可以解决文件位置和依赖关系。这是用 VB.NET 编写的,与 ThirdPartyApi.dll 放在同一文件夹中。

  • NT 服务中的任何代码都不能访问 GetVersion
  • WCF 服务中的任何代码都不能访问 GetVersion

请注意,在上述所有情况下,可执行文件与 ThirdPartyApi.dll 位于同一目录中。它的所有依赖项也都存在于此目录中。

谁能解释这种行为,或建议如何在 C# 网站中工作?

谢谢

【问题讨论】:

  • 你为什么使用SetLastError = true?你为什么用CharSet.Ansi
  • 我不确定 SetLastError = true,但 VB 示例代码将调用定义为 Declare Ansi Function GetVersion Lib "ThirdPartyAPI.dll" () As Integer,并且该代码有效。
  • 该函数没有文本参数,因此字符集无关

标签: c# c++ vb.net pinvoke dllnotfoundexception


【解决方案1】:

错误代码是0x8007045A。这是一个映射到 Win32 错误代码ERROR_DLL_INIT_FAILED 的 COM 错误代码。其描述为:

动态链接库 (DLL) 初始化例程失败。

这意味着找到了您的 DLL,尽管可能具有误导性的异常类 DllNotFoundException。但是,DLL 无法加载。您无法从系统中获得更多信息。 DLL 没有报告加载失败原因的机制。我建议您联系 DLL 的供应商并寻求支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2013-09-10
    相关资源
    最近更新 更多