繁体   English   中英

DllNotFoundException从C#,但不是VB.NET

[英]DllNotFoundException From C# but not VB.NET

我有一个第三方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#网站中起作用吗?

谢谢

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM