【问题标题】:AnyCPu vs ODP.NETAnyCPU 与 ODP.NET
【发布时间】:2017-05-15 15:47:33
【问题描述】:

我的配置:Vs2015 / X64 PC / ODP.NET X86

我在“任何 Cpu”模式下编写了一些 DLL,我想编写使用这些 DLL 并且可以在 X64 和 X86 机器上运行的程序。

但我在我的 Dll 中引用了“Oracle.DataAccess.dll”,然后在 Oracle DLL 上出现警告“ProcessorArchitecture=X86”。

我该怎么办(如果需要,我可以安装 ODP.NET X64)?

谢谢

【问题讨论】:

  • 尝试为 X86 编译。 X64 应该能够读取 X86,但 X86 不能读取 X64。

标签: c# oracle x86 64-bit anycpu


【解决方案1】:

当您使用“x86”编译 DLL 时,Oracle.DataAccess.dll 必须是 x86 版本(即 32 位版本)

当您使用“x64”编译 DLL 时,Oracle.DataAccess.dll 必须是 x64 版本(即 64 位版本)

取决于“AnyCPU”,Oracle.DataAccess.dll 没有“AnyCPU”版本。如果您的应用程序在 64 位 Windows 上运行,它将作为 x64 进程运行 - 因此Oracle.DataAccess.dll 也必须是 x64 版本。如果您的应用程序在 32 位 Windows 上运行,它将作为 x86 进程运行 - 因此Oracle.DataAccess.dll 也必须是 x86 版本。

长话短说:Oracle.DataAccess.dll 的架构必须与应用程序相同,即您的 DLL。

按照此说明并行运行两者: BadImageFormatException. This will occur when running in 64 bit mode with the 32 bit Oracle client components installed

更新

在您的*.csproj,分别。 *.vbproj 编辑您对 ODP.NET 的引用,如下所示:

<Reference Include="Oracle.DataAccess">
  <SpecificVersion>False</SpecificVersion>
  <Private>False</Private>
</Reference>

Version=...processorArchitecture=... 等属性不是必需的。您的应用程序将根据所选架构和目标 .NET 框架加载正确的 Oracle.DataAccess.dll(前提是已正确安装)

【讨论】:

  • 在我的开发PC上,在VS2015中,我必须在项目引用上添加Oracle DLL。然后我必须选择一个 Oracle DLL。那么我必须在 x86 或 X64 DLL 之间做出选择吗?
  • 我按照说明安装 X86 和 X64 Oracle 客户端。看起来不错。我在我的项目中添加了 Oracle.DataAccess 引用并修改了“.csproj”。当我在 X86 或 X64 中编译时没问题,但如果我使用“任何 CPU”,我会发出警告 =>““MSIL”生成项目的处理器架构与参考处理器架构“Oracle.DataAccess”之间存在差异, “AMD64”。这种差异可能会导致运行时问题......'
  • “AnyCPU”是个问题,因为没有“AnyCPU”版本的Oracle.DataAccess.dll。在不知道客户 Windows 版本(32/64 位)的情况下,您无法确定。在我的应用程序中,我同时编译了两个版本:&lt;Target Name="AfterBuild"&gt; &lt;MSBuild Condition="'$(Platform)' == 'AnyCPU'" Projects="$(MSBuildProjectFile)" Properties="Platform=x64;PlatFormTarget=x64" RunEachTargetSeparately="true" /&gt; &lt;MSBuild Condition="'$(Platform)' == 'AnyCPU'" Projects="$(MSBuildProjectFile)" Properties="Platform=x86;PlatFormTarget=x86" RunEachTargetSeparately="true" /&gt; &lt;/Target&gt;
  • 最后我决定在 X64 中工作(因为“AnuCpu”不能与 Oracle 一起工作)。不幸的是,我刚刚意识到我不能在 Visual Studio 中使用在 X64 中编译的 UserControls(这些 UserControls 引用 Oracle DLL)。这意味着就我而言,我必须留在 X86 中?
【解决方案2】:

最简单的解决方案是针对 x86 - 64 位操作系统仍然可以加载和运行 32 位应用程序,因此这意味着您的应用程序可以在 x86 和 x64 机器上运行。

缺点是您的应用必须作为 32 位进程运行,即您的进程将拥有 4GB 的最大地址空间并且不能加载 64 位程序集。如果您尝试在 64 位进程中加载​​ dll(例如,因为 IIS 尚未配置为使用 32 位应用程序池),您将收到 BadImageFormatException

如果您不能接受,那么您可以尝试检测进程版本并动态加载正确的程序集as per this Stack Overflow answer

【讨论】:

    【解决方案3】:

    上面提到的所有解决方案都是正确的,但我只是觉得有必要提及 Oracle.ManagedDataAcces,因为它不关心位数是多少。

    【讨论】:

      猜你喜欢
      • 2013-02-08
      • 1970-01-01
      • 2011-05-17
      • 2017-03-22
      • 1970-01-01
      • 2015-10-25
      • 2015-04-30
      • 2012-05-11
      • 1970-01-01
      相关资源
      最近更新 更多