我在 IIS 7.0 Windows Server 2008 R2 64bit 上安装了一个 Web 应用程序。我指的是 oracle.DataAccess.dll;当我尝试访问应用程序时,我收到以下消息:“无法加载文件或程序集 'Oracle.DataAccess' 或其依赖项之一。尝试加载格式不正确的程序。” 有人可以帮我吗?
10 回答
使用“11.2 Release 3 (11.2.0.2.1) with Xcopy Deployment”版本的 Oracle 数据访问组件安装过程似乎被破坏了。要解决此问题,您必须在 GAC 中注册缺少的程序集。要针对此特定版本执行此操作,请从管理员控制台中运行以下命令:
md C:\Windows\assembly\GAC_32\Oracle.DataAccess\4.112.2.0__89b483f429c47342\
copy %ORACLE_HOME%\odp.net\bin\4\Oracle.DataAccess.dll C:\Windows\assembly\GAC_32\Oracle.DataAccess\4.112.2.0__89b483f429c47342\
md C:\Windows\assembly\GAC_32\Oracle.Web\4.112.2.0__89b483f429c47342\
copy %ORACLE_HOME%\asp.net\bin\4\oracle.web.dll C:\Windows\assembly\GAC_32\Oracle.Web\4.112.2.0__89b483f429c47342\
请注意,这仅注册 DLL,但不注册其他语言资源。因此,如果您使用除英语之外的任何其他语言(de、es、fr、it、ja、ko、pt-BR、zh-CHS 和 zh-CHT),那么您还需要使用相应的资源注册这些语言文件。
如果您在计算机上安装了 Visual Studio,则可以发出以下命令:
gacutil /i %ORACLE_HOME%\odp.net\bin\4\Oracle.DataAccess.dll
gacutil /i %ORACLE_HOME%\asp.net\bin\4\oracle.web.dll
注意:在 Visual Studio 安装文件夹下查找 gacutil.exe。
希望这可以帮助。
PS 或者你可以试试这个。
我通过将应用程序池的“启用 32 位应用程序”设置为 true 来避免在 GAC 中注册 11.2 Release 5 程序集。
您可能需要在 AppPool 中启用 32 位应用程序。
您需要使用 GAC util 在实时服务器上注册该 dll。还要检查它是否存在于 bin 文件夹中。有时在 bin 目录中缺少 dll 会导致相同的错误
就我而言,我使用 VS 2010,Oracle v11 64 位。我可能会以 64 位模式发布(在 Web 项目配置中设置为“任何 Cpu”模式),我可能会将生产服务器上的 IIS 设置为 32 位兼容性为 false(因为服务器是 64 位的,我喜欢利用它)。
然后解决“Could not load file or assembly 'Oracle.DataAccess'”的问题(有时会出现“Compiler Error Message: CS1705: Assembly”错误):
- 在本地 PC 和服务器中安装了 Oracle v11,64 位。
- 在所有本地开发 PC 中,我引用了 64 位的 Oracle.DataAccess.dll (C:\app\user\product\11.2.0\client_1\odp.net\bin\4)。
- 在 IIS 生产服务器中,我将 32 位兼容性设置为 False。
- System.Web.Mvc.dll 的 Web 项目中的参考是本地 PC 中的版本 v3.0.0.1,但是在生产中仅安装了 MVC 版本 3.0.0.0。因此,该修复程序在本地使用 MVC 3.0.0.0 而不是 3.0.0.1 并在服务器上再次发布,并且可以正常工作。
从以下位置安装 64 位 ODAC 11.2 Release 3 (11.2.0.2.1) Xcopy for Windows x64:
http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html
为我修好了。确保按照自述文件中的第 4 步更新您的系统路径。
是的,这是我有时遇到的一个非常烦人的问题。主要问题是 Web 应用程序错误地使用了 32 位 Oracle.DataAccess.dll 而不是 64 位,或者相反。有一些解决方案。
1.如果您的应用程序是 64 位的并且需要运行 32 位的 Oracle.DataAccess.dll,请在应用程序池中启用 32 位应用程序。
转到 IIS 并在应用程序池的高级设置中将“启用 32 位应用程序”选项设置为 true。
2.修正引用dll。
参考路径应该是Oracle安装过程配置的系统参考路径。但是,在某些情况下,例如安装或更新新的 Oracle 版本、最新的 DLL 不会更新旧的、路径已更改或 Web 应用程序项目中的引用未更新。因此,我们应该手动更正 Oracle.DataAccess 引用。
转到 Web 应用程序并删除 Oracle.DataAccess 引用。并为 Oracle.DataAccess 添加新的参考。它必须是您的 oracle 安装路径中的正确 Oracle.DataAccess.dll。例如:
C:\Oracle\product\12.2.0\client_1\odp.net\bin\4\Oracle.DataAccess.dll
ODP.NET 和从属非托管 DLL 不匹配 为了强制使用 Oracle.DataAccess.dll 程序集及其非托管 DLL 的正确版本,如果 Oracle.DataAccess.dll 注意到它加载了一个不匹配版本的从属非托管 DLL,则会引发异常.
https://docs.oracle.com/cd/E11882_01/win.112/e23174/InstallODP.htm#ODPNT152
3.解决问题的简单快捷方法(但不是正确的解决方案)是直接覆盖从oracle安装路径复制的Oracle.DataAccess.dll文件(例如:C:\Oracle\product\12.2.0\client_1\odp .net\bin\4\ ) 到您的 Web 应用程序的 Bin 文件夹。
希望这对您有所帮助。祝你好运。
George Netu 发布的公认答案帮助解决了我的问题,但我不得不摆弄一些额外的小事:
问题描述:
在C:\Windows\assembly下,我找到了两个Oracle.DataAccess项(GAC 文件夹?)。Relict,由多个 Oracle 客户端安装引起。一项显示版本 2.112.1.0 但实际上是版本 2.121.2.0(通过Properties->Version可见)。这种不一致就是错误。
第一次无益的尝试:
- 尝试在运行时/管理员版本中卸载并重新安装 Oracle 完整客户端
- 尝试重新部署正确的 .dll
- 尝试在 GAC 几次复制新安装的程序集,如上面通过命令提示符接受的答案中所述(但这并没有解决版本不匹配问题..)
- 试图使用
gacutil /i ...
最终成功:
我登陆了Gacutil.exe msdn 页面,最终能够从C:\Windows\assembly文件夹中删除这些项目。
gacutil /u Oracle.DataAccess, Version=2.112.1.0, Culture="Neutral",PublicKeyToken=45e343aae32233ca
gacutil /u Oracle.DataAccess, Version=2.212.2.0, Culture="Neutral",PublicKeyToken=45e343aae3223abc
gacutil /u Oracle.Web, Version=2.112.1.0, Culture="Neutral",PublicKeyToken=45e343aae3223def
之后,我重复了这两个gacutil /i ...
命令,两个 dll 以一致的版本出现在那里。
最后重新启动IIS,它可以工作..
我有同样的问题。
我转到一般部分的项目属性,将平台目标设置为 64 位(x64),我的问题解决了