【问题标题】:Could not load file or assembly "Oracle.DataAccess" or one of its dependencies无法加载文件或程序集“Oracle.DataAccess”或其依赖项之一
【发布时间】:2013-09-17 17:45:50
【问题描述】:

我正在尝试运行此 Web 应用程序。我不断收到此错误 “无法加载文件或程序集“Oracle.DataAccess”或其依赖项之一。试图加载格式不正确的程序。“ 异常详细信息:System.BadImageFormatException。 “无法加载文件或程序集“Oracle.DataAccess”或其依赖项之一。试图加载格式不正确的程序。“ 以下是我已经尝试过的事情。

  1. 将所有 oracle dll 替换为 32 位 oracle dll,即 2.112.3.0

我在 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

对于上述两个语句,我从 c:\Program Files(x86)\Microsoft sdk\windows\v7.0A\Bin\NETFX4.0 Tools\X64 复制了 gacutil.exe 到 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\临时 ASP.net 文件 我还将 Web 应用程序构建平台目标更改为 X86,最初它位于“任何 CPU”。出于沮丧,我还尝试将平台目标更改为 X64,然后我收到错误消息说

“冷不加载文件或组装.webapp”或其依赖项之一。试图加载格式不正确的程序。

我的计算机上没有安装 IIS,我在 Visual Studio 2010 中运行此应用程序,所以我认为它将使用 Visual Studio 附带的内置 IIS。

我花了很多时间解决这个问题,但仍然一次又一次地遇到同样的错误。

【问题讨论】:

标签: visual-studio-2010 iis oracle11g


【解决方案1】:

试试这个:打开 IIS 管理器,更改应用程序池的高级设置,将启用 32 位应用程序更改为 false。

【讨论】:

  • 我的默认值为 false,当我将其设置为 true 时,依赖性问题消失了
  • 我需要 32 位,所以我将我的设置为 True,回收了应用程序池,这对我有用。
  • 我需要停止/启动我的应用程序池。
  • 这对我有用...让我抓狂的是,微软在过渡到 64 位世界时采用了这种半进半出的策略...
【解决方案2】:

我通过以下步骤找到了解决方案:

  • 删除Oracle.DataAcces.dll引用,
    并添加一个新的参考:
    C:\windows\assembly\GAC\Oracle.DataAccess\X.XXX.X.XX__89b483f429c47342/oracle.dataaccess.dll
  • 制作本地副本=false。

希望对你有帮助

【讨论】:

  • 我在 GAC 文件夹中没有 Oracle.DataAccess 文件夹(但在 GAC32 和 GAC64 中)。
  • 我也是。我用的是win 8.1,C:\windows\assembly中没有GAC文件夹
  • .NET Framework 3.5/4.5 GAC 中的@RDeveloper 位于 C:\Windows\Microsoft.NET\assembly\GAC_32 或 C:\Windows\Microsoft.NET\assembly\GAC_64 下
  • 它有助于删除和添加对 Oracle.DataAccess 的引用(不是来自 GAC)
【解决方案3】:

您可能需要在 AppPool 中启用 32 位应用程序。 转到> IIS中的“应用程序池”=>右键单击您的应用程序池=>高级设置=>“启用 32 位应用程序”为真。

请不要忘记重新启动您的应用程序池以及指向该应用程序池的相应应用程序。

【讨论】:

    【解决方案4】:

    如果您使用的是 IIS Express 和 VS 2017:

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

    【讨论】:

    • 在 VS 2019 中同样适用于我,以防其他人发现它有用。
    【解决方案5】:

    当我从一台机器移动到另一台机器并重新安装所有内容时,再次遇到问题。就我而言,我同时使用 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。

    我在 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 是一只快乐的小兔子,为我重新编译了一切。

    【讨论】:

    • 我在 C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools 中找到了 gacutil,因为它不在我的 12.2 的 oracle 文件夹中
    • 切换 32 位或 64 位 DLL 有效。很难分辨哪个是哪个(来自 explorer 或 cmd),但从 `c:\oracle\product\*\(x32 or x64)\ODP.NET\bin\*\` 文件夹中获取(其他)DLL似乎是在 32/64 之间切换并解决此错误的可靠方法。
    【解决方案6】:

    在我的情况下,以下解决了问题:

    1. 下载“32 位 Oracle 数据访问组件 (ODAC) 使用 Oracle Developer Tools for Visual Studio”来自http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html
    2. 然后通过浏览文件位置或仅从.NET 选项卡中的引用列表将引用oracle.dataaccess.dll 添加到bin 文件。

    【讨论】:

    • 这种方式也适用于同样的问题,谢谢
    【解决方案7】:

    我在使用 Oracle.DataAccess 时遇到了同样的错误,但部署到 Azure 网站 (azurewebsites.net)。对我来说,在发布到 Azure 之前,我必须在 VS.NET 2019 中编辑一个设置。我勾选了Tools > Options > Projects and Solutions > Web Projects 下的“为网站和项目使用 64 位版本的 IIS Express”复选框。

    【讨论】:

      【解决方案8】:

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

      然后解决“Could not load file or assembly 'Oracle.DataAccess'”的问题:

      • 在本地 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 并在服务器上再次发布,它可以工作。

      【讨论】:

      • 你可能有一个很好的提示,但我不明白你想说什么,尤其是最后一点
      【解决方案9】:

      您还可以从64-bit Oracle Data Access Components (ODAC) Downloads 下载并执行“ODAC112030Xcopy.zip”中的 install.bat 文件。这解决了我的问题。

      【讨论】:

        【解决方案10】:

        对我来说,其他一切都差不多,但不知何故,我的项目设置发生了变化,并且使用 iisExpress 而不是 IISLocal。当我更改并指向虚拟目录(在 IISLocal 中)时,它再次完美地工作。

        【讨论】:

          【解决方案11】:

          我需要 64 位版本的 oracle.dataaccess.dll,但这会导致我使用的其他库出现问题。

          [BadImageFormatException:无法加载文件或程序集“Oracle.DataAccess”或其依赖项之一。试图加载格式不正确的程序。]

          我遵循了上面的几个步骤。将在项目池上进行高级设置以切换允许 32 位工作,但我不满足于这样,所以我重新打开它。

          我的项目也有依赖于 Elmahlog4net 引用的引用。 我下载了这些的最新版本,我的项目能够正常构建和运行,而不会弄乱池的允许 32 位设置。

          【讨论】:

            【解决方案12】:

            我遇到了同样的问题,并通过将旧的 Oracle.DataAccess.dll 替换为新的 Oracle.DataAccess.dll(安装时带有 oracle 客户端)来解决

            在我的例子中,新 Oracle.DataAccess.dll 的路径是

            • E:\app\Rehman.Rashid\product\11.2.0\client_1\ODP.NET\bin

            【讨论】:

              【解决方案13】:

              在我的情况下,我有一个控制台应用程序,我只是在 Build projet 属性选项卡上取消选中 Prefer 32-bit,然后将其添加到我的 app.config:

              <runtime>
                      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                          <dependentAssembly>
                              <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
                              <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="2.112.1.0" />
                          </dependentAssembly>
                      </assemblyBinding>
                  </runtime>
              

              【讨论】:

                猜你喜欢
                • 2021-12-12
                • 2012-01-14
                • 1970-01-01
                相关资源
                最近更新 更多