【问题标题】:Getting missing dependency error for 'Oracle.DataAccess' when deploying on IIS 64 Bit Server在 IIS 64 位服务器上部署时出现“Oracle.DataAccess”缺少依赖项错误
【发布时间】:2019-10-25 21:16:05
【问题描述】:

我是 .Net 的新手。我创建了一个连接到数据库并执行一些事务的代码。对于数据访问管理器,我添加了参考 Oracle.DataAccess.86 (Oracle.DataAccess.dll) 并在本地使用“任何 CPU”运行。它工作正常。但是当我将它部署在运行 64 位 IIS 的服务器上时,它给了我以下错误:

无法加载文件或程序集“Oracle.DataAccess”或其依赖项之一。试图加载格式不正确的程序。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.BadImageFormatException:无法加载文件或程序集“Oracle.DataAccess”或其依赖项之一。试图加载格式不正确的程序。

[BadImageFormatException:无法加载文件或程序集“Oracle.DataAccess”或其依赖项之一。试图加载格式不正确的程序。] System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0 System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,证据 assemblySecurity,RuntimeAssembly reqAssembly,StackCrawlMark 和 stackMark,IntPtr pPrivHostBinder,布尔 throwOnFileNotFound,布尔 forIntrospection,布尔 suppressSecurityChecks)+225 System.Reflection.RuntimeAssembly.InternalLoad(字符串 assemblyString,证据 assemblySecurity,StackCrawlMark 和 stackMark,IntPtr pPrivHostBinder,Boolean forIntrospection)+110 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean for Introspection) +22 System.Reflection.Assembly.Load(String assemblyString) +34 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +48

如何找到解决此错误的方法?

【问题讨论】:

  • 检查这个问题。这听起来像是一个可能的解决方案...stackoverflow.com/questions/1707101/…
  • @WernfriedDomscheit 他们所要做的就是将 AppPool 设置为作为 32 位应用程序运行,它会排除答案,但他们不会。如果项目中包含必备程序集,则他们不需要 ODP.Net 安装,但这完全是另一个问题。在 OP 回答提出的问题并对提出的建议做出相应回应之前,一切都是纯粹的猜测。

标签: c# .net oracle odp.net data-access


【解决方案1】:

如果 IIS 是 64 位的,那么您还需要 64 位版本的 Oracle.DataAccess.dll。我假设您的服务器上根本没有安装 Oracle.DataAccess,请验证安装是否正确。注意,Oracle.DataAccess.dll 需要一个 Oracle 客户端(通常是 Oracle 实例客户端),这也必须与 Oracle.DataAccess.dll 的架构相同。

对 Oracle.DataAccess.dll 的引用是相同的。该应用程序(在您的情况下为 IIS)将自动加载正确的程序集 - 只要它已安装并在机器上可用。您可以删除项目文件中的processorArchitecture=x86 属性,您可以分别编辑*.csproj*.vbproj 使用文本编辑器手动归档。

【讨论】:

  • 你确定知道吗?应用程序池可以作为 32 位进程运行,因此不需要(或使用)64 位程序集。请查看我在问题下发布的链接以获取此示例。
  • 请告诉我需要为 64 位版本的 Oracle.DataAccess.dll 添加的参考资料。有人告诉我,没有 64 位的 Oracle.DataAccess.dll。我会确认安装正确。
  • 嗨@Archer,检查了那个链接。但我需要将它作为 64 位进程运行。这是要求的一部分。
  • @Ashutosh 为什么它是要求的一部分?如果不可能,则要求无效。
【解决方案2】:

您的问题是错误的 Oracle DLL 被加载到内存中

如果您将程序集构建到 AnyCPU...

要求以 x64 运行 - 已安装 Oracle Client x64,已部署 Oracle.DataAccess.dll x64,AppPool 设置为 "run 32 bit" = false

要求以 x86 方式运行 - 已安装 Oracle Client x86,已部署 Oracle.DataAccess.dll x86,AppPool 设置为 "run 32 bit" = true

但是你为什么会在 2019 年使用 Oracle.DataAccess.dll?使用Oracle.ManagedDataAccess.dll。安装一小组连接组件 (ODAC),不需要 Oracle 客户端 x64/x86 - 所有这些都将作为 AnyCPU 完成。更好的是,为 Visual Studio 安装 Oracle 开发工具,其中将包括 ODAC

【讨论】:

    猜你喜欢
    • 2021-02-27
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 2016-10-19
    相关资源
    最近更新 更多