2017-05-19 37 views
0

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

现在解决办法是: 启用IIS应用程序池32位

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

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

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

Retrieving the COM class factory for component with CLSID {xxxxx} failed due to the following error: xxxxxx Class not registered

-- This class is registered. That is why it works when 32 bit is enabled.

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

+0

我只是在做它一个刺在这里,但...什么版本的Oracle客户端安装在Web服务器上(是完整的客户端或即时客户端)?它是32位还是64位? –

+0

它来自4.5.1的.Net程序集。 DLL的版本是4.0,我相信它是64位。 – smilu

回答

0

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

+0

我试图将其更改为x86。仍然我得到相同的BadImageFormat异常 – smilu

+0

不,AnyCPU意味着加载DLL的过程决定了DLL将使用的模式。对于IIS下的网站,完全可以通过“启用32位”设置进行控制。在这种情况下强制编译为32位无助于 - 使用该设置。听起来像是Oracle库仅作为64位DLL安装在服务器上(我没有任何使用该库的经验) –

0

System.Data.OracleClientdeprecated适用年龄,不应再使用。它仅适用于x86(32位),当Microsoft停止开发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

+0

该OracleClient在64位服务器上为我们工作了很多年。现在,当我们必须在IIS中启用32位时,突然出现问题。 – smilu

+0

是的,在32位模式下'System.Data.OracleClient'(仍然)正在工作。尽管如此,它已经过时了十多年。 'System.Data.OracleClient'不能在64位应用程序中工作 - 这是不可能的。 –

+0

我不知道。我也有同样的印象,它应该只有32位工作。我们的服务器升级到64位超过2年。而在我们最新的服务器中,只安装了64位Oracle客户端。但是,System.Data.OracleClient仍然可以在IIS应用程序池中启用32位。但是,在同一台服务器上,如果我启用32位,它将停止工作,说BadImageFormat。这就是为什么它也让我感到困惑。 – smilu

相关问题