为什么 SAP Hana DB ADO.NET DLL 加载可能会失败?

Why SAP Hana DB ADO.NET DLL loading may fail?

对于使用 SAP.DATA.HANA.v4.5 v2.3.119 并安装在具有 libadonetHDB.dll v2.3.119 且环境变量 HDBADONET 指向libadonetHDB.dll 所在的 app 文件夹。到目前为止,该应用程序在多个安装中都按预期工作,但是我发现一个新安装无法生成 The specified module could not be found error以下 HanaConnection 的异常:

The type initializer for 'Sap.Data.Hana.HanaConnection' threw an exception.
System.Exception: The specified module could not be found
   at Sap.Data.Hana.HanaUnmanagedDll.LoadDll(String dllPath)
   at Sap.Data.Hana.HanaUnmanagedDll..ctor()
   at Sap.Data.Hana.HanaUnmanagedDll.get_Instance()
   at Sap.Data.Hana.HanaConnection..cctor()

还尝试将 dll 移动到安装应用程序的同一文件夹,并产生相同的结果。

根据 documentation, the dll being in the same folder as the application or via the HDBADONET environment variable path location should work (and have experienced it working on several other installations). This is part of the general workflow for developing and using the ADO.NET library for non-native .NET apps documented here

我作为 "Administrator" 用户一直在尝试这个,这是一个全新创建的虚拟机(尝试了新的 Windows10 x64 VM 和新的 Windows Server 2016 x64 VM ).还确认安装了 .NET v4.5+。

机器是否可能具有影响 dll 加载的权限或其他策略?

关于为什么 SAP Hana ADO.NET 数据库连接 DLL 加载会失败但并非在所有情况下都失败的任何线索?

libadonetHDB.dll 是否出于某种原因仍在尝试在计算机上查找和加载 libSQLDBCHDB.dll 或其他 dll?据我了解,使用 ADO.NET DLL 允许机器不需要安装其他客户端和 dll。

具体是哪个module找不到?有没有办法让 Hana Connection DLL 加载失败时生成更详细的输出?

更新

为了确认 libadonetHDB.dll 确实是使用 HDBADONET 环境变量定义找到的,我删除了该文件并重新测试,但我收到了一条不同的消息:

The type initializer for 'Sap.Data.Hana.HanaConnection' threw an exception.
System.IO.FileNotFoundException: Cannot find a matching libadonetHDB.dll 
with version 2.3.119 - check the location in the HDBADONET or PATH 
environment variables
   at Sap.Data.Hana.HanaUnmanagedDll.SearchNativeDlls()
   at Sap.Data.Hana.HanaUnmanagedDll..ctor()
   at Sap.Data.Hana.HanaUnmanagedDll.get_Instance()
   at Sap.Data.Hana.HanaConnection..cctor()

因此,在成功找到 libadonetHDB.dll 之后,原始 post 中 post 的消息将出现。因此,异常消息中关于无法找到或加载模块的抱怨似乎是指它正在寻找的其他资源或 dll,但该消息不够详细,无法知道那是什么。有什么想法吗?

更新(解决方案)

简短回答:

Dependencies 检查 libadonetHDB.dll 表明 msvcr100.dllmsvcp100.dll 由于某种原因在运行时机器上都丢失了。将那些缺失的 DLL 添加到应用程序的安装包中解决了这个问题。

较长的答案:

感谢 donjuedo 建议询问 DLL 以查看其依赖项。我在失败的机器上使用的工具是 Dependencies(需要安装 vc++ 可再发行 x64,如自述文件中所述,它才能工作)显示 msvcr100.dllmsvcp100.dll 在检查 libadonetHDB.dll 时作为依赖项都丢失了。请注意,它们仅在这台新创建的虚拟机的特定机器上被发现丢失,因此必须在该机器上进行检查和测试用例。

在安装时包含丢失的 DLL 的解决方案可以是将 msvcr100.dllmsvcp100.dll 添加到以下任一位置:

这两个 dll 已经在我们的开发机器上,并且可能已经是许多 runtime/client 机器的一部分,这些机器已经存在了一段时间并且有其他需要它们的软件。如果你甚至在开发中都没有这些,那么从微软的官方包中下载它们作为 noted here(如果你想确保它们不是隐藏在 dll 中的恶意软件,请避免从第 3 方 dll 网站获取它们)。理想情况下,SAP HanaDB ADO.NET 库的文档应该提及运行时机器的要求,或者 .NET 开发人员需要提供这些依赖 DLL。

我的建议是使用 Dependency Walker(或其他类似的实用程序)来确定找到的 DLL 正在寻找什么 DLL。看起来找到了一个,但在那种情况下并不是所有的符号依赖都得到满足。

Streamline 提出了一个很好的观点:看到的失败是运行时失败,而不是构建时失败。运行时环境各不相同,因此为满足所需符号而选择的 DLL 可能会有所不同。必须在遇到异常的特定系统上进行故障排除。