C# ODP.NET加载文件或程序集

11

我最近开始测试一个使用ODP.NET(Oracle.DataAccess 4.112.3)的C#(4.0)应用程序

我将这个项目设置为针对任何平台并发布该应用程序。

当我在客户端计算机上运行程序时,我收到以下错误:

Could not load file or assembly 'Oracle.DataAccess, Version=4.112.3.0,Culture=neutral,
PublicKeyToken=89b483f429c47342' or one of its dependencies. An attempt was made to load 
a program with an incorrect format.

就像我说的,我的目标平台是“Any CPU”,同时我还将Oracle.DataAccess程序集与应用程序一起嵌入。
在有Oracle客户端安装的机器上以及没有安装Oracle客户端的机器上都遇到了这个错误。

非常感谢您的帮助。


你已经将 Oracle 引用的属性“复制本地副本”更改为 True 了,对吧? - carny666
4个回答

18

像我说的那样,我已经选择了“任何CPU”

这很可能是问题所在。

Oracle.DataAccess有适用于32位64位系统的不同版本。如果您在32位机器上开发,然后在64位操作系统上部署,您将收到此消息。

您可以轻松地通过构建应用程序以针对x86并部署数据访问组件的32位版本来解决此问题。


1
对于Web应用程序,这意味着应用程序池必须运行32位,并且需要32位的Oracle客户端。当使用4.112.3时,64位Web服务器和Oracle客户端的解决方案是什么?复制本地是32位。砰。没有它,将使用客户端的GAC'd副本4.112.2。砰。将64位新版本复制到bin中会导致其提供程序工厂缺少接口而崩溃。它是否再次尝试使用旧的GAC_64版本?还是web.config中缺少某些内容告诉它在bin副本中使用新的提供程序? - one.beat.consumer

4

正如Reed Copsey所说,有两个不同的DLL。当您选择目标为ANYCpu时,在64位机器上运行您的应用程序将在64位上运行,在32位机器上则在32位上运行。因此,如果您希望您的应用程序可以在32位或64位上运行,并以AnyCPU模式运行,则应将Oracle.DataAccess的引用更改为Specific Version = false并且copy local = false。当您部署到客户端时,他们应该在其GAC中拥有oracle dll,并且它应该自动选择正确的版本。


0
从顶部调试“Any CPU”,将选项更改为调试“X64”。尽管在内部,“Any CPU”指向“X64”,但这不起作用,尝试更改为“X64”,它应该可以完美运行。

0

你可能需要检查一下 Oracle.DataAccess 程序集在你的机器上是否有任何依赖项,并且在客户端机器上缺失了该程序集。


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