无法加载文件或程序集"Oracle.DataAccess"或其某个依赖项

52

我试图运行这个Web应用程序,但是一直出现以下错误:

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

异常细节:System.BadImageFormatException。“无法加载文件或程序集“Oracle.DataAccess”或其某个依赖项。尝试加载格式不正确的程序。”

以下是我已经尝试过的事情:

  1. 用32位Oracle dll,即2.112.3.0替换所有的oracle dll。

我在64位机器上安装了32位客户端。操作系统是Windows 7。

  1. 编译每个单独的项目。删除所有的oracle依赖文件dll,然后逐个添加2.112.3.0的dll文件,然后编译每个项目。

  2. 使用以下语句在GAC上注册32位dll gacutil /i %ORA_HOME4%\odp.net\bin\4\Oracle.DataAccess.dll

gacutil /i %ORA_HOME4%\asp.net\bin\4\oracle.web.dll

对于上述两个语句,我将gacutil.exe从c:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin\NETFX4.0 Tools\X64复制到C:\驱动器,然后执行上述两个语句:

gacutil /i %ORA_HOME4%\odp.net\bin\4\Oracle.DataAccess.dll gacutil /i %ORA_HOME4%\asp.net\bin\4\oracle.web.dll 当我执行上述两个语句时,没有任何消息出现,我在管理员特权下的Dos窗口中执行它们。

  1. 我还从以下位置删除了所有临时ASP.net文件

c:\windows\Microsoft.Net\V4.0.30319\temporary ASP.net files

我还将Web应用程序的构建平台目标更改为X86。原来它是"任何CPU"。出于失望,我还尝试将平台目标更改为X64,然后我收到错误消息

"无法加载文件或程序集。webapp"或其某个依赖项。尝试加载具有不正确格式的程序。

我没有在计算机上安装IIS,我在Visual Studio 2010中运行此应用程序,因此我认为它将使用随Visual Studio一起提供的内置IIS。

我花了很多小时解决这个问题,但仍然不断地出现相同的错误。


2
如果使用IIS Express,这对我有所帮助 https://dev59.com/pGQo5IYBdhLWcg3wOdJa - Phil3992
13个回答

47

尝试以下步骤:打开IIS管理器,更改应用程序池的高级设置,将“启用32位应用程序”更改为false。


15
我的默认值是假的,当我将其设置为真时,依赖问题消失了。 - bygrace
3
我需要32位,所以我将我的设为True,回收应用程序池,这对我起作用了。 - Caverman
2
我需要停止/启动我的应用程序池。 - learnerplates
1
这对我有用...让我感到疯狂的是,微软在向64位世界过渡时采取了这种三心二意的策略... - Johnny Wu

30
我用以下步骤找到了解决方案:
  • 移除Oracle.DataAcces.dll的引用,
    并添加一个新的引用:
    C:\windows\assembly\GAC\Oracle.DataAccess\X.XXX.X.XX__89b483f429c47342/oracle.dataaccess.dll
  • 将本地副本设置为false。
希望对你有所帮助。

1
我在GAC文件夹中没有Oracle.DataAccess文件夹(但在GAC32和GAC64中有)。 - azerty
1
我也是。我使用Win 8.1,但在C:\windows\assembly中没有GAC文件夹。 - NoName
4
在.NET Framework 3.5/4.5中,GAC位于C:\Windows\Microsoft.NET\assembly\GAC_32或C:\Windows\Microsoft.NET\assembly\GAC_64。 - Yodacheese
1
只需删除并添加对Oracle.DataAccess的引用(不是从GAC中)即可解决问题。 - alexkovelsky
使本地副本 = false。 上述行在不更改dll位置的情况下从我的端口工作。感谢。 - Rejwanul Reja

16
您可能需要在您的应用程序池中启用32位应用程序。 转到IIS中的“应用程序池” => 右键单击您的应用程序池 => 高级设置 => “启用32位应用程序”设置为true。
请不要忘记重新启动您的应用程序池以及指向该应用程序池的相应应用程序。

这对我们(2022年)起了作用,真的是救命稻草!!! - JosephDoggie

13

如果您正在使用IIS Express和VS 2017:

前往Web应用程序属性 > Web选项卡 > 服务器部分 > 并将位数更改为x64。


2
如果其他人也觉得有用的话,在我的VS 2019中同样适用。 - Carsten

6

当我从一台机器移动到另一台并重新安装所有内容时,我再次遇到了问题。在我的情况下,我同时使用32位和64位的Oracle ODP.NET安装程序。

在列出新机器上的程序集时,我得到了以下列表:

 C:\oracle\product\11.2.0\X64\odp.net\bin\4>gacutil /l|findstr Oracle.DataAccess
     Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64
     Policy.2.102.Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64
     Policy.2.111.Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64
     Policy.2.112.Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64
     Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64
     Policy.4.112.Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64

这里只有64位的DLL。

enter image description here

我在web.config中看不到,但我使用的是32位版本。

当我检查我的旧机器时,使用GACutil发现更多的DLL,包括X86的。

重新应用注册过程即可解决问题(此处引用了x32 / x64版本)。

OraProvCfg.exe /action:gac /providerpath:C:\oracle\product\11.2.0\x32\ODP.NET\bin\4\Oracle.DataAccess.dll

OraProvCfg.exe /action:gac /providerpath:C:\oracle\product\11.2.0\x64\ODP.NET\bin\4\Oracle.DataAccess.dll

之后,Visual Studio非常顺利地为我重新编译了所有内容。


1
我发现gacutilC:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools,因为它不在我的12.2 Oracle文件夹中。 - Jimenemex
1
切换32位或64位的DLL是可行的。很难从资源管理器或命令提示符中区分它们,但从c:\oracle\product\\*\\(x32 or x64)\ODP.NET\bin\\*\\文件夹获取(另一个)DLL似乎是在32/64之间切换并解决此错误的可靠方法。 - tgolisch

5

我在将Oracle.DataAccess部署到Azure Web Sites (azurewebsites.net)时遇到了相同的错误。对于我来说,在发布到Azure之前,我需要在VS.NET 2019中编辑一个设置。我勾选了“使用64位版的IIS Express用于网站和项目”的复选框,该选项位于工具>选项>项目和解决方案>Web项目下。


3
在我的情况下,以下方法解决了问题:
  1. http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html下载“32位Oracle数据访问组件(ODAC)和Oracle开发人员工具 for Visual Studio”。
  2. 然后通过浏览文件位置或从.NET选项卡中的引用列表添加引用oracle.dataaccess.dllbin文件中。

2
这种方式对我来说也适用于同样的问题,谢谢。 - sam

2
在我的情况下,我使用的是VS 2010和Oracle v11 64位版本。我可能需要以64位模式发布(在Web项目配置中将设置为“Any Cpu”模式),并且我可能需要将生产服务器上的IIS设置为32位兼容性为false(因为服务器是64位的,我想利用它)。
然后解决问题“无法加载文件或程序集'Oracle.DataAccess'”:
- 在本地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,并重新发布到服务器上,这样就可以解决问题了。

你可能有一个好的提示,但我不明白你想说什么,特别是最后一点。 - Jenna Leaf

1
我需要一个64位版本的oracle.dataaccess.dll,但这会导致我使用的其他库出现问题。
[BadImageFormatException: 无法加载文件或程序集“Oracle.DataAccess”或其某个依赖项。尝试加载格式不正确的程序。]
我按照上面的几个步骤操作了。在项目池的高级设置中切换允许32位已经起作用,但我不想保持那样的状态,所以我把它切回去了。
我的项目还有一些引用,依赖于 Elmah 和 log4net 引用。我下载了最新版本,我的项目能够构建和运行良好,而无需更改池的允许32位设置。

1

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