.net x-64计算机上的Oracle.DataAccess.Dll加载问题

.net x-64计算机上的Oracle.DataAccess.Dll加载问题,.net,oracle,dll,.net,Oracle,Dll,我有一个.net exe程序,它使用Oracle.DataAccess,版本=2.121.1.0 dll。我的开发机器和tfs构建服务器都是32位的。在32台机器上一切正常。 但是现在我必须在x64(WindowsServer2012 R2)上迁移这个程序,我的所有问题都是从那里开始的。我遇到了一个著名的错误无法加载文件或程序集“Oracle.DataAccess,Version=2.121.1.0,Culture=neutral,PublicKeyToken=89b483f429c47342”

我有一个.net exe程序,它使用Oracle.DataAccess,版本=2.121.1.0 dll。我的开发机器和tfs构建服务器都是32位的。在32台机器上一切正常。 但是现在我必须在x64(WindowsServer2012 R2)上迁移这个程序,我的所有问题都是从那里开始的。我遇到了一个著名的错误无法加载文件或程序集“Oracle.DataAccess,Version=2.121.1.0,Culture=neutral,PublicKeyToken=89b483f429c47342”或其依赖项之一。

到目前为止,我在谷歌上搜索了很多东西,并尝试了各种方法:

  • 通过更改项目属性编译选项,专门将executeble构建到目标X86平台
  • 我已经在机器上安装了Oracle dll,并已在GAC中成功注册
  • 尝试构建可执行文件以“任何CPU”为目标,当它不工作时,也尝试使用X64
  • 在app.config文件中专门提供了程序集绑定信息,以查看加载dll的确切位置
  • 打开Fusion日志查看确切的故障原因
  • 请参阅下面的错误日志:

    2015年1月29日10:57:30;警觉的;系统异常在Main()中捕获2015年1月29日10:57:30;错误;System.BadImageFormatException:无法加载文件或程序集“Oracle.DataAccess,版本=2.121.1.0,区域性=中性,PublicKeyToken=89b483f429c47342”或其依赖项之一。试图加载格式不正确的程序。文件名:XXXX.Common.Components.OraDataAccess..ctor()位于XXXX.Library.ValuesCore.ValuesCore..ctor()位于XXXX.Library.DerivationsCore.Derivations..ctor()位于XXXX.processs.XXXX.Main.Main()处,文件名为:“Oracle.DataAccess,版本=2.121.1.0,区域性=中性,PublicKeyToken=89b483f429c47342”===预绑定状态信息===日志:用户=XX日志:显示名称=Oracle.DataAccess,版本=2.121.1.0,区域性=中性,PublicKeyToken=89b483f429c47342(完全指定)日志:Appbase=file:///D:/Release/ 日志:Initial PrivatePath=NULL调用程序集:XXXX.CommonComponents,版本=1.0.0.0,区域性=neutral,PublicKeyToken=E9B31BF3482BD8B.==日志:此绑定在默认加载上下文中启动。日志:使用应用程序配置文件:D:\Release\XXXX.exe.Config日志:使用C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Config\machine.Config中的计算机配置文件。日志:发布策略参考:Oracle.DataAccess,版本=2.121.1.0,区域性=中性,PublicKeyToken=89b483f429c47342日志:尝试下载新URLfile:///C:/Oracle/odp.net/bin/2.x/Oracle.DataAccess.dll. 错误:未能完成程序集的设置(hr=0x8007000b)。调查结束了。29/01/2015 10:57:30;错误;无法加载文件或程序集“Oracle.DataAccess,Version=2.121.1.0,Culture=neutral,PublicKeyToken=89b483f429c47342”或其依赖项之一。试图加载格式不正确的程序。29/01/2015 10:57:30;警觉的;(全球)点源ID=0,计算时间=29/01/2015 10:57:30。29/01/2015 10:57:30;停止

    任何帮助都是迫切需要的,我们将不胜感激

    感谢

    Oracle.DataAccess.dll的体系结构(x86或x64)必须与已安装的Oracle客户端的体系结构相匹配,并且两者都必须与已部署应用程序的体系结构相匹配(即,无论您是在“AnyCPU”还是“x86”或“x64”进行编译)

    “AnyCPU”将以64位Windows上的x64为目标

    最好的解决方案是在您的计算机上同时安装x86和x64 Oracle客户端(并根据ODP.NET),然后任何组合都可以工作。以下是如何执行此操作的说明:


    另一种解决方案是使用ODP.NET托管驱动程序,这在任何情况下都有效。您可以从这里下载它:

    针对x86不起作用?您确定已将所有项目设置为x86Hi Steve并清理和重建了您的解决方案吗?是的,我这样做了,但仍然不起作用:-(您好,Wernfried,谢谢。有一点混淆,我相信即使我创建了符号链接,x86和x64 oracle客户端中的oracle.dataaccess.dll版本也会有所不同。我的exe特别查找“oracle.dataaccess,version=2.121.1.0”,它只存在于32位,我如何在x64版本中获得此dll?请让我知道,以便我可以继续你的建议。我不能使用64位Oracle数据访问组件,因为我的开发和生成计算机仍处于32位模式。不,您的exe在GAC(全局程序集缓存)中搜索
    Oracle.DataAccess.dll
    。如果您的exe为x64,则会加载x64的Oracle.DataAccess.dll。如果此版本不存在,则会失败。
    ODP.NET托管驱动程序
    也适用于x86(32位)没有问题。谢谢,那么你是不是建议我在所有机器上安装ODP.NET托管驱动程序,即开发、构建和部署,这样可以解决版本冲突?是的,实际上没有什么要安装的。只需将
    Oracle.ManagedDataAccess.dll
    复制到应用程序文件夹,就可以了。