'Sap.Data.Hana.HanaConnection' 的类型初始值设定项引发异常。 ---> System.IO.FileNotFoundException: 找不到 libADONETHDB.dll

The type initializer for 'Sap.Data.Hana.HanaConnection' threw an exception. ---> System.IO.FileNotFoundException: Cannot find libADONETHDB.dll

我只在特定机器上遇到问题。 我有两个程序引用了 Sap.Data.Hana.v4.5.dll,用于 HANA 数据库的 .NET 4.5 的 ADO.NET 提供程序。 当我的程序使用

实例化连接对象时
dbConnection = new HanaConnection(...);

我收到这个错误:

System.TypeInitializationException: The type initializer for 'Sap.Data.Hana.HanaConnection' threw an exception. ---> System.IO.FileNotFoundException: Cannot find libADONETHDB.dll.
   at Sap.Data.Hana.HanaUnmanagedDll.SearchNativeDlls(String regKeyName)
   at Sap.Data.Hana.HanaUnmanagedDll..ctor()
   at Sap.Data.Hana.HanaUnmanagedDll.get_Instance()
   at Sap.Data.Hana.HanaConnection..cctor()
   --- End of inner exception stack trace ---
   at [...my program calls...]

为什么找不到libADONETHDB.dll?

我的应用程序一个是 32 位的,另一个是 64 位的。 在这台机器上,我安装了 32 位和 64 位的 SAP HANA 客户端 2.8.20.23662(最新版本)。 找不到的文件似乎存在:

您可以使用 Process Monitor 而 运行 程序的相关部分来查看哪个文件丢失以及它应该在的路径。排除除文件事件之外的所有其他事件并过滤掉所有成功消息。

也许它是相对于调用 DLL(其中定义了 Sap.Data.Hana.HanaUnmanagedDll.SearchNativeDlls)的引用。

我的观点是 GAC 已被 Sap.Data.Hana.v4.5.dll 的版本 1 损坏:

可能在过去安装和删除了 HANA 客户端版本 1,并且卸载没有清理 GAC。 我的程序使用任何版本的 HANA 客户端,适用于版本 1 和版本 2。出于某种原因,当他们开始时,他们似乎在 GAC 中使用 Sap.Data.Hana.v4.5.dll 的版本 1。 Process Monitor(感谢 )确认:

此 .NET DLL 然后在 C:\Program Files (x86)\hdbclient 中查找一些非托管 DLL。版本 1 似乎在根文件夹中寻找 libADONETHDB.dll。 但是目前在该文件夹中的这台机器中,我们有 HANA Client 2.x,其文件夹结构与版本 1 的文件夹结构完全不同(根文件夹中没有 libADONETHDB.dll)。 因此这个问题的错误。 所有这些对 32 位和 64 位 HANA 客户端均有效。

我解决了重命名或删除 C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Sap.Data.Hana.v4.5 中的版本 1 文件夹(可能在那里是执行此清理的更好方法)。