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

时间:2019-05-24 23:05:08

标签: dll ado hana

对于使用SAP.DATA.HANA.v4.5 v2.3.119并以libadonetHDB.dll v2.3.119安装在运行时计算机上且环境变量HDBADONET指向应用程序文件夹的.Net C#应用程序libadonetHDB.dll存在的位置。到目前为止,该应用程序可以在多个安装上按预期工作,但是,我看到一个新安装无法生成以下来自HanaConnection的 指定模块找不到错误 异常:< / p>

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,该dll与应用程序位于同一文件夹中,或者通过HDBADONET环境变量路径位置应起作用(并且在其他几种安装环境中也起作用)。这是用于非本机.NET应用documented here

的ADO.NET库开发和使用的常规工作流程的一部分。

我一直以“管理员”用户的身份进行尝试,这是一个全新创建的虚拟机(尝试了新的Windows10 x64 VM和新的Windows Server 2016 x64 VM)。还确认安装了.NET v4.5 +。

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

关于为何SAP Hana ADO.NET DB连接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之后是原始帖子中发布的消息。因此,似乎异常消息中有关无法找到或加载模块的投诉指的是它正在寻找的其他资源或dll,但该消息不够详细,无法知道其含义。有什么想法吗?

更新(解决方案)

简短答案:

Dependencies检查libadonetHDB.dll会发现由于某些原因msvcr100.dllmsvcp100.dll在运行时计算机上都丢失了。将那些缺少的DLL添加到应用的安装包中即可解决此问题。

更长的答案:

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

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

  • C:\Windows\System32(如果您希望您的应用避免将内容安装到主系统文件夹中,则可能不是首选解决方案)
  • 应用程序exe所在的文件夹
  • 应用的lib子文件夹,只要您将该子文件夹的路径添加到PATH环境变量定义(即set PATH=%PATH%;fullpath\to\app\lib

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

1 个答案:

答案 0 :(得分:1)

我的建议是使用Dependency Walker(或其他类似的util)来确定找到的DLL寻找的DLL。看起来好像找到了一个,但是在这种情况下并不能满足所有符号依赖性。

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