DllNotFoundException来自C#但不是VB.NET

时间:2014-06-18 08:12:21

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

我有第三方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#网站上工作吗?

由于

1 个答案:

答案 0 :(得分:0)

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

  

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

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