DllNotFoundException来自c#,但不来自VB.NET

本文关键字:VB NET 来自 DllNotFoundException | 更新日期: 2023-09-27 18:09:18

我有一个第三方DLL与他们的应用程序集成。它是一个32位的c++ DLL,不通过COM暴露自己,我没有提供源代码或头文件。

它是与工作VB一起提供的。. NET示例代码中的WinForms示例。只要可执行文件在与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 DLL从VB。. NET控制台应用程序工作。

在简介:

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

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

  • NT服务中的所有代码都无法访问GetVersion
  • WCF服务中的所有代码都无法访问GetVersion

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

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

谢谢

DllNotFoundException来自c#,但不来自VB.NET

错误码为0x8007045A。这是一个COM错误码,映射到Win32错误码ERROR_DLL_INIT_FAILED。它被描述为:

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

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