【问题标题】:Attempt to load Oracle client libraries threw BadImageFormatException IIS System.Data.OracleClient尝试加载 Oracle 客户端库引发 BadImageFormatException IIS System.Data.OracleClient
【发布时间】:2017-05-19 17:34:26
【问题描述】:

故事:我的网站在 System.Data.OraceClient 中运行(由于各种技术原因,我无法更改 dll)。现在,我有一个第三方 DLL 集成到我的网站,它是 32 位的。当我从 Visual Studio 运行时,一切运行良好,但是当我将其发布到 IIS 时,它会引发上述错误。

现在的解决方案是: 在 IIS 应用程序池中启用 32 位

启用 32 位后,第三方 DLL 将开始工作,System.Data.Oracle client fails with BadImageFormat exception

在 IIS 应用程序池中禁用 32 位。

当 32 位被禁用时,System.Data.OracleClient 将开始工作,第三方 DLL 将失败并出现以下错误。

检索具有 CLSID {xxxxx} 的组件的 COM 类工厂 由于以下错误而失败:xxxxxx 类未注册

-- 此类已注册。这就是为什么它在启用 32 位时工作的原因。

现在,我的情况是一次只有一个 dll 可以工作。在应用程序池中启用 32 位时,是否有一种解决方法可以让我的 System.Data.OracleClient 运行,而无需尝试将我的整个应用程序迁移到 Oracle Data Access?

【问题讨论】:

  • 我只是在这里尝试一下,但是... Web 服务器上安装了哪个版本的 Oracle 客户端(是完整客户端还是即时客户端)?它是 32 位还是 64 位?
  • 它来自 4.5.1 的 .Net 程序集。 dll的版本是4.0,我相信是64位的。

标签: asp.net oracle iis com system.data.oracleclient


【解决方案1】:

我认为实现这一目标的唯一方法是将您的 Web 应用程序构建为 32 位,然后让它使用 32 位客户端。然后一切都是32位的。 确保您的 Web 应用程序是为 x86 构建的不要构建为 AnyCpu,因为这将默认为目标平台的 x64。

【讨论】:

  • 我尝试将其更改为 x86。我仍然得到相同的 BadImageFormat 异常
  • 不,AnyCPU 意味着加载 DLL 的进程决定了 DLL 将使用什么模式。对于 IIS 下的网站,这完全由“启用 32 位”设置控制。在这种情况下强制编译为 32 位并没有帮助 - 使用该设置。听起来 Oracle 库仅作为 64 位 DLL 安装在服务器上(我没有使用该库的经验)
【解决方案2】:

System.Data.OracleClientdeprecated 的年龄,不应再使用。它仅适用于 x86(32 位),当时微软停止开发System.Data.OracleClient 64 位 Windows 还没有那么普遍。

最好使用 Oracle 的 ODP.NET 提供程序,它适用于 x86 和 x64。

也请查看此说明:BadImageFormatException. This will occur when running in 64 bit mode with the 32 bit Oracle client components installed

【讨论】:

  • 这个 OracleClient 在 64 位服务器上为我们工作了很长时间。现在,当我们必须在 IIS 中启用 32 位时,问题突然出现了。
  • 是的,在 32 位模式下 System.Data.OracleClient (仍在)工作。然而,它已经过时了十多年。 System.Data.OracleClient 不能在 64 位应用程序中工作 - 这是不可能的。
  • 我不知道。我也有同样的印象,它应该只能作为 32 位工作。我们的服务器升级到 64 位超过 2 年。在我们最新的服务器中,只安装了 64 位 Oracle 客户端。但是 System.Data.OracleClient 仍然可以在 IIS 应用程序池中不启用 32 位的情况下工作。但是,在同一台服务器上,如果我启用 32 位,它会停止工作,说 BadImageFormat。这也是它让我感到困惑的原因。
  • 也许使用来自 sysinternals 的Process Monito 来查看真正加载了哪些 DLL
  • 我终于在服务器上安装了 32 位 oracle。现在,无论是否启用 32 位,都可以使用。所以谢谢大家的建议
猜你喜欢
  • 2013-03-08
  • 1970-01-01
  • 2019-05-15
  • 2014-08-05
  • 2010-10-01
  • 2019-04-05
  • 1970-01-01
  • 2019-01-06
相关资源
最近更新 更多