【问题标题】: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无法加载文件或程序集“Oracle.DataAccess”或其依赖项之一。试图加载格式不正确的程序
【发布时间】:2013-03-13 20:57:41
【问题描述】:

我在 IIS 7.0 Windows Server 2008 R2 64bit 上安装了一个 Web 应用程序。 我指的是 oracle.DataAccess.dll; 当我尝试访问应用程序时,我收到以下消息: “无法加载文件或程序集‘Oracle.DataAccess’或其依赖项之一。试图加载格式不正确的程序。” 有人可以帮帮我吗?

【问题讨论】:

    标签: asp.net oracle iis-7 windows-server-2008 gac


    【解决方案1】:

    使用“11.2 Release 3 (11.2.0.2.1) with Xcopy Deployment”版本的 Oracle 数据访问组件安装过程似乎已损坏。要解决此问题,您必须在 GAC 中注册缺少的程序集。要为这个特定版本执行此操作,请从管理员控制台中运行以下命令:

    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。

    希望这会有所帮助。

    附:或者你可以试试this

    【讨论】:

    • 您发布的链接解决了我的问题。谢谢。
    【解决方案2】:

    我避免通过setting "Enable 32-bit Applications" for the application pool to true 在 GAC 中注册 11.2 Release 5 程序集。

    【讨论】:

      【解决方案3】:
      【解决方案4】:

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

      【讨论】:

      • 我想将您的答案标记为有用,但我没有足够的代表。无论如何,谢谢。
      【解决方案5】:

      就我而言,我使用 VS 2010,Oracle v11 64 位。我可能会以 64 位模式发布(在 Web 项目配置中设置为“任何 Cpu”模式),我可能会将生产服务器上的 IIS 设置为 32 位兼容性为 false(因为服务器是 64 位的,我喜欢利用它)。

      然后解决“Could not load file or assembly 'Oracle.DataAccess'”的问题(有时会出现“Compiler Error Message: CS1705: Assembly”错误):

      • 在本地 PC 和服务器中安装了 Oracle v11,64 位。
      • 在所有 Local Dev PC 中,我引用了 64 位的 Oracle.DataAccess.dll (C:\app\user\product\11.2.0\client_1\odp.net\bin\4)。
      • 在 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 并在服务器上再次发布,它可以工作。

      【讨论】:

        【解决方案6】:

        从以下位置安装 64 位 ODAC 11.2 Release 3 (11.2.0.2.1) Xcopy for Windows x64:

        http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html

        为我修好了。确保按照自述文件中的第 4 步更新您的系统路径。

        【讨论】:

          【解决方案7】:

          George Netu 发布的公认答案帮助解决了我的问题,但我不得不摆弄一些额外的小事:

          问题描述:

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

          第一次无益的尝试:

          • 尝试在 Runtime/Administrator 版本中卸载并重新安装 Oracle 完整客户端
          • 尝试重新部署正确的 .dll
          • 试图在 GAC 几次复制新安装的程序集,如上面通过命令提示符接受的答案中所述(但这并没有解决版本不匹配问题..)
          • 尝试使用gacutil /i ...

          最终成功:

          我登陆 Gacutil.exe msdn page 并最终能够从 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,它可以工作了..

          【讨论】:

          • 嗨,我遇到了同样的错误。我尝试了这里所说的一切。仍然没有成功。有什么建议可以吗?
          • 从 GAC 中完全删除所有这些项目,重新部署,然后检查您的应用程序、bin 文件夹和 GAC 中是否具有所有相同的版本!
          【解决方案8】:

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

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

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

          2。更正引用 dll。

          参考路径应该是Oracle安装过程配置的系统参考路径。但是,在某些情况下,例如安装或更新新的 Oracle 版本,最新的 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 将引发异常 注意到它加载了一个不匹配的依赖非托管版本 动态链接库。

          https://docs.oracle.com/cd/E11882_01/win.112/e23174/InstallODP.htm#ODPNT152

          3.解决问题的简单快捷的方法(但不是正确的解决方案)是直接覆盖从 oracle 安装路径复制的 Oracle.DataAccess.dll 文件(例如:C:\Oracle\product\12.2.0\client_1 \odp.net\bin\4\ ) 到您的 Web 应用程序的 Bin 文件夹。

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

          【讨论】:

          • 第 2 步解决了我的问题。谢谢
          【解决方案9】:

          我遇到了同样的问题。

          我转到一般部分的项目属性,将平台目标设置为 64 位 (x64),我的问题解决了

          【讨论】:

            【解决方案10】:

            在应用程序池中 ---> 点击高级设置 --> 启用 32 位选项

            看这张图片

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-09-17
              • 2010-12-11
              • 2017-09-22
              • 2013-02-27
              • 2014-07-04
              相关资源
              最近更新 更多