无法加载文件或程序集“Oracle.DataAccess”或其某个依赖项。尝试加载具有不正确格式的程序。

15
我已在 Windows Server 2008 R2 64位系统上安装了一个Web应用程序,使用的是IIS 7.0。我正在引用oracle.DataAccess.dll文件。当我尝试访问该应用程序时,出现以下错误信息:“Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.",请问有人可以帮我解决吗?
10个回答

20

使用“11.2 Release 3(11.2.0.2.1)with Xcopy部署”版本安装Oracle数据访问组件的过程似乎存在问题。要解决此问题,您必须在全局程序集缓存中注册缺失的程序集。为了针对此特定版本执行此操作,请在管理员控制台中运行以下命令:

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 文件。

希望这有所帮助。

附注:或者您可以尝试这个


4
你发的链接解决了我的问题。谢谢。 - Gunnar

12
我通过将应用程序池的“启用32位应用程序”设置为true,避免在GAC中注册11.2 Release 5程序集。(参考链接)

11

2
对我来说完美运行,去做吧。 - Rogerson Nazário

5
你需要使用GAC util在生产服务器上注册该dll。还要检查它是否存在于bin文件夹中。有时,在bin目录中缺少dll会导致相同的错误。

2
我想把你的答案标记为有用的,但是我的声望不够。无论如何,非常感谢。 - Smehrt Tonni

4
在我的情况下,我使用VS 2010和Oracle v11 64位版本。我可能需要以64位模式发布(在Web项目配置中设置为“任何CPU”模式),并将生产服务器上的IIS设置为32位兼容性为false(因为服务器是64位的,我想要利用它)。
然后解决问题“无法加载文件或程序集'Oracle.DataAccess'”(有时会出现“编译器错误消息:CS1705:程序集”错误):
- 在本地PC和服务器上都安装了Oracle v11 64位版本。 - 在所有本地开发PC上,我引用了Oracle.DataAccess.dll(C:\ app \ user \ product \ 11.2.0 \ client_1 \ odp.net \ bin \ 4),它是64位的。 - 在IIS生产服务器上,我将32位兼容性设置为False。 - Web项目中的引用System.Web.Mvc.dll在本地PC上是版本v3.0.0.1,但在生产环境中只安装了MVC版本3.0.0.0。所以,修复方法是在本地使用MVC 3.0.0.0而不是3.0.0.1,并重新发布到服务器上,这样就可以解决问题了。

3

1

是的,这是我有时遇到的一个非常烦人的问题。主要问题在于Web应用程序错误地使用了32位的Oracle.DataAccess.dll而不是64位,或者反过来。有几种解决方法。

1. 如果您的应用程序是64位并且需要运行32位的Oracle.DataAccess.dll,则可以在应用程序池中启用32位应用程序。

进入IIS,在“应用程序池”的“高级设置”中将“启用32位应用程序”选项设置为true。

2. 更正引用dll。

参考路径应该是由Oracle安装过程配置的系统参考路径。但是,在某些情况下,例如安装或更新新的Oracle版本,最新的DLL不会更新旧的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.DataAccess.dll文件,从Oracle安装路径复制(例如:C:\Oracle\product\12.2.0\client_1\odp.net\bin\4\)到您的Web应用程序的Bin文件夹中。

希望这对你有所帮助。祝好运。


第二步解决了我的问题。谢谢。 - a.u.b

1

George Netu的回答帮助我解决了问题,但我还需要处理一些额外的小问题:

问题描述:

C:\Windows\assembly下,我找到了两个Oracle.DataAccess项(GAC文件夹?)。这是由多个Oracle客户端安装引起的。一个项目显示版本2.112.1.0,但实际上是版本2.121.2.0(通过属性->版本可见)。这种不一致性就是bug。

第一次尝试无效:

  • 尝试卸载和重新安装Oracle完整客户端,分别以Runtime/Administrator版本
  • 尝试重新部署正确的.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,它就可以正常运行了。


嗨,我遇到了同样的错误。我尝试了这里说的一切,但仍然没有成功。你有什么建议可以给我吗? - shanmugharaj
完全从GAC中删除所有这些项,重新部署,然后检查您的应用程序、bin文件夹和GAC中是否具有相同的版本! - florian.isopp

0
在应用程序池 ---> 点击高级设置 --> 启用32位选项
请参考此图片

enter image description here


0

我曾经遇到过同样的问题。

我进入项目属性中的常规部分,将平台目标设置为64位(x64),然后我的问题就解决了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接