无法加载文件或程序集 'Oracle.DataAccess' 64位 ODP.NET

3

我在我的asp.net项目中使用ODP.NET,以便应用程序与Windows 2008服务器上的Oracle 11 g Express进行通信(32位)。在开发机器上,我有Windows 7(32位)。我在开发计算机上安装了Windows 8(64位),并尝试从Visual Studio 2012运行应用程序,但出现错误“无法加载文件或程序集'Oracle.DataAccess'”。经过一番搜索,我意识到我必须安装64位的ODP.NET才能在64位机器上使用它,所以我卸载了32位版本并安装了64位的ODP.NET。删除对旧Oracle.DataAccess的引用,但仍然面临着同样的问题。我漏掉了什么吗?


1
你确定ODP.NET已经支持Windows 8了吗?http://www.oracle.com/technetwork/database/windows/tech-info/sod-oracle-db-win8-win2012-1853201.pdf 这篇文章指出从11.2.0.4版本开始支持。目前我能找到的最新版本是11.2.0.3.20。另外,你需要检查一下你的应用程序是作为x64还是x32进程运行。位数必须与你计划使用的ODP.NET驱动程序相同。 - Alex
@Alex 谢谢.. 很好的观点.. 你非常正确,我应该检查一下 ODP.NET 是否受 Windows 8 支持。 - ZedBee
你也可以将应用程序的目标平台从 AnyCPU 更改为 x86。这将使其始终作为 32 位 x86 运行,因此它将加载 32 位客户端库等。 - Brian
你试过使用FusionLog吗?例如,可以参考http://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx。 - evgenyl
3个回答

3
我也遇到了同样的问题,经过一番试错,我发现问题出在32位和64位平台之间。
以下是解决方案:
1. 当我们将32位的Oracle.DataAccess.dll与Web应用程序一起部署到64位环境并在服务器上安装ODP.net时,就会出现此错误。
2. 一种解决方案是从bin文件夹中删除Oracle.DataAccess.dll,正确的引用会被自动解析。
3. 第二种解决方案是将Reference属性CopyToLocal=false设置为Oracle.DataAccess.dll,这样当您在IIS上部署时,它不会随构建而进行,因此不会出现错误。
4. 我更喜欢的第三种解决方案是为应用程序池启用32位应用程序,这样无论Oracle.DataAccess.dll是否存在于bin文件夹中,都不会再次出现此问题。
希望这可以帮助您解决问题。

1
为安装ODP.NET,我使用64位ODAC
安装之后,要检查Oracle.DataAccess 64位程序集是否正确安装,请前往文件夹:c:\Windows\Microsoft.NET\assembly\GAC_64,并检查是否存在Oracle.DataAccess文件夹。
在该文件夹中应该有一个子文件夹,其中包含您正在使用的Oracle.DataAccess dll版本。
在Visual Studio中,您必须通过查看“程序集”->“扩展”(而不是使用“浏览”)来添加引用。
还要检查Visual Studio中的生成配置,确保应用程序的活动解决方案平台为64位。
要运行您的网站,您必须使用IIS,因为Visual Studio的开发服务器仅以32位模式运行。
在IIS应用程序池中,将您的应用程序设置为运行在64位中。(该设置在高级设置中)

0
机器的位数并不重要 - 托管应用程序的位数才是。Visual Studio附带的开发Web服务器是32位的,因此您需要安装32位版本的odp.net。如果您想使用64位版本进行测试,可以在IIS中运行它。我会同时安装两个版本。
在这种情况下,我猜问题更可能是版本号 - 您的应用程序最初引用了与您安装的版本不同的版本。简单的解决方法是删除/重新添加对新安装的Oracle.DataAccess.dll的引用。然而,您必须这样做有点表明您正在安装完整的客户端,而不仅仅是ODP.net install。由于某种原因(除了oracle通用安装程序是一个垃圾之外),完整的客户端不包括发布者策略(它将重定向引用),但odp.net安装包包括发布者策略。

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