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