System.DllNotFoundException:部署到 Docker Linux 容器时无法加载 DLL 'oci'

System.DllNotFoundException: Unable to load DLL 'oci' when deployed to a Docker Linux container

我尝试使用 System.Data.OracleClient 连接 oracle 数据库。我的 .net 核心应用程序在 vs2017 和 IIS 中运行良好,但是当我部署到 Linux 容器和 运行 从数据库获取连接的部分时,我收到此错误:

System.DllNotFoundException: 无法加载 DLL 'oci': 找不到指定的模块。 (HRESULT 异常:0x8007007E)位于 System.Data.OracleClient.Oci.OciCalls.OciNativeCalls.OCIEnvCreate(IntPtr& envhpp、OciEnvironmentMode 模式、IntPtr ctxp、IntPtr malocfp、IntPtr ralocfp、IntPtr mfreep、Int32 xtramem_sz、IntPtr usrmempp)

当我再次尝试 运行 运行 部分时,错误变为:

System.NullReferenceException: 对象引用未设置为对象的实例 在 System.Data.OracleClient.OracleConnectionPool.GetConnection () [0x00000] 在 :0 在 System.Data.OracleClient.OracleConnection.Open () [0x00000] 在 :0

如有任何建议,我们将不胜感激。

更新: 我删除了 System.Data.OracleClient 并使用了 Oracle.ManagedDataAccess.Core,错误消失了。 需要注意的是,当使用Oracle.ManagedDataAccess.Core 2.18.3 版本时,你必须为docker linxu 容器设置一个名为TZ 的环境变量,但在2.12.0-beta3 版本中TZ 不是必需的,详情你可以参见

尽管依赖项只显示 netstandard 2.0,但我怀疑该包是否适用于 .net core linux。它似乎对 .net famework 有一些依赖性。这里还有一个未解决的问题 Unable to load DLL 'oci'

此外 ms docs 上的那个仅适用于 .net framework。看这里:System.Data.OracleClient