我有第三方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可以正常工作。
总结:
我通过NT服务创建了一个WCF主机来公开这些函数,希望这可以解决文件位置和依赖关系。这是用VB.NET编写的,与ThirdPartyApi.dll放在同一个文件夹中。
请注意,在上述所有情况下,可执行文件与ThirdPartyApi.dll 位于同一目录中。它的所有依赖项也存在于此目录中。
任何人都可以解释这种行为,或者建议如何在C#网站上工作吗?
由于
答案 0 :(得分:0)
错误代码为0x8007045A
。这是一个映射到Win32错误代码ERROR_DLL_INIT_FAILED
的COM错误代码。其描述如下:
动态链接库(DLL)初始化例程失败。
这意味着找到了你的DLL,尽管可能有误导性的异常类DllNotFoundException
。但是,DLL无法加载。您无法从系统中获取更多信息。 DLL没有机制报告无法加载的原因。我建议您联系DLL的供应商并寻求支持。